Files

290 lines
12 KiB
Diff

--- ../src-base/minecraft/net/minecraft/entity/item/EntityItem.java
+++ ../src-work/minecraft/net/minecraft/entity/item/EntityItem.java
@@ -13,6 +13,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.StatList;
import net.minecraft.util.DamageSource;
import net.minecraft.util.datafix.DataFixer;
@@ -26,18 +27,27 @@
import net.minecraftforge.fml.relauncher.SideOnly;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
+import org.bukkit.event.entity.EntityPickupItemEvent;
+import org.bukkit.event.player.PlayerPickupItemEvent;
public class EntityItem extends Entity
{
private static final Logger LOGGER = LogManager.getLogger();
private static final DataParameter<ItemStack> ITEM = EntityDataManager.<ItemStack>createKey(EntityItem.class, DataSerializers.ITEM_STACK);
private int age;
- private int pickupDelay;
+ public int pickupDelay;
private int health;
private String thrower;
private String owner;
public float hoverStart;
+ /**
+ * The maximum age of this EntityItem. The item is expired once this is reached.
+ */
+ public int lifespan = 6000;
+
+ private int lastTick = catserver.server.CatServer.getCurrentTick() - 1; // CatServer - implement realtime
+
public EntityItem(World worldIn, double x, double y, double z)
{
super(worldIn);
@@ -55,6 +65,7 @@
{
this(worldIn, x, y, z);
this.setItem(stack);
+ this.lifespan = (stack.getItem() == null ? world.spigotConfig.itemDespawnRate : stack.getItem().getEntityLifespan(stack, worldIn)); // Spigot
}
protected boolean canTriggerWalking()
@@ -78,6 +89,7 @@
public void onUpdate()
{
+ if (getItem().getItem().onEntityItemUpdate(this)) return;
if (this.getItem().isEmpty())
{
this.setDead();
@@ -86,10 +98,15 @@
{
super.onUpdate();
- if (this.pickupDelay > 0 && this.pickupDelay != 32767)
- {
- --this.pickupDelay;
- }
+ // if (this.pickupDelay > 0 && this.pickupDelay != 32767){
+ // --this.pickupDelay;
+ // }
+ // CraftBukkit start - Use wall time for pickup and despawn timers
+ int elapsedTicks = catserver.server.CatServer.getCurrentTick() - this.lastTick; // CatServer - implement realtime
+ if (this.pickupDelay != 32767) this.pickupDelay -= elapsedTicks;
+ if (this.age != -32768) this.age += elapsedTicks;
+ this.lastTick = catserver.server.CatServer.getCurrentTick(); // CatServer - implement realtime
+ // CraftBukkit end
this.prevPosX = this.posX;
this.prevPosY = this.posY;
@@ -135,7 +152,9 @@
if (this.onGround)
{
- f = this.world.getBlockState(new BlockPos(MathHelper.floor(this.posX), MathHelper.floor(this.getEntityBoundingBox().minY) - 1, MathHelper.floor(this.posZ))).getBlock().slipperiness * 0.98F;
+ BlockPos underPos = new BlockPos(MathHelper.floor(this.posX), MathHelper.floor(this.getEntityBoundingBox().minY) - 1, MathHelper.floor(this.posZ));
+ net.minecraft.block.state.IBlockState underState = this.world.getBlockState(underPos);
+ f = underState.getBlock().getSlipperiness(underState, this.world, underPos, this) * 0.98F;
}
this.motionX *= (double)f;
@@ -147,10 +166,12 @@
this.motionY *= -0.5D;
}
+ /* Craftbukkit start - moved up
if (this.age != -32768)
{
++this.age;
}
+ */
this.handleWaterMovement();
@@ -167,16 +188,53 @@
}
}
- if (!this.world.isRemote && this.age >= 6000)
+ ItemStack item = this.getItem();
+
+ if (!this.world.isRemote && this.age >= lifespan)
{
+ if (org.bukkit.craftbukkit.event.CraftEventFactory.callItemDespawnEvent(this).isCancelled()) {
+ this.age = 0;
+ return;
+ }
+ int hook = net.minecraftforge.event.ForgeEventFactory.onItemExpire(this, item);
+ if (hook < 0) this.setDead();
+ else this.lifespan += hook;
+ }
+ if (item.isEmpty())
+ {
this.setDead();
}
}
}
+ // Spigot start - copied from above
+ @Override
+ public void inactiveTick() {
+ // CraftBukkit start - Use wall time for pickup and despawn timers
+ int elapsedTicks = catserver.server.CatServer.getCurrentTick() - this.lastTick; // CatServer - implement realtime
+ if (this.pickupDelay != 32767) this.pickupDelay -= elapsedTicks;
+ if (this.age != -32768) this.age += elapsedTicks;
+ this.lastTick = catserver.server.CatServer.getCurrentTick(); // CatServer - implement realtime
+ // CraftBukkit end
+
+ if (!this.world.isRemote && this.age >= world.spigotConfig.itemDespawnRate) { // Spigot
+ // CraftBukkit start - fire ItemDespawnEvent
+ if (org.bukkit.craftbukkit.event.CraftEventFactory.callItemDespawnEvent(this).isCancelled()) {
+ this.age = 0;
+ return;
+ }
+ // CraftBukkit end
+ this.setDead();
+ }
+ }
+ // Spigot end
+
private void searchForOtherItemsNearby()
{
- for (EntityItem entityitem : this.world.getEntitiesWithinAABB(EntityItem.class, this.getEntityBoundingBox().grow(0.5D, 0.0D, 0.5D)))
+ // Spigot start
+ double radius = world.spigotConfig.itemMerge;
+ for (EntityItem entityitem : this.world.getEntitiesWithinAABB(EntityItem.class, this.getEntityBoundingBox().grow(radius, radius, radius)))
+ // Spigot end
{
this.combineItems(entityitem);
}
@@ -225,13 +283,20 @@
{
return false;
}
+ else if (!itemstack.areCapsCompatible(itemstack1))
+ {
+ return false;
+ }
else
{
- itemstack1.grow(itemstack.getCount());
- other.pickupDelay = Math.max(other.pickupDelay, this.pickupDelay);
- other.age = Math.min(other.age, this.age);
- other.setItem(itemstack1);
- this.setDead();
+ // Spigot start
+ if (org.bukkit.craftbukkit.event.CraftEventFactory.callItemMergeEvent(other, this).isCancelled()) return false;
+ itemstack.grow(itemstack1.getCount());
+ this.pickupDelay = Math.max(other.pickupDelay, this.pickupDelay);
+ this.age = Math.min(other.age, this.age);
+ this.setItem(itemstack);
+ other.setDead();
+ // Spigot end
return true;
}
}
@@ -282,6 +347,7 @@
public boolean attackEntityFrom(DamageSource source, float amount)
{
+ if (this.world.isRemote || this.isDead) return false; //Forge: Fixes MC-53850
if (this.isEntityInvulnerable(source))
{
return false;
@@ -292,6 +358,9 @@
}
else
{
+ if (org.bukkit.craftbukkit.event.CraftEventFactory.handleNonLivingEntityDamageEvent(this, source, amount)) {
+ return false;
+ }
this.markVelocityChanged();
this.health = (int)((float)this.health - amount);
@@ -314,6 +383,7 @@
compound.setShort("Health", (short)this.health);
compound.setShort("Age", (short)this.age);
compound.setShort("PickupDelay", (short)this.pickupDelay);
+ compound.setInteger("Lifespan", lifespan);
if (this.getThrower() != null)
{
@@ -358,22 +428,59 @@
{
this.setDead();
}
+ if (compound.hasKey("Lifespan")) lifespan = compound.getInteger("Lifespan");
}
public void onCollideWithPlayer(EntityPlayer entityIn)
{
if (!this.world.isRemote)
{
+ if (this.pickupDelay > 0) return;
ItemStack itemstack = this.getItem();
Item item = itemstack.getItem();
int i = itemstack.getCount();
- if (this.pickupDelay == 0 && (this.owner == null || 6000 - this.age <= 200 || this.owner.equals(entityIn.getName())) && entityIn.inventory.addItemStackToInventory(itemstack))
+ // CraftBukkit start - fire PlayerPickupItemEvent
+ int canHold = entityIn.inventory.canHold(itemstack);
+ int remaining = i - canHold;
+
+ if (this.pickupDelay <= 0 && canHold > 0) {
+ itemstack.setCount(canHold);
+ // Call legacy event
+ PlayerPickupItemEvent playerEvent = new PlayerPickupItemEvent((org.bukkit.entity.Player) entityIn.getBukkitEntity(), (org.bukkit.entity.Item) this.getBukkitEntity(), remaining);
+ playerEvent.setCancelled(!entityIn.canPickUpLoot);
+ this.world.getServer().getPluginManager().callEvent(playerEvent);
+ if (playerEvent.isCancelled()) {
+ return;
+ }
+
+ // Call newer event afterwards
+ EntityPickupItemEvent entityEvent = new EntityPickupItemEvent((org.bukkit.entity.Player) entityIn.getBukkitEntity(), (org.bukkit.entity.Item) this.getBukkitEntity(), remaining);
+ entityEvent.setCancelled(!entityIn.canPickUpLoot);
+ this.world.getServer().getPluginManager().callEvent(entityEvent);
+ if (entityEvent.isCancelled()) {
+ return;
+ }
+
+ itemstack.setCount(canHold + remaining);
+
+ // Possibly < 0; fix here so we do not have to modify code below
+ this.pickupDelay = 0;
+ }
+ // CraftBukkit end
+
+ int hook = net.minecraftforge.event.ForgeEventFactory.onItemPickup(this, entityIn);
+ if (hook < 0) return;
+ ItemStack clone = itemstack.copy();
+
+ if (this.pickupDelay <= 0 && (this.owner == null || lifespan - this.age <= 200 || this.owner.equals(entityIn.getName())) && (hook == 1 || i <= 0 || entityIn.inventory.addItemStackToInventory(itemstack) || clone.getCount() > this.getItem().getCount()))
{
- entityIn.onItemPickup(this, i);
+ clone.setCount(clone.getCount() - this.getItem().getCount());
+ net.minecraftforge.fml.common.FMLCommonHandler.instance().firePlayerItemPickupEvent(entityIn, this, clone);
if (itemstack.isEmpty())
{
+ entityIn.onItemPickup(this, i);
this.setDead();
itemstack.setCount(i);
}
@@ -394,9 +501,9 @@
}
@Nullable
- public Entity changeDimension(int dimensionIn)
+ public Entity changeDimension(int dimensionIn, net.minecraftforge.common.util.ITeleporter teleporter)
{
- Entity entity = super.changeDimension(dimensionIn);
+ Entity entity = super.changeDimension(dimensionIn, teleporter);
if (!this.world.isRemote && entity instanceof EntityItem)
{
@@ -476,6 +583,6 @@
public void makeFakeItem()
{
this.setInfinitePickupDelay();
- this.age = 5999;
+ this.age = getItem().getItem().getEntityLifespan(getItem(), world) - 1;
}
}