    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
    058            if (this.func_82335_i() != null && this.rand.nextFloat() < this.itemDropChance)
    059            {
    060                this.func_82335_i().setItemFrame((EntityItemFrame)null);
    061                this.entityDropItem(this.func_82335_i(), 0.0F);
    062            }
    063        }
    064
    065        public ItemStack func_82335_i()
    066        {
    067            return this.getDataWatcher().getWatchableObjectItemStack(2);
    068        }
    069
    070        public void func_82334_a(ItemStack par1ItemStack)
    071        {
    072            par1ItemStack = par1ItemStack.copy();
    073            par1ItemStack.stackSize = 1;
    074            par1ItemStack.setItemFrame(this);
    075            this.getDataWatcher().updateObject(2, par1ItemStack);
    076            this.getDataWatcher().func_82708_h(2);
    077        }
    078
    079        /**
    080         * Return the rotation of the item currently on this frame.
    081         */
    082        public int getRotation()
    083        {
    084            return this.getDataWatcher().getWatchableObjectByte(3);
    085        }
    086
    087        public void func_82336_g(int par1)
    088        {
    089            this.getDataWatcher().updateObject(3, Byte.valueOf((byte)(par1 % 4)));
    090        }
    091
    092        /**
    093         * (abstract) Protected helper method to write subclass entity data to NBT.
    094         */
    095        public void writeEntityToNBT(NBTTagCompound par1NBTTagCompound)
    096        {
    097            if (this.func_82335_i() != null)
    098            {
    099                par1NBTTagCompound.setCompoundTag("Item", this.func_82335_i().writeToNBT(new NBTTagCompound()));
    100                par1NBTTagCompound.setByte("ItemRotation", (byte)this.getRotation());
    101                par1NBTTagCompound.setFloat("ItemDropChance", this.itemDropChance);
    102            }
    103
    104            super.writeEntityToNBT(par1NBTTagCompound);
    105        }
    106
    107        /**
    108         * (abstract) Protected helper method to read subclass entity data from NBT.
    109         */
    110        public void readEntityFromNBT(NBTTagCompound par1NBTTagCompound)
    111        {
    112            NBTTagCompound var2 = par1NBTTagCompound.getCompoundTag("Item");
    113
    114            if (var2 != null && !var2.hasNoTags())
    115            {
    116                this.func_82334_a(ItemStack.loadItemStackFromNBT(var2));
    117                this.func_82336_g(par1NBTTagCompound.getByte("ItemRotation"));
    118
    119                if (par1NBTTagCompound.hasKey("ItemDropChance"))
    120                {
    121                    this.itemDropChance = par1NBTTagCompound.getFloat("ItemDropChance");
    122                }
    123            }
    124
    125            super.readEntityFromNBT(par1NBTTagCompound);
    126        }
    127
    128        /**
    129         * Called when a player interacts with a mob. e.g. gets milk from a cow, gets into the saddle on a pig.
    130         */
    131        public boolean interact(EntityPlayer par1EntityPlayer)
    132        {
    133            if (this.func_82335_i() == null)
    134            {
    135                ItemStack var2 = par1EntityPlayer.getHeldItem();
    136
    137                if (var2 != null && !this.worldObj.isRemote)
    138                {
    139                    this.func_82334_a(var2);
    140
    141                    if (!par1EntityPlayer.capabilities.isCreativeMode && --var2.stackSize <= 0)
    142                    {
    143                        par1EntityPlayer.inventory.setInventorySlotContents(par1EntityPlayer.inventory.currentItem, (ItemStack)null);
    144                    }
    145                }
    146            }
    147            else if (!this.worldObj.isRemote)
    148            {
    149                this.func_82336_g(this.getRotation() + 1);
    150            }
    151
    152            return true;
    153        }
    154    }