package net.minecraft.entity;
import java.util.Iterator;
import java.util.List;
import net.minecraft.block.Block;
import net.minecraft.block.BlockRedstoneDiode;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.BlockPos;
import net.minecraft.util.DamageSource;
import net.minecraft.util.EnumFacing;
import net.minecraft.world.World;
import org.apache.commons.lang3.Validate;
public abstract class EntityHanging extends Entity
{
private int tickCounter1;
protected BlockPos field_174861_a;
public EnumFacing field_174860_b;
private static final String __OBFID = "CL_00001546";
public EntityHanging(World worldIn)
{
super(worldIn);
this.setSize(0.5F, 0.5F);
}
public EntityHanging(World worldIn, BlockPos p_i45853_2_)
{
this(worldIn);
this.field_174861_a = p_i45853_2_;
}
protected void entityInit() {}
protected void func_174859_a(EnumFacing p_174859_1_)
{
Validate.notNull(p_174859_1_);
Validate.isTrue(p_174859_1_.getAxis().isHorizontal());
this.field_174860_b = p_174859_1_;
this.prevRotationYaw = this.rotationYaw = (float)(this.field_174860_b.getHorizontalIndex() * 90);
this.func_174856_o();
}
private void func_174856_o()
{
if (this.field_174860_b != null)
{
double var1 = (double)this.field_174861_a.getX() + 0.5D;
double var3 = (double)this.field_174861_a.getY() + 0.5D;
double var5 = (double)this.field_174861_a.getZ() + 0.5D;
double var7 = 0.46875D;
double var9 = this.func_174858_a(this.getWidthPixels());
double var11 = this.func_174858_a(this.getHeightPixels());
var1 -= (double)this.field_174860_b.getFrontOffsetX() * 0.46875D;
var5 -= (double)this.field_174860_b.getFrontOffsetZ() * 0.46875D;
var3 += var11;
EnumFacing var13 = this.field_174860_b.rotateYCCW();
var1 += var9 * (double)var13.getFrontOffsetX();
var5 += var9 * (double)var13.getFrontOffsetZ();
this.posX = var1;
this.posY = var3;
this.posZ = var5;
double var14 = (double)this.getWidthPixels();
double var16 = (double)this.getHeightPixels();
double var18 = (double)this.getWidthPixels();
if (this.field_174860_b.getAxis() == EnumFacing.Axis.Z)
{
var18 = 1.0D;
}
else
{
var14 = 1.0D;
}
var14 /= 32.0D;
var16 /= 32.0D;
var18 /= 32.0D;
this.func_174826_a(new AxisAlignedBB(var1 - var14, var3 - var16, var5 - var18, var1 + var14, var3 + var16, var5 + var18));
}
}
private double func_174858_a(int p_174858_1_)
{
return p_174858_1_ % 32 == 0 ? 0.5D : 0.0D;
}
/**
* Called to update the entity's position/logic.
*/
public void onUpdate()
{
this.prevPosX = this.posX;
this.prevPosY = this.posY;
this.prevPosZ = this.posZ;
if (this.tickCounter1++ == 100 && !this.worldObj.isRemote)
{
this.tickCounter1 = 0;
if (!this.isDead && !this.onValidSurface())
{
this.setDead();
this.onBroken((Entity)null);
}
}
}
/**
* checks to make sure painting can be placed there
*/
public boolean onValidSurface()
{
if (!this.worldObj.getCollidingBoundingBoxes(this, this.getEntityBoundingBox()).isEmpty())
{
return false;
}
else
{
int var1 = Math.max(1, this.getWidthPixels() / 16);
int var2 = Math.max(1, this.getHeightPixels() / 16);
BlockPos var3 = this.field_174861_a.offset(this.field_174860_b.getOpposite());
EnumFacing var4 = this.field_174860_b.rotateYCCW();
for (int var5 = 0; var5 < var1; ++var5)
{
for (int var6 = 0; var6 < var2; ++var6)
{
BlockPos var7 = var3.offset(var4, var5).offsetUp(var6);
Block var8 = this.worldObj.getBlockState(var7).getBlock();
if (!var8.getMaterial().isSolid() && !BlockRedstoneDiode.isRedstoneRepeaterBlockID(var8))
{
return false;
}
}
}
List var9 = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.getEntityBoundingBox());
Iterator var10 = var9.iterator();
Entity var11;
do
{
if (!var10.hasNext())
{
return true;
}
var11 = (Entity)var10.next();
}
while (!(var11 instanceof EntityHanging));
return false;
}
}
/**
* Returns true if other Entities should be prevented from moving through this Entity.
*/
public boolean canBeCollidedWith()
{
return true;
}
/**
* Called when a player attacks an entity. If this returns true the attack will not happen.
*/
public boolean hitByEntity(Entity entityIn)
{
return entityIn instanceof EntityPlayer ? this.attackEntityFrom(DamageSource.causePlayerDamage((EntityPlayer)entityIn), 0.0F) : false;
}
public EnumFacing func_174811_aO()
{
return this.field_174860_b;
}
/**
* Called when the entity is attacked.
*/
public boolean attackEntityFrom(DamageSource source, float amount)
{
if (this.func_180431_b(source))
{
return false;
}
else
{
if (!this.isDead && !this.worldObj.isRemote)
{
this.setDead();
this.setBeenAttacked();
this.onBroken(source.getEntity());
}
return true;
}
}
/**
* Tries to moves the entity by the passed in displacement. Args: x, y, z
*/
public void moveEntity(double x, double y, double z)
{
if (!this.worldObj.isRemote && !this.isDead && x * x + y * y + z * z > 0.0D)
{
this.setDead();
this.onBroken((Entity)null);
}
}
/**
* Adds to the current velocity of the entity. Args: x, y, z
*/
public void addVelocity(double x, double y, double z)
{
if (!this.worldObj.isRemote && !this.isDead && x * x + y * y + z * z > 0.0D)
{
this.setDead();
this.onBroken((Entity)null);
}
}
/**
* (abstract) Protected helper method to write subclass entity data to NBT.
*/
public void writeEntityToNBT(NBTTagCompound tagCompound)
{
tagCompound.setByte("Facing", (byte)this.field_174860_b.getHorizontalIndex());
tagCompound.setInteger("TileX", this.func_174857_n().getX());
tagCompound.setInteger("TileY", this.func_174857_n().getY());
tagCompound.setInteger("TileZ", this.func_174857_n().getZ());
}
/**
* (abstract) Protected helper method to read subclass entity data from NBT.
*/
public void readEntityFromNBT(NBTTagCompound tagCompund)
{
this.field_174861_a = new BlockPos(tagCompund.getInteger("TileX"), tagCompund.getInteger("TileY"), tagCompund.getInteger("TileZ"));
EnumFacing var2;
if (tagCompund.hasKey("Direction", 99))
{
var2 = EnumFacing.getHorizontal(tagCompund.getByte("Direction"));
this.field_174861_a = this.field_174861_a.offset(var2);
}
else if (tagCompund.hasKey("Facing", 99))
{
var2 = EnumFacing.getHorizontal(tagCompund.getByte("Facing"));
}
else
{
var2 = EnumFacing.getHorizontal(tagCompund.getByte("Dir"));
}
this.func_174859_a(var2);
}
public abstract int getWidthPixels();
public abstract int getHeightPixels();
/**
* Called when this entity is broken. Entity parameter may be null.
*/
public abstract void onBroken(Entity p_110128_1_);
protected boolean shouldSetPosAfterLoading()
{
return false;
}
/**
* Sets the x,y,z of the entity from the given parameters. Also seems to set up a bounding box.
*/
public void setPosition(double x, double y, double z)
{
this.posX = x;
this.posY = y;
this.posZ = z;
BlockPos var7 = this.field_174861_a;
this.field_174861_a = new BlockPos(x, y, z);
if (!this.field_174861_a.equals(var7))
{
this.func_174856_o();
this.isAirBorne = true;
}
}
public BlockPos func_174857_n()
{
return this.field_174861_a;
}
}