package net.minecraft.entity.item;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityHanging;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.item.ItemMap;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.BlockPos;
import net.minecraft.util.DamageSource;
import net.minecraft.util.EnumFacing;
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 worldIn)
{
super(worldIn);
}
public EntityItemFrame(World worldIn, BlockPos p_i45852_2_, EnumFacing p_i45852_3_)
{
super(worldIn, p_i45852_2_);
this.func_174859_a(p_i45852_3_);
}
protected void entityInit()
{
this.getDataWatcher().addObjectByDataType(8, 5);
this.getDataWatcher().addObject(9, Byte.valueOf((byte)0));
}
public float getCollisionBorderSize()
{
return 0.0F;
}
/**
* Called when the entity is attacked.
*/
public boolean attackEntityFrom(DamageSource source, float amount)
{
if (this.func_180431_b(source))
{
return false;
}
else if (!source.isExplosion() && 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 12;
}
public int getHeightPixels()
{
return 12;
}
/**
* 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
*/
public boolean isInRangeToRenderDist(double distance)
{
double var3 = 16.0D;
var3 *= 64.0D * this.renderDistanceWeight;
return distance < var3 * var3;
}
/**
* 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_)
{
if (this.worldObj.getGameRules().getGameRuleBooleanValue("doTileDrops"))
{
ItemStack var3 = this.getDisplayedItem();
if (p_146065_1_ instanceof EntityPlayer)
{
EntityPlayer var4 = (EntityPlayer)p_146065_1_;
if (var4.capabilities.isCreativeMode)
{
this.removeFrameFromMap(var3);
return;
}
}
if (p_146065_2_)
{
this.entityDropItem(new ItemStack(Items.item_frame), 0.0F);
}
if (var3 != null && this.rand.nextFloat() < this.itemDropChance)
{
var3 = var3.copy();
this.removeFrameFromMap(var3);
this.entityDropItem(var3, 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 var2 = ((ItemMap)p_110131_1_.getItem()).getMapData(p_110131_1_, this.worldObj);
var2.playersVisibleOnMap.remove("frame-" + this.getEntityId());
}
p_110131_1_.setItemFrame((EntityItemFrame)null);
}
}
public ItemStack getDisplayedItem()
{
return this.getDataWatcher().getWatchableObjectItemStack(8);
}
public void setDisplayedItem(ItemStack p_82334_1_)
{
this.func_174864_a(p_82334_1_, true);
}
private void func_174864_a(ItemStack p_174864_1_, boolean p_174864_2_)
{
if (p_174864_1_ != null)
{
p_174864_1_ = p_174864_1_.copy();
p_174864_1_.stackSize = 1;
p_174864_1_.setItemFrame(this);
}
this.getDataWatcher().updateObject(8, p_174864_1_);
this.getDataWatcher().setObjectWatched(8);
if (p_174864_2_ && this.field_174861_a != null)
{
this.worldObj.updateComparatorOutputLevel(this.field_174861_a, Blocks.air);
}
}
/**
* Return the rotation of the item currently on this frame.
*/
public int getRotation()
{
return this.getDataWatcher().getWatchableObjectByte(9);
}
public void setItemRotation(int p_82336_1_)
{
this.func_174865_a(p_82336_1_, true);
}
private void func_174865_a(int p_174865_1_, boolean p_174865_2_)
{
this.getDataWatcher().updateObject(9, Byte.valueOf((byte)(p_174865_1_ % 8)));
if (p_174865_2_ && this.field_174861_a != null)
{
this.worldObj.updateComparatorOutputLevel(this.field_174861_a, Blocks.air);
}
}
/**
* (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 var2 = tagCompund.getCompoundTag("Item");
if (var2 != null && !var2.hasNoTags())
{
this.func_174864_a(ItemStack.loadItemStackFromNBT(var2), false);
this.func_174865_a(tagCompund.getByte("ItemRotation"), false);
if (tagCompund.hasKey("ItemDropChance", 99))
{
this.itemDropChance = tagCompund.getFloat("ItemDropChance");
}
if (tagCompund.hasKey("Direction"))
{
this.func_174865_a(this.getRotation() * 2, false);
}
}
super.readEntityFromNBT(tagCompund);
}
/**
* First layer of player interaction
*/
public boolean interactFirst(EntityPlayer playerIn)
{
if (this.getDisplayedItem() == null)
{
ItemStack var2 = playerIn.getHeldItem();
if (var2 != null && !this.worldObj.isRemote)
{
this.setDisplayedItem(var2);
if (!playerIn.capabilities.isCreativeMode && --var2.stackSize <= 0)
{
playerIn.inventory.setInventorySlotContents(playerIn.inventory.currentItem, (ItemStack)null);
}
}
}
else if (!this.worldObj.isRemote)
{
this.setItemRotation(this.getRotation() + 1);
}
return true;
}
public int func_174866_q()
{
return this.getDisplayedItem() == null ? 0 : this.getRotation() % 8 + 1;
}
}