    001    package net.minecraft.entity.item;
    002
    003    import cpw.mods.fml.common.Side;
    004    import cpw.mods.fml.common.asm.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    }