    001    package net.minecraft.src;
    002
    003    import cpw.mods.fml.common.Side;
    004    import cpw.mods.fml.common.asm.SideOnly;
    005
    006    public class EntityItemFrame extends EntityHanging
    007    {
    008        /** Chance for this item frame's item to drop from the frame. */
    009        private float itemDropChance = 1.0F;
    010
    011        public EntityItemFrame(World par1World)
    012        {
    013            super(par1World);
    014        }
    015
    016        public EntityItemFrame(World par1World, int par2, int par3, int par4, int par5)
    017        {
    018            super(par1World, par2, par3, par4, par5);
    019            this.func_82328_a(par5);
    020        }
    021
    022        protected void entityInit()
    023        {
    024            this.getDataWatcher().addObjectByDataType(2, 5);
    025            this.getDataWatcher().addObject(3, Byte.valueOf((byte)0));
    026        }
    027
    028        public int func_82329_d()
    029        {
    030            return 9;
    031        }
    032
    033        public int func_82330_g()
    034        {
    035            return 9;
    036        }
    037
    038        @SideOnly(Side.CLIENT)
    039
    040        /**
    041         * Checks if the entity is in range to render by using the past in distance and comparing it to its average edge
    042         * length * 64 * renderDistanceWeight Args: distance
    043         */
    044        public boolean isInRangeToRenderDist(double par1)
    045        {
    046            double var3 = 16.0D;
    047            var3 *= 64.0D * this.renderDistanceWeight;
    048            return par1 < var3 * var3;
    049        }
    050
    051        /**
    052         * Drop the item currently on this item frame.
    053         */
    054        public void dropItemStack()
    055        {
    056            this.entityDropItem(new ItemStack(Item.itemFrame), 0.0F);
    057            ItemStack var1 = this.func_82335_i();
    058
    059            if (var1 != null && this.rand.nextFloat() < this.itemDropChance)
    060            {
    061                var1 = var1.copy();
    062                var1.setItemFrame((EntityItemFrame)null);
    063                this.entityDropItem(var1, 0.0F);
    064            }
    065        }
    066
    067        public ItemStack func_82335_i()
    068        {
    069            return this.getDataWatcher().getWatchableObjectItemStack(2);
    070        }
    071
    072        public void func_82334_a(ItemStack par1ItemStack)
    073        {
    074            par1ItemStack = par1ItemStack.copy();
    075            par1ItemStack.stackSize = 1;
    076            par1ItemStack.setItemFrame(this);
    077            this.getDataWatcher().updateObject(2, par1ItemStack);
    078            this.getDataWatcher().func_82708_h(2);
    079        }
    080
    081        /**
    082         * Return the rotation of the item currently on this frame.
    083         */
    084        public int getRotation()
    085        {
    086            return this.getDataWatcher().getWatchableObjectByte(3);
    087        }
    088
    089        public void func_82336_g(int par1)
    090        {
    091            this.getDataWatcher().updateObject(3, Byte.valueOf((byte)(par1 % 4)));
    092        }
    093
    094        /**
    095         * (abstract) Protected helper method to write subclass entity data to NBT.
    096         */
    097        public void writeEntityToNBT(NBTTagCompound par1NBTTagCompound)
    098        {
    099            if (this.func_82335_i() != null)
    100            {
    101                par1NBTTagCompound.setCompoundTag("Item", this.func_82335_i().writeToNBT(new NBTTagCompound()));
    102                par1NBTTagCompound.setByte("ItemRotation", (byte)this.getRotation());
    103                par1NBTTagCompound.setFloat("ItemDropChance", this.itemDropChance);
    104            }
    105
    106            super.writeEntityToNBT(par1NBTTagCompound);
    107        }
    108
    109        /**
    110         * (abstract) Protected helper method to read subclass entity data from NBT.
    111         */
    112        public void readEntityFromNBT(NBTTagCompound par1NBTTagCompound)
    113        {
    114            NBTTagCompound var2 = par1NBTTagCompound.getCompoundTag("Item");
    115
    116            if (var2 != null && !var2.hasNoTags())
    117            {
    118                this.func_82334_a(ItemStack.loadItemStackFromNBT(var2));
    119                this.func_82336_g(par1NBTTagCompound.getByte("ItemRotation"));
    120
    121                if (par1NBTTagCompound.hasKey("ItemDropChance"))
    122                {
    123                    this.itemDropChance = par1NBTTagCompound.getFloat("ItemDropChance");
    124                }
    125            }
    126
    127            super.readEntityFromNBT(par1NBTTagCompound);
    128        }
    129
    130        /**
    131         * Called when a player interacts with a mob. e.g. gets milk from a cow, gets into the saddle on a pig.
    132         */
    133        public boolean interact(EntityPlayer par1EntityPlayer)
    134        {
    135            if (this.func_82335_i() == null)
    136            {
    137                ItemStack var2 = par1EntityPlayer.getHeldItem();
    138
    139                if (var2 != null && !this.worldObj.isRemote)
    140                {
    141                    this.func_82334_a(var2);
    142
    143                    if (!par1EntityPlayer.capabilities.isCreativeMode && --var2.stackSize <= 0)
    144                    {
    145                        par1EntityPlayer.inventory.setInventorySlotContents(par1EntityPlayer.inventory.currentItem, (ItemStack)null);
    146                    }
    147                }
    148            }
    149            else if (!this.worldObj.isRemote)
    150            {
    151                this.func_82336_g(this.getRotation() + 1);
    152            }
    153
    154            return true;
    155        }
    156    }