package net.minecraft.entity.item;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityHanging;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Items;
import net.minecraft.item.ItemMap;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.DamageSource;
import net.minecraft.world.World;
import net.minecraft.world.storage.MapData;
public class EntityItemFrame extends EntityHanging
{
/** Chance for this item frame's item to drop from the frame. */
private float itemDropChance = 1.0F;
private static final String __OBFID = "CL_00001547";
public EntityItemFrame(World p_i1590_1_)
{
super(p_i1590_1_);
}
public EntityItemFrame(World p_i1591_1_, int p_i1591_2_, int p_i1591_3_, int p_i1591_4_, int p_i1591_5_)
{
super(p_i1591_1_, p_i1591_2_, p_i1591_3_, p_i1591_4_, p_i1591_5_);
this.setDirection(p_i1591_5_);
}
protected void entityInit()
{
this.getDataWatcher().addObjectByDataType(2, 5);
this.getDataWatcher().addObject(3, Byte.valueOf((byte)0));
}
/**
* Called when the entity is attacked.
*/
public boolean attackEntityFrom(DamageSource source, float amount)
{
if (this.isEntityInvulnerable())
{
return false;
}
else if (this.getDisplayedItem() != null)
{
if (!this.worldObj.isRemote)
{
this.func_146065_b(source.getEntity(), false);
this.setDisplayedItem((ItemStack)null);
}
return true;
}
else
{
return super.attackEntityFrom(source, amount);
}
}
public int getWidthPixels()
{
return 9;
}
public int getHeightPixels()
{
return 9;
}
/**
* Checks if the entity is in range to render by using the past in distance and comparing it to its average edge
* length * 64 * renderDistanceWeight Args: distance
*/
@SideOnly(Side.CLIENT)
public boolean isInRangeToRenderDist(double distance)
{
double d1 = 16.0D;
d1 *= 64.0D * this.renderDistanceWeight;
return distance < d1 * d1;
}
/**
* Called when this entity is broken. Entity parameter may be null.
*/
public void onBroken(Entity p_110128_1_)
{
this.func_146065_b(p_110128_1_, true);
}
public void func_146065_b(Entity p_146065_1_, boolean p_146065_2_)
{
ItemStack itemstack = this.getDisplayedItem();
if (p_146065_1_ instanceof EntityPlayer)
{
EntityPlayer entityplayer = (EntityPlayer)p_146065_1_;
if (entityplayer.capabilities.isCreativeMode)
{
this.removeFrameFromMap(itemstack);
return;
}
}
if (p_146065_2_)
{
this.entityDropItem(new ItemStack(Items.item_frame), 0.0F);
}
if (itemstack != null && this.rand.nextFloat() < this.itemDropChance)
{
itemstack = itemstack.copy();
this.removeFrameFromMap(itemstack);
this.entityDropItem(itemstack, 0.0F);
}
}
/**
* Removes the dot representing this frame's position from the map when the item frame is broken.
*/
private void removeFrameFromMap(ItemStack p_110131_1_)
{
if (p_110131_1_ != null)
{
if (p_110131_1_.getItem() == Items.filled_map)
{
MapData mapdata = ((ItemMap)p_110131_1_.getItem()).getMapData(p_110131_1_, this.worldObj);
mapdata.playersVisibleOnMap.remove("frame-" + this.getEntityId());
}
p_110131_1_.setItemFrame((EntityItemFrame)null);
}
}
public ItemStack getDisplayedItem()
{
return this.getDataWatcher().getWatchableObjectItemStack(2);
}
public void setDisplayedItem(ItemStack p_82334_1_)
{
if (p_82334_1_ != null)
{
p_82334_1_ = p_82334_1_.copy();
p_82334_1_.stackSize = 1;
p_82334_1_.setItemFrame(this);
}
this.getDataWatcher().updateObject(2, p_82334_1_);
this.getDataWatcher().setObjectWatched(2);
}
/**
* Return the rotation of the item currently on this frame.
*/
public int getRotation()
{
return this.getDataWatcher().getWatchableObjectByte(3);
}
public void setItemRotation(int p_82336_1_)
{
this.getDataWatcher().updateObject(3, Byte.valueOf((byte)(p_82336_1_ % 4)));
}
/**
* (abstract) Protected helper method to write subclass entity data to NBT.
*/
public void writeEntityToNBT(NBTTagCompound tagCompound)
{
if (this.getDisplayedItem() != null)
{
tagCompound.setTag("Item", this.getDisplayedItem().writeToNBT(new NBTTagCompound()));
tagCompound.setByte("ItemRotation", (byte)this.getRotation());
tagCompound.setFloat("ItemDropChance", this.itemDropChance);
}
super.writeEntityToNBT(tagCompound);
}
/**
* (abstract) Protected helper method to read subclass entity data from NBT.
*/
public void readEntityFromNBT(NBTTagCompound tagCompund)
{
NBTTagCompound nbttagcompound1 = tagCompund.getCompoundTag("Item");
if (nbttagcompound1 != null && !nbttagcompound1.hasNoTags())
{
this.setDisplayedItem(ItemStack.loadItemStackFromNBT(nbttagcompound1));
this.setItemRotation(tagCompund.getByte("ItemRotation"));
if (tagCompund.hasKey("ItemDropChance", 99))
{
this.itemDropChance = tagCompund.getFloat("ItemDropChance");
}
}
super.readEntityFromNBT(tagCompund);
}
/**
* First layer of player interaction
*/
public boolean interactFirst(EntityPlayer player)
{
if (this.getDisplayedItem() == null)
{
ItemStack itemstack = player.getHeldItem();
if (itemstack != null && !this.worldObj.isRemote)
{
this.setDisplayedItem(itemstack);
if (!player.capabilities.isCreativeMode && --itemstack.stackSize <= 0)
{
player.inventory.setInventorySlotContents(player.inventory.currentItem, (ItemStack)null);
}
}
}
else if (!this.worldObj.isRemote)
{
this.setItemRotation(this.getRotation() + 1);
}
return true;
}
}