Files
CatServer/patches/net/minecraft/entity/item/EntityItem.java.patch
2018-09-08 11:39:03 +08:00

119 lines
4.9 KiB
Diff

--- ../src-base/minecraft/net/minecraft/entity/item/EntityItem.java
+++ ../src-work/minecraft/net/minecraft/entity/item/EntityItem.java
@@ -14,6 +14,7 @@
import net.minecraft.network.datasync.DataParameter;
import net.minecraft.network.datasync.DataSerializers;
import net.minecraft.network.datasync.EntityDataManager;
+import net.minecraft.server.MinecraftServer;
import net.minecraft.stats.AchievementList;
import net.minecraft.stats.StatList;
import net.minecraft.util.DamageSource;
@@ -29,17 +30,19 @@
import net.minecraftforge.fml.relauncher.SideOnly;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
+import org.bukkit.event.player.PlayerPickupItemEvent;
public class EntityItem extends Entity
{
private static final Logger LOGGER = LogManager.getLogger();
private static final DataParameter<Optional<ItemStack>> ITEM = EntityDataManager.<Optional<ItemStack>>createKey(EntityItem.class, DataSerializers.OPTIONAL_ITEM_STACK);
private int age;
- private int delayBeforeCanPickup;
+ public int delayBeforeCanPickup;
private int health;
private String thrower;
private String owner;
public float hoverStart;
+ private int lastTick = MinecraftServer.currentTick; // CraftBukkit
/**
* The maximum age of this EntityItem. The item is expired once this is reached.
@@ -97,10 +100,12 @@
{
super.onUpdate();
- if (this.delayBeforeCanPickup > 0 && this.delayBeforeCanPickup != 32767)
- {
- --this.delayBeforeCanPickup;
- }
+ // CraftBukkit start - Use wall time for pickup and despawn timers
+ int elapsedTicks = MinecraftServer.currentTick - this.lastTick;
+ if (this.delayBeforeCanPickup != 32767) this.delayBeforeCanPickup -= elapsedTicks;
+ if (this.age != -32768) this.age += elapsedTicks;
+ this.lastTick = MinecraftServer.currentTick;
+ // CraftBukkit end
this.prevPosX = this.posX;
this.prevPosY = this.posY;
@@ -147,10 +152,12 @@
this.motionY *= -0.5D;
}
+ /* Craftbukkit start - moved up
if (this.age != -32768)
{
++this.age;
}
+ // Craftbukkit end */
this.handleWaterMovement();
@@ -158,6 +165,12 @@
if (!this.worldObj.isRemote && this.age >= lifespan)
{
+ // CraftBukkit start - fire ItemDespawnEvent
+ if (org.bukkit.craftbukkit.event.CraftEventFactory.callItemDespawnEvent(this).isCancelled()) {
+ this.age = 0;
+ return;
+ }
+ // CraftBukkit end
int hook = net.minecraftforge.event.ForgeEventFactory.onItemExpire(this, item);
if (hook < 0) this.setDead();
else this.lifespan += hook;
@@ -226,6 +239,7 @@
}
else
{
+ if (org.bukkit.craftbukkit.event.CraftEventFactory.callItemMergeEvent(this, other).isCancelled()) return false; // CraftBukkit
itemstack1.stackSize += itemstack.stackSize;
other.delayBeforeCanPickup = Math.max(other.delayBeforeCanPickup, this.delayBeforeCanPickup);
other.age = Math.min(other.age, this.age);
@@ -291,6 +305,11 @@
}
else
{
+ // CraftBukkit start
+ if (org.bukkit.craftbukkit.event.CraftEventFactory.handleNonLivingEntityDamageEvent(this, source, amount)) {
+ return false;
+ }
+ // CraftBukkit end
this.setBeenAttacked();
this.health = (int)((float)this.health - amount);
@@ -366,6 +385,23 @@
if (this.delayBeforeCanPickup > 0) return;
ItemStack itemstack = this.getEntityItem();
int i = itemstack.stackSize;
+
+ // CraftBukkit start
+ int canHold = entityIn.inventory.canHold(itemstack);
+ int remaining = itemstack.stackSize - canHold;
+ if ((this.delayBeforeCanPickup <= 0) && (canHold > 0))
+ {
+ itemstack.stackSize = canHold;
+ PlayerPickupItemEvent event = new PlayerPickupItemEvent((org.bukkit.entity.Player)entityIn.getBukkitEntity(), (org.bukkit.entity.Item)getBukkitEntity(), remaining);
+
+ this.worldObj.getServer().getPluginManager().callEvent(event);
+ itemstack.stackSize = (canHold + remaining);
+ if (event.isCancelled()) {
+ return;
+ }
+ this.delayBeforeCanPickup = 0;
+ }
+ // CraftBukkit end
int hook = net.minecraftforge.event.ForgeEventFactory.onItemPickup(this, entityIn, itemstack);
if (hook < 0) return;