--- ../src-base/minecraft/net/minecraft/item/ItemStack.java +++ ../src-work/minecraft/net/minecraft/item/ItemStack.java @@ -1,15 +1,18 @@ package net.minecraft.item; -import com.google.common.collect.HashMultimap; -import com.google.common.collect.Multimap; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Iterator; import java.util.List; -import java.util.Random; import java.util.Map.Entry; +import java.util.Random; + +import com.google.common.collect.HashMultimap; +import com.google.common.collect.Multimap; + +import cc.capture.type.CaptureBlock; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; import net.minecraft.enchantment.Enchantment; import net.minecraft.enchantment.EnchantmentDurability; @@ -21,6 +24,7 @@ import net.minecraft.entity.ai.attributes.AttributeModifier; import net.minecraft.entity.item.EntityItemFrame; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; // Spigot import net.minecraft.event.HoverEvent; import net.minecraft.init.Items; import net.minecraft.nbt.NBTBase; @@ -43,7 +47,12 @@ private Item field_151002_e; public NBTTagCompound stackTagCompound; int itemDamage; - private EntityItemFrame itemFrame; + // Cauldron - due to a bug in Gson(https://code.google.com/p/google-gson/issues/detail?id=440), a stackoverflow + // can occur when gson attempts to resolve a field of a class that points to itself. + // As a temporary workaround, we will prevent serialization for this object until the bug is fixed. + // This fixes EE3's serialization of ItemStack. + private transient EntityItemFrame itemFrame; + public static EntityPlayer currentPlayer; // Cauldron - reference to current player calling onItemUse private static final String __OBFID = "CL_00000043"; private cpw.mods.fml.common.registry.RegistryDelegate delegate; @@ -95,6 +104,9 @@ public ItemStack splitStack(int p_77979_1_) { + if(p_77979_1_<=0||p_77979_1_>this.stackSize) + return new ItemStack((Item)null,0,0); + ItemStack itemstack = new ItemStack(this.field_151002_e, p_77979_1_, this.itemDamage); if (this.stackTagCompound != null) @@ -126,12 +138,14 @@ public boolean tryPlaceItemIntoWorld(EntityPlayer p_77943_1_, World p_77943_2_, int p_77943_3_, int p_77943_4_, int p_77943_5_, int p_77943_6_, float p_77943_7_, float p_77943_8_, float p_77943_9_) { if (!p_77943_2_.isRemote) return net.minecraftforge.common.ForgeHooks.onPlaceItemIntoWorld(this, p_77943_1_, p_77943_2_, p_77943_3_, p_77943_4_, p_77943_5_, p_77943_6_, p_77943_7_, p_77943_8_, p_77943_9_); - boolean flag = this.getItem().onItemUse(this, p_77943_1_, p_77943_2_, p_77943_3_, p_77943_4_, p_77943_5_, p_77943_6_, p_77943_7_, p_77943_8_, p_77943_9_); + // Cauldron start - handle all placement events here + boolean flag = this.getItem().onItemUse(this, p_77943_1_, p_77943_2_, p_77943_3_, p_77943_4_, p_77943_5_, p_77943_6_, p_77943_7_, p_77943_8_, p_77943_9_); if (flag) { p_77943_1_.addStat(StatList.objectUseStats[Item.getIdFromItem(this.field_151002_e)], 1); } + // Cauldron end return flag; } @@ -143,7 +157,9 @@ public ItemStack useItemRightClick(World p_77957_1_, EntityPlayer p_77957_2_) { - return this.getItem().onItemRightClick(this, p_77957_1_, p_77957_2_); + CaptureBlock tCapture=p_77957_1_.mCapture.startCapture(p_77957_2_,this); + ItemStack tResult=this.getItem().onItemRightClick(this, p_77957_1_, p_77957_2_); + return !tCapture.endCapture()?this:tResult; } public ItemStack onFoodEaten(World p_77950_1_, EntityPlayer p_77950_2_) @@ -227,8 +243,22 @@ return getItem().getMaxDamage(this); } + // Spigot start + + /** + * Attempts to damage the ItemStack with par1 amount of damage, If the ItemStack has the Unbreaking enchantment + * there is a chance for each point of damage to be negated. Returns true if it takes more damage than + * getMaxDamage(). Returns false otherwise or if the ItemStack can't be damaged or if all points of damage are + * negated. + */ public boolean attemptDamageItem(int p_96631_1_, Random p_96631_2_) { + return isDamaged(p_96631_1_, p_96631_2_, null); + } + + public boolean isDamaged(int p_96631_1_, Random p_96631_2_, EntityLivingBase entitylivingbase) + { + // Spigot end if (!this.isItemStackDamageable()) { return false; @@ -250,6 +280,23 @@ p_96631_1_ -= k; + // Spigot start + if (entitylivingbase instanceof EntityPlayerMP) + { + org.bukkit.craftbukkit.inventory.CraftItemStack item = org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(this); + org.bukkit.event.player.PlayerItemDamageEvent event = new org.bukkit.event.player.PlayerItemDamageEvent( + (org.bukkit.entity.Player) entitylivingbase.getBukkitEntity(), item, p_96631_1_); + org.bukkit.Bukkit.getServer().getPluginManager().callEvent(event); + + if (event.isCancelled()) + { + return false; + } + + p_96631_1_ = event.getDamage(); + } + // Spigot end + if (p_96631_1_ <= 0) { return false; @@ -267,7 +314,7 @@ { if (this.isItemStackDamageable()) { - if (this.attemptDamageItem(p_77972_1_, p_77972_2_.getRNG())) + if (this.isDamaged(p_77972_1_, p_77972_2_.getRNG(), p_77972_2_)) { p_77972_2_.renderBrokenItemStack(this); --this.stackSize; @@ -288,6 +335,12 @@ this.stackSize = 0; } + // CraftBukkit start - Check for item breaking + if (this.stackSize == 0 && p_77972_2_ instanceof EntityPlayer) + { + org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerItemBreakEvent((EntityPlayer) p_77972_2_, this); + } + // CraftBukkit end this.itemDamage = 0; } } @@ -419,6 +472,7 @@ public void setTagCompound(NBTTagCompound p_77982_1_) { + // Cauldron - do not alter name of compound. Fixes Ars Magica 2 Spellbooks this.stackTagCompound = p_77982_1_; } @@ -768,4 +822,12 @@ return ichatcomponent; } + + // Spigot start + public static boolean fastMatches(ItemStack is1, ItemStack is2) { + if (is1 == null && is2 == null) return true; + if (is1 != null && is2 != null) return is1.stackSize == is2.stackSize && is1.field_151002_e == is2.field_151002_e && is1.itemDamage == is2.itemDamage; + return false; + } + // Spigot end }