package net.minecraft.entity.item;
import java.util.List;
import net.minecraft.block.Block;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLiving;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.projectile.EntityArrow;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.item.Item;
import net.minecraft.item.ItemArmor;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.util.BlockPos;
import net.minecraft.util.DamageSource;
import net.minecraft.util.EnumParticleTypes;
import net.minecraft.util.Rotations;
import net.minecraft.util.Vec3;
import net.minecraft.world.World;
import net.minecraft.world.WorldServer;
public class EntityArmorStand extends EntityLivingBase
{
private static final Rotations DEFAULT_HEAD_ROTATION = new Rotations(0.0F, 0.0F, 0.0F);
private static final Rotations DEFAULT_BODY_ROTATION = new Rotations(0.0F, 0.0F, 0.0F);
private static final Rotations DEFAULT_LEFTARM_ROTATION = new Rotations(-10.0F, 0.0F, -10.0F);
private static final Rotations DEFAULT_RIGHTARM_ROTATION = new Rotations(-15.0F, 0.0F, 10.0F);
private static final Rotations DEFAULT_LEFTLEG_ROTATION = new Rotations(-1.0F, 0.0F, -1.0F);
private static final Rotations DEFAULT_RIGHTLEG_ROTATION = new Rotations(1.0F, 0.0F, 1.0F);
private final ItemStack[] contents;
private boolean canInteract;
private long field_175437_i;
private int disabledSlots;
private Rotations headRotation;
private Rotations bodyRotation;
private Rotations leftArmRotation;
private Rotations rightArmRotation;
private Rotations leftLegRotation;
private Rotations rightLegRotation;
private static final String __OBFID = "CL_00002228";
public EntityArmorStand(World worldIn)
{
super(worldIn);
this.contents = new ItemStack[5];
this.headRotation = DEFAULT_HEAD_ROTATION;
this.bodyRotation = DEFAULT_BODY_ROTATION;
this.leftArmRotation = DEFAULT_LEFTARM_ROTATION;
this.rightArmRotation = DEFAULT_RIGHTARM_ROTATION;
this.leftLegRotation = DEFAULT_LEFTLEG_ROTATION;
this.rightLegRotation = DEFAULT_RIGHTLEG_ROTATION;
this.func_174810_b(true);
this.noClip = this.hasNoGravity();
this.setSize(0.5F, 1.975F);
}
public EntityArmorStand(World worldIn, double p_i45855_2_, double p_i45855_4_, double p_i45855_6_)
{
this(worldIn);
this.setPosition(p_i45855_2_, p_i45855_4_, p_i45855_6_);
}
/**
* Returns whether the entity is in a server world
*/
public boolean isServerWorld()
{
return super.isServerWorld() && !this.hasNoGravity();
}
protected void entityInit()
{
super.entityInit();
this.dataWatcher.addObject(10, Byte.valueOf((byte)0));
this.dataWatcher.addObject(11, DEFAULT_HEAD_ROTATION);
this.dataWatcher.addObject(12, DEFAULT_BODY_ROTATION);
this.dataWatcher.addObject(13, DEFAULT_LEFTARM_ROTATION);
this.dataWatcher.addObject(14, DEFAULT_RIGHTARM_ROTATION);
this.dataWatcher.addObject(15, DEFAULT_LEFTLEG_ROTATION);
this.dataWatcher.addObject(16, DEFAULT_RIGHTLEG_ROTATION);
}
/**
* Returns the item that this EntityLiving is holding, if any.
*/
public ItemStack getHeldItem()
{
return this.contents[0];
}
/**
* 0: Tool in Hand; 1-4: Armor
*/
public ItemStack getEquipmentInSlot(int p_71124_1_)
{
return this.contents[p_71124_1_];
}
/**
* Sets the held item, or an armor slot. Slot 0 is held item. Slot 1-4 is armor. Params: Item, slot
*/
public void setCurrentItemOrArmor(int slotIn, ItemStack itemStackIn)
{
this.contents[slotIn] = itemStackIn;
}
/**
* returns the inventory of this entity (only used in EntityPlayerMP it seems)
*/
public ItemStack[] getInventory()
{
return this.contents;
}
public boolean func_174820_d(int p_174820_1_, ItemStack p_174820_2_)
{
int var3;
if (p_174820_1_ == 99)
{
var3 = 0;
}
else
{
var3 = p_174820_1_ - 100 + 1;
if (var3 < 0 || var3 >= this.contents.length)
{
return false;
}
}
if (p_174820_2_ != null && EntityLiving.getArmorPosition(p_174820_2_) != var3 && (var3 != 4 || !(p_174820_2_.getItem() instanceof ItemBlock)))
{
return false;
}
else
{
this.setCurrentItemOrArmor(var3, p_174820_2_);
return true;
}
}
/**
* (abstract) Protected helper method to write subclass entity data to NBT.
*/
public void writeEntityToNBT(NBTTagCompound tagCompound)
{
super.writeEntityToNBT(tagCompound);
NBTTagList var2 = new NBTTagList();
for (int var3 = 0; var3 < this.contents.length; ++var3)
{
NBTTagCompound var4 = new NBTTagCompound();
if (this.contents[var3] != null)
{
this.contents[var3].writeToNBT(var4);
}
var2.appendTag(var4);
}
tagCompound.setTag("Equipment", var2);
if (this.getAlwaysRenderNameTag() && (this.getCustomNameTag() == null || this.getCustomNameTag().length() == 0))
{
tagCompound.setBoolean("CustomNameVisible", this.getAlwaysRenderNameTag());
}
tagCompound.setBoolean("Invisible", this.isInvisible());
tagCompound.setBoolean("Small", this.isSmall());
tagCompound.setBoolean("ShowArms", this.getShowArms());
tagCompound.setInteger("DisabledSlots", this.disabledSlots);
tagCompound.setBoolean("NoGravity", this.hasNoGravity());
tagCompound.setBoolean("NoBasePlate", this.hasNoBasePlate());
tagCompound.setTag("Pose", this.readPoseFromNBT());
}
/**
* (abstract) Protected helper method to read subclass entity data from NBT.
*/
public void readEntityFromNBT(NBTTagCompound tagCompund)
{
super.readEntityFromNBT(tagCompund);
if (tagCompund.hasKey("Equipment", 9))
{
NBTTagList var2 = tagCompund.getTagList("Equipment", 10);
for (int var3 = 0; var3 < this.contents.length; ++var3)
{
this.contents[var3] = ItemStack.loadItemStackFromNBT(var2.getCompoundTagAt(var3));
}
}
this.setInvisible(tagCompund.getBoolean("Invisible"));
this.setSmall(tagCompund.getBoolean("Small"));
this.setShowArms(tagCompund.getBoolean("ShowArms"));
this.disabledSlots = tagCompund.getInteger("DisabledSlots");
this.setNoGravity(tagCompund.getBoolean("NoGravity"));
this.setNoBasePlate(tagCompund.getBoolean("NoBasePlate"));
this.noClip = this.hasNoGravity();
NBTTagCompound var4 = tagCompund.getCompoundTag("Pose");
this.writePoseToNBT(var4);
}
private void writePoseToNBT(NBTTagCompound p_175416_1_)
{
NBTTagList var2 = p_175416_1_.getTagList("Head", 5);
if (var2.tagCount() > 0)
{
this.setHeadRotation(new Rotations(var2));
}
else
{
this.setHeadRotation(DEFAULT_HEAD_ROTATION);
}
NBTTagList var3 = p_175416_1_.getTagList("Body", 5);
if (var3.tagCount() > 0)
{
this.setBodyRotation(new Rotations(var3));
}
else
{
this.setBodyRotation(DEFAULT_BODY_ROTATION);
}
NBTTagList var4 = p_175416_1_.getTagList("LeftArm", 5);
if (var4.tagCount() > 0)
{
this.setLeftArmRotation(new Rotations(var4));
}
else
{
this.setLeftArmRotation(DEFAULT_LEFTARM_ROTATION);
}
NBTTagList var5 = p_175416_1_.getTagList("RightArm", 5);
if (var5.tagCount() > 0)
{
this.setRightArmRotation(new Rotations(var5));
}
else
{
this.setRightArmRotation(DEFAULT_RIGHTARM_ROTATION);
}
NBTTagList var6 = p_175416_1_.getTagList("LeftLeg", 5);
if (var6.tagCount() > 0)
{
this.setLeftLegRotation(new Rotations(var6));
}
else
{
this.setLeftLegRotation(DEFAULT_LEFTLEG_ROTATION);
}
NBTTagList var7 = p_175416_1_.getTagList("RightLeg", 5);
if (var7.tagCount() > 0)
{
this.setRightLegRotation(new Rotations(var7));
}
else
{
this.setRightLegRotation(DEFAULT_RIGHTLEG_ROTATION);
}
}
private NBTTagCompound readPoseFromNBT()
{
NBTTagCompound var1 = new NBTTagCompound();
if (!DEFAULT_HEAD_ROTATION.equals(this.headRotation))
{
var1.setTag("Head", this.headRotation.func_179414_a());
}
if (!DEFAULT_BODY_ROTATION.equals(this.bodyRotation))
{
var1.setTag("Body", this.bodyRotation.func_179414_a());
}
if (!DEFAULT_LEFTARM_ROTATION.equals(this.leftArmRotation))
{
var1.setTag("LeftArm", this.leftArmRotation.func_179414_a());
}
if (!DEFAULT_RIGHTARM_ROTATION.equals(this.rightArmRotation))
{
var1.setTag("RightArm", this.rightArmRotation.func_179414_a());
}
if (!DEFAULT_LEFTLEG_ROTATION.equals(this.leftLegRotation))
{
var1.setTag("LeftLeg", this.leftLegRotation.func_179414_a());
}
if (!DEFAULT_RIGHTLEG_ROTATION.equals(this.rightLegRotation))
{
var1.setTag("RightLeg", this.rightLegRotation.func_179414_a());
}
return var1;
}
/**
* Returns true if this entity should push and be pushed by other entities when colliding.
*/
public boolean canBePushed()
{
return false;
}
protected void collideWithEntity(Entity p_82167_1_) {}
protected void collideWithNearbyEntities()
{
List var1 = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.getEntityBoundingBox());
if (var1 != null && !var1.isEmpty())
{
for (int var2 = 0; var2 < var1.size(); ++var2)
{
Entity var3 = (Entity)var1.get(var2);
if (var3 instanceof EntityMinecart && ((EntityMinecart)var3).func_180456_s() == EntityMinecart.EnumMinecartType.RIDEABLE && this.getDistanceSqToEntity(var3) <= 0.2D)
{
var3.applyEntityCollision(this);
}
}
}
}
public boolean func_174825_a(EntityPlayer p_174825_1_, Vec3 p_174825_2_)
{
if (!this.worldObj.isRemote && !p_174825_1_.func_175149_v())
{
byte var3 = 0;
ItemStack var4 = p_174825_1_.getCurrentEquippedItem();
boolean var5 = var4 != null;
if (var5 && var4.getItem() instanceof ItemArmor)
{
ItemArmor var6 = (ItemArmor)var4.getItem();
if (var6.armorType == 3)
{
var3 = 1;
}
else if (var6.armorType == 2)
{
var3 = 2;
}
else if (var6.armorType == 1)
{
var3 = 3;
}
else if (var6.armorType == 0)
{
var3 = 4;
}
}
if (var5 && (var4.getItem() == Items.skull || var4.getItem() == Item.getItemFromBlock(Blocks.pumpkin)))
{
var3 = 4;
}
double var19 = 0.1D;
double var8 = 0.9D;
double var10 = 0.4D;
double var12 = 1.6D;
byte var14 = 0;
boolean var15 = this.isSmall();
double var16 = var15 ? p_174825_2_.yCoord * 2.0D : p_174825_2_.yCoord;
if (var16 >= 0.1D && var16 < 0.1D + (var15 ? 0.8D : 0.45D) && this.contents[1] != null)
{
var14 = 1;
}
else if (var16 >= 0.9D + (var15 ? 0.3D : 0.0D) && var16 < 0.9D + (var15 ? 1.0D : 0.7D) && this.contents[3] != null)
{
var14 = 3;
}
else if (var16 >= 0.4D && var16 < 0.4D + (var15 ? 1.0D : 0.8D) && this.contents[2] != null)
{
var14 = 2;
}
else if (var16 >= 1.6D && this.contents[4] != null)
{
var14 = 4;
}
boolean var18 = this.contents[var14] != null;
if ((this.disabledSlots & 1 << var14) != 0 || (this.disabledSlots & 1 << var3) != 0)
{
var14 = var3;
if ((this.disabledSlots & 1 << var3) != 0)
{
if ((this.disabledSlots & 1) != 0)
{
return true;
}
var14 = 0;
}
}
if (var5 && var3 == 0 && !this.getShowArms())
{
return true;
}
else
{
if (var5)
{
this.func_175422_a(p_174825_1_, var3);
}
else if (var18)
{
this.func_175422_a(p_174825_1_, var14);
}
return true;
}
}
else
{
return true;
}
}
private void func_175422_a(EntityPlayer p_175422_1_, int p_175422_2_)
{
ItemStack var3 = this.contents[p_175422_2_];
if (var3 == null || (this.disabledSlots & 1 << p_175422_2_ + 8) == 0)
{
if (var3 != null || (this.disabledSlots & 1 << p_175422_2_ + 16) == 0)
{
int var4 = p_175422_1_.inventory.currentItem;
ItemStack var5 = p_175422_1_.inventory.getStackInSlot(var4);
ItemStack var6;
if (p_175422_1_.capabilities.isCreativeMode && (var3 == null || var3.getItem() == Item.getItemFromBlock(Blocks.air)) && var5 != null)
{
var6 = var5.copy();
var6.stackSize = 1;
this.setCurrentItemOrArmor(p_175422_2_, var6);
}
else if (var5 != null && var5.stackSize > 1)
{
if (var3 == null)
{
var6 = var5.copy();
var6.stackSize = 1;
this.setCurrentItemOrArmor(p_175422_2_, var6);
--var5.stackSize;
}
}
else
{
this.setCurrentItemOrArmor(p_175422_2_, var5);
p_175422_1_.inventory.setInventorySlotContents(var4, var3);
}
}
}
}
/**
* Called when the entity is attacked.
*/
public boolean attackEntityFrom(DamageSource source, float amount)
{
if (!this.worldObj.isRemote && !this.canInteract)
{
if (DamageSource.outOfWorld.equals(source))
{
this.setDead();
return false;
}
else if (this.func_180431_b(source))
{
return false;
}
else if (source.isExplosion())
{
this.dropContents();
this.setDead();
return false;
}
else if (DamageSource.inFire.equals(source))
{
if (!this.isBurning())
{
this.setFire(5);
}
else
{
this.func_175406_a(0.15F);
}
return false;
}
else if (DamageSource.onFire.equals(source) && this.getHealth() > 0.5F)
{
this.func_175406_a(4.0F);
return false;
}
else
{
boolean var3 = "arrow".equals(source.getDamageType());
boolean var4 = "player".equals(source.getDamageType());
if (!var4 && !var3)
{
return false;
}
else
{
if (source.getSourceOfDamage() instanceof EntityArrow)
{
source.getSourceOfDamage().setDead();
}
if (source.getEntity() instanceof EntityPlayer && !((EntityPlayer)source.getEntity()).capabilities.allowEdit)
{
return false;
}
else if (source.func_180136_u())
{
this.playParticles();
this.setDead();
return false;
}
else
{
long var5 = this.worldObj.getTotalWorldTime();
if (var5 - this.field_175437_i > 5L && !var3)
{
this.field_175437_i = var5;
}
else
{
this.dropBlock();
this.playParticles();
this.setDead();
}
return false;
}
}
}
}
else
{
return false;
}
}
private void playParticles()
{
if (this.worldObj instanceof WorldServer)
{
((WorldServer)this.worldObj).func_175739_a(EnumParticleTypes.BLOCK_DUST, this.posX, this.posY + (double)this.height / 1.5D, this.posZ, 10, (double)(this.width / 4.0F), (double)(this.height / 4.0F), (double)(this.width / 4.0F), 0.05D, new int[] {Block.getStateId(Blocks.planks.getDefaultState())});
}
}
private void func_175406_a(float p_175406_1_)
{
float var2 = this.getHealth();
var2 -= p_175406_1_;
if (var2 <= 0.5F)
{
this.dropContents();
this.setDead();
}
else
{
this.setHealth(var2);
}
}
private void dropBlock()
{
Block.spawnAsEntity(this.worldObj, new BlockPos(this), new ItemStack(Items.armor_stand));
this.dropContents();
}
private void dropContents()
{
for (int var1 = 0; var1 < this.contents.length; ++var1)
{
if (this.contents[var1] != null && this.contents[var1].stackSize > 0)
{
if (this.contents[var1] != null)
{
Block.spawnAsEntity(this.worldObj, (new BlockPos(this)).offsetUp(), this.contents[var1]);
}
this.contents[var1] = null;
}
}
}
protected float func_110146_f(float p_110146_1_, float p_110146_2_)
{
this.prevRenderYawOffset = this.prevRotationYaw;
this.renderYawOffset = this.rotationYaw;
return 0.0F;
}
public float getEyeHeight()
{
return this.isChild() ? this.height * 0.5F : this.height * 0.9F;
}
/**
* Moves the entity based on the specified heading. Args: strafe, forward
*/
public void moveEntityWithHeading(float p_70612_1_, float p_70612_2_)
{
if (!this.hasNoGravity())
{
super.moveEntityWithHeading(p_70612_1_, p_70612_2_);
}
}
/**
* Called to update the entity's position/logic.
*/
public void onUpdate()
{
super.onUpdate();
Rotations var1 = this.dataWatcher.getWatchableObjectRotations(11);
if (!this.headRotation.equals(var1))
{
this.setHeadRotation(var1);
}
Rotations var2 = this.dataWatcher.getWatchableObjectRotations(12);
if (!this.bodyRotation.equals(var2))
{
this.setBodyRotation(var2);
}
Rotations var3 = this.dataWatcher.getWatchableObjectRotations(13);
if (!this.leftArmRotation.equals(var3))
{
this.setLeftArmRotation(var3);
}
Rotations var4 = this.dataWatcher.getWatchableObjectRotations(14);
if (!this.rightArmRotation.equals(var4))
{
this.setRightArmRotation(var4);
}
Rotations var5 = this.dataWatcher.getWatchableObjectRotations(15);
if (!this.leftLegRotation.equals(var5))
{
this.setLeftLegRotation(var5);
}
Rotations var6 = this.dataWatcher.getWatchableObjectRotations(16);
if (!this.rightLegRotation.equals(var6))
{
this.setRightLegRotation(var6);
}
}
protected void func_175135_B()
{
this.setInvisible(this.canInteract);
}
public void setInvisible(boolean invisible)
{
this.canInteract = invisible;
super.setInvisible(invisible);
}
/**
* If Animal, checks if the age timer is negative
*/
public boolean isChild()
{
return this.isSmall();
}
public void func_174812_G()
{
this.setDead();
}
public boolean func_180427_aV()
{
return this.isInvisible();
}
private void setSmall(boolean p_175420_1_)
{
byte var2 = this.dataWatcher.getWatchableObjectByte(10);
if (p_175420_1_)
{
var2 = (byte)(var2 | 1);
}
else
{
var2 &= -2;
}
this.dataWatcher.updateObject(10, Byte.valueOf(var2));
}
public boolean isSmall()
{
return (this.dataWatcher.getWatchableObjectByte(10) & 1) != 0;
}
private void setNoGravity(boolean p_175425_1_)
{
byte var2 = this.dataWatcher.getWatchableObjectByte(10);
if (p_175425_1_)
{
var2 = (byte)(var2 | 2);
}
else
{
var2 &= -3;
}
this.dataWatcher.updateObject(10, Byte.valueOf(var2));
}
public boolean hasNoGravity()
{
return (this.dataWatcher.getWatchableObjectByte(10) & 2) != 0;
}
private void setShowArms(boolean p_175413_1_)
{
byte var2 = this.dataWatcher.getWatchableObjectByte(10);
if (p_175413_1_)
{
var2 = (byte)(var2 | 4);
}
else
{
var2 &= -5;
}
this.dataWatcher.updateObject(10, Byte.valueOf(var2));
}
public boolean getShowArms()
{
return (this.dataWatcher.getWatchableObjectByte(10) & 4) != 0;
}
private void setNoBasePlate(boolean p_175426_1_)
{
byte var2 = this.dataWatcher.getWatchableObjectByte(10);
if (p_175426_1_)
{
var2 = (byte)(var2 | 8);
}
else
{
var2 &= -9;
}
this.dataWatcher.updateObject(10, Byte.valueOf(var2));
}
public boolean hasNoBasePlate()
{
return (this.dataWatcher.getWatchableObjectByte(10) & 8) != 0;
}
public void setHeadRotation(Rotations p_175415_1_)
{
this.headRotation = p_175415_1_;
this.dataWatcher.updateObject(11, p_175415_1_);
}
public void setBodyRotation(Rotations p_175424_1_)
{
this.bodyRotation = p_175424_1_;
this.dataWatcher.updateObject(12, p_175424_1_);
}
public void setLeftArmRotation(Rotations p_175405_1_)
{
this.leftArmRotation = p_175405_1_;
this.dataWatcher.updateObject(13, p_175405_1_);
}
public void setRightArmRotation(Rotations p_175428_1_)
{
this.rightArmRotation = p_175428_1_;
this.dataWatcher.updateObject(14, p_175428_1_);
}
public void setLeftLegRotation(Rotations p_175417_1_)
{
this.leftLegRotation = p_175417_1_;
this.dataWatcher.updateObject(15, p_175417_1_);
}
public void setRightLegRotation(Rotations p_175427_1_)
{
this.rightLegRotation = p_175427_1_;
this.dataWatcher.updateObject(16, p_175427_1_);
}
public Rotations getHeadRotation()
{
return this.headRotation;
}
public Rotations getBodyRotation()
{
return this.bodyRotation;
}
}