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