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 }