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 }