You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
281 lines
12 KiB
281 lines
12 KiB
--- ../src-base/minecraft/net/minecraft/entity/item/EntityItem.java |
|
+++ ../src-work/minecraft/net/minecraft/entity/item/EntityItem.java |
|
@@ -22,6 +22,11 @@ |
|
import cpw.mods.fml.common.FMLCommonHandler; |
|
import cpw.mods.fml.common.eventhandler.Event.Result; |
|
|
|
+// CraftBukkit start |
|
+import org.bukkit.event.player.PlayerPickupItemEvent; |
|
+import net.minecraft.server.MinecraftServer; |
|
+// CraftBukkit end |
|
+ |
|
public class EntityItem extends Entity |
|
{ |
|
private static final Logger logger = LogManager.getLogger(); |
|
@@ -31,6 +36,7 @@ |
|
private String field_145801_f; |
|
private String field_145802_g; |
|
public float hoverStart; |
|
+ private int lastTick = MinecraftServer.currentTick; // CraftBukkit |
|
private static final String __OBFID = "CL_00001669"; |
|
|
|
/** |
|
@@ -55,6 +61,15 @@ |
|
public EntityItem(World p_i1710_1_, double p_i1710_2_, double p_i1710_4_, double p_i1710_6_, ItemStack p_i1710_8_) |
|
{ |
|
this(p_i1710_1_, p_i1710_2_, p_i1710_4_, p_i1710_6_); |
|
+ |
|
+ // CraftBukkit start - Can't set null items in the datawatcher |
|
+ if (p_i1710_8_ == null || p_i1710_8_.getItem() == null) |
|
+ { |
|
+ return; |
|
+ } |
|
+ |
|
+ // CraftBukkit end |
|
+ |
|
this.setEntityItemStack(p_i1710_8_); |
|
this.lifespan = (p_i1710_8_.getItem() == null ? 6000 : p_i1710_8_.getItem().getEntityLifespan(p_i1710_8_, p_i1710_1_)); |
|
} |
|
@@ -89,93 +104,103 @@ |
|
} |
|
} |
|
|
|
- if (this.getEntityItem() == null) |
|
- { |
|
- this.setDead(); |
|
+ super.onUpdate(); |
|
+ // CraftBukkit start - Use wall time for pickup and despawn timers |
|
+ int elapsedTicks = MinecraftServer.currentTick - this.lastTick; |
|
+ this.delayBeforeCanPickup -= elapsedTicks; |
|
+ if (this.delayBeforeCanPickup < 0) this.delayBeforeCanPickup = 0; // Cauldron |
|
+ this.age += elapsedTicks; |
|
+ this.lastTick = MinecraftServer.currentTick; |
|
+ // CraftBukkit end |
|
+ |
|
+ boolean forceUpdate = this.ticksExisted > 0 && this.ticksExisted % 25 == 0; // Cauldron - optimize item tick updates |
|
+ this.prevPosX = this.posX; |
|
+ this.prevPosY = this.posY; |
|
+ this.prevPosZ = this.posZ; |
|
+ this.motionY -= 0.03999999910593033D; |
|
+ // Cauldron start - if forced |
|
+ if (forceUpdate || noClip) { |
|
+ this.noClip = this.func_145771_j(this.posX, (this.boundingBox.minY + this.boundingBox.maxY) / 2.0D, this.posZ); |
|
} |
|
- else |
|
- { |
|
- super.onUpdate(); |
|
+ // Cauldron end |
|
+ this.moveEntity(this.motionX, this.motionY, this.motionZ); |
|
+ boolean flag = (int)this.prevPosX != (int)this.posX || (int)this.prevPosY != (int)this.posY || (int)this.prevPosZ != (int)this.posZ; |
|
|
|
- if (this.delayBeforeCanPickup > 0) |
|
+ if ((flag && this.ticksExisted % 5 == 0) || forceUpdate) // Cauldron - if forced |
|
+ { |
|
+ if (this.worldObj.getBlock(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.posY), MathHelper.floor_double(this.posZ)).getMaterial() == Material.lava) |
|
{ |
|
- --this.delayBeforeCanPickup; |
|
+ this.motionY = 0.20000000298023224D; |
|
+ this.motionX = (double)((this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F); |
|
+ this.motionZ = (double)((this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F); |
|
+ this.playSound("random.fizz", 0.4F, 2.0F + this.rand.nextFloat() * 0.4F); |
|
} |
|
|
|
- this.prevPosX = this.posX; |
|
- this.prevPosY = this.posY; |
|
- this.prevPosZ = this.posZ; |
|
- this.motionY -= 0.03999999910593033D; |
|
- this.noClip = this.func_145771_j(this.posX, (this.boundingBox.minY + this.boundingBox.maxY) / 2.0D, this.posZ); |
|
- this.moveEntity(this.motionX, this.motionY, this.motionZ); |
|
- boolean flag = (int)this.prevPosX != (int)this.posX || (int)this.prevPosY != (int)this.posY || (int)this.prevPosZ != (int)this.posZ; |
|
- |
|
- if (flag || this.ticksExisted % 25 == 0) |
|
+ if (forceUpdate && !this.worldObj.isRemote) // Cauldron - if forced |
|
{ |
|
- if (this.worldObj.getBlock(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.posY), MathHelper.floor_double(this.posZ)).getMaterial() == Material.lava) |
|
- { |
|
- this.motionY = 0.20000000298023224D; |
|
- this.motionX = (double)((this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F); |
|
- this.motionZ = (double)((this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F); |
|
- this.playSound("random.fizz", 0.4F, 2.0F + this.rand.nextFloat() * 0.4F); |
|
- } |
|
- |
|
- if (!this.worldObj.isRemote) |
|
- { |
|
- this.searchForOtherItemsNearby(); |
|
- } |
|
+ this.searchForOtherItemsNearby(); |
|
} |
|
+ } |
|
|
|
- float f = 0.98F; |
|
+ float f = 0.98F; |
|
|
|
- if (this.onGround) |
|
- { |
|
- f = this.worldObj.getBlock(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.boundingBox.minY) - 1, MathHelper.floor_double(this.posZ)).slipperiness * 0.98F; |
|
- } |
|
+ if (this.onGround) |
|
+ { |
|
+ f = this.worldObj.getBlock(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.boundingBox.minY) - 1, MathHelper.floor_double(this.posZ)).slipperiness * 0.98F; |
|
+ } |
|
|
|
- this.motionX *= (double)f; |
|
- this.motionY *= 0.9800000190734863D; |
|
- this.motionZ *= (double)f; |
|
+ this.motionX *= (double)f; |
|
+ this.motionY *= 0.9800000190734863D; |
|
+ this.motionZ *= (double)f; |
|
|
|
- if (this.onGround) |
|
- { |
|
- this.motionY *= -0.5D; |
|
- } |
|
+ if (this.onGround) |
|
+ { |
|
+ this.motionY *= -0.5D; |
|
+ } |
|
|
|
- ++this.age; |
|
+ // ++this.age; // CraftBukkit - Moved up (base age on wall time) |
|
|
|
- ItemStack item = getDataWatcher().getWatchableObjectItemStack(10); |
|
- |
|
- if (!this.worldObj.isRemote && this.age >= lifespan) |
|
+ ItemStack item = getDataWatcher().getWatchableObjectItemStack(10); |
|
+ |
|
+ if (!this.worldObj.isRemote && this.age >= lifespan - 1) // Cauldron adjust for age being off by one when it is first dropped |
|
+ { |
|
+ // CraftBukkit start |
|
+ if (org.bukkit.craftbukkit.event.CraftEventFactory.callItemDespawnEvent(this).isCancelled()) |
|
{ |
|
- if (item != null) |
|
- { |
|
- ItemExpireEvent event = new ItemExpireEvent(this, (item.getItem() == null ? 6000 : item.getItem().getEntityLifespan(item, worldObj))); |
|
- if (MinecraftForge.EVENT_BUS.post(event)) |
|
- { |
|
- lifespan += event.extraLife; |
|
- } |
|
- else |
|
- { |
|
- this.setDead(); |
|
- } |
|
+ this.age = 0; |
|
+ return; |
|
+ } |
|
+ // CraftBukkit end |
|
+ if (item != null) |
|
+ { |
|
+ ItemExpireEvent event = new ItemExpireEvent(this, (item.getItem() == null ? this.worldObj.getSpigotConfig().itemDespawnRate : item.getItem().getEntityLifespan(item, worldObj))); // Spigot // Cauldron |
|
+ if (MinecraftForge.EVENT_BUS.post(event)) |
|
+ { |
|
+ lifespan += event.extraLife; |
|
} |
|
else |
|
{ |
|
this.setDead(); |
|
} |
|
} |
|
- |
|
- if (item != null && item.stackSize <= 0) |
|
+ else |
|
{ |
|
this.setDead(); |
|
} |
|
} |
|
+ |
|
+ if (item != null && item.stackSize <= 0) |
|
+ { |
|
+ this.setDead(); |
|
+ } |
|
} |
|
|
|
private void searchForOtherItemsNearby() |
|
{ |
|
- Iterator iterator = this.worldObj.getEntitiesWithinAABB(EntityItem.class, this.boundingBox.expand(0.5D, 0.0D, 0.5D)).iterator(); |
|
+ // Spigot start |
|
+ double radius = worldObj.getSpigotConfig().itemMerge; // Cauldron |
|
+ Iterator iterator = this.worldObj.getEntitiesWithinAABB(EntityItem.class, this.boundingBox.expand(radius, radius, radius)).iterator(); |
|
+ // Spigot end |
|
|
|
while (iterator.hasNext()) |
|
{ |
|
@@ -225,11 +250,13 @@ |
|
} |
|
else |
|
{ |
|
- itemstack1.stackSize += itemstack.stackSize; |
|
- p_70289_1_.delayBeforeCanPickup = Math.max(p_70289_1_.delayBeforeCanPickup, this.delayBeforeCanPickup); |
|
- p_70289_1_.age = Math.min(p_70289_1_.age, this.age); |
|
- p_70289_1_.setEntityItemStack(itemstack1); |
|
- this.setDead(); |
|
+ // Spigot start |
|
+ itemstack.stackSize += itemstack1.stackSize; |
|
+ this.delayBeforeCanPickup = Math.max(p_70289_1_.delayBeforeCanPickup, this.delayBeforeCanPickup); |
|
+ this.age = Math.min(p_70289_1_.age, this.age); |
|
+ this.setEntityItemStack(itemstack); |
|
+ p_70289_1_.setDead(); |
|
+ // Spigot end |
|
return true; |
|
} |
|
} |
|
@@ -316,8 +343,27 @@ |
|
} |
|
|
|
NBTTagCompound nbttagcompound1 = p_70037_1_.getCompoundTag("Item"); |
|
- this.setEntityItemStack(ItemStack.loadItemStackFromNBT(nbttagcompound1)); |
|
|
|
+ // CraftBukkit start |
|
+ if (nbttagcompound1 != null) |
|
+ { |
|
+ ItemStack itemstack = ItemStack.loadItemStackFromNBT(nbttagcompound1); |
|
+ |
|
+ if (itemstack != null) |
|
+ { |
|
+ this.setEntityItemStack(itemstack); |
|
+ } |
|
+ else |
|
+ { |
|
+ this.setDead(); |
|
+ } |
|
+ } |
|
+ else |
|
+ { |
|
+ this.setDead(); |
|
+ } |
|
+ |
|
+ // CraftBukkit end |
|
ItemStack item = getDataWatcher().getWatchableObjectItemStack(10); |
|
|
|
if (item == null || item.stackSize <= 0) |
|
@@ -350,6 +396,31 @@ |
|
ItemStack itemstack = this.getEntityItem(); |
|
int i = itemstack.stackSize; |
|
|
|
+ // CraftBukkit start |
|
+ int canHold = p_70100_1_.inventory.canHold(itemstack); |
|
+ int remaining = itemstack.stackSize - canHold; |
|
+ |
|
+ if (this.delayBeforeCanPickup <= 0 && canHold > 0) |
|
+ { |
|
+ itemstack.stackSize = canHold; |
|
+ // Cauldron start - rename to cbEvent to fix naming collision |
|
+ PlayerPickupItemEvent cbEvent = new PlayerPickupItemEvent((org.bukkit.entity.Player) p_70100_1_.getBukkitEntity(), (org.bukkit.entity.Item) this.getBukkitEntity(), remaining); |
|
+ //cbEvent.setCancelled(!par1EntityPlayer.canPickUpLoot); TODO |
|
+ this.worldObj.getServer().getPluginManager().callEvent(cbEvent); |
|
+ itemstack.stackSize = canHold + remaining; |
|
+ |
|
+ if (cbEvent.isCancelled()) |
|
+ { |
|
+ return; |
|
+ } |
|
+ // Cauldron end |
|
+ |
|
+ // Possibly < 0; fix here so we do not have to modify code below |
|
+ this.delayBeforeCanPickup = 0; |
|
+ } |
|
+ |
|
+ // CraftBukkit end |
|
+ |
|
if (this.delayBeforeCanPickup <= 0 && (this.field_145802_g == null || lifespan - this.age <= 200 || this.field_145802_g.equals(p_70100_1_.getCommandSenderName())) && (event.getResult() == Result.ALLOW || i <= 0 || p_70100_1_.inventory.addItemStackToInventory(itemstack))) |
|
{ |
|
if (itemstack.getItem() == Item.getItemFromBlock(Blocks.log))
|
|
|