package net.minecraft.entity;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
import java.util.UUID;
import java.util.concurrent.Callable;
import net.minecraft.block.Block;
import net.minecraft.block.BlockFence;
import net.minecraft.block.BlockFenceGate;
import net.minecraft.block.BlockLiquid;
import net.minecraft.block.BlockWall;
import net.minecraft.block.material.Material;
import net.minecraft.block.state.IBlockState;
import net.minecraft.command.CommandResultStats;
import net.minecraft.command.ICommandSender;
import net.minecraft.crash.CrashReport;
import net.minecraft.crash.CrashReportCategory;
import net.minecraft.enchantment.EnchantmentHelper;
import net.minecraft.enchantment.EnchantmentProtection;
import net.minecraft.entity.effect.EntityLightningBolt;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.event.HoverEvent;
import net.minecraft.init.Blocks;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagDouble;
import net.minecraft.nbt.NBTTagFloat;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.server.MinecraftServer;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.BlockPos;
import net.minecraft.util.ChatComponentText;
import net.minecraft.util.DamageSource;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.EnumParticleTypes;
import net.minecraft.util.IChatComponent;
import net.minecraft.util.MathHelper;
import net.minecraft.util.ReportedException;
import net.minecraft.util.StatCollector;
import net.minecraft.util.Vec3;
import net.minecraft.world.Explosion;
import net.minecraft.world.World;
import net.minecraft.world.WorldServer;
public abstract class Entity implements ICommandSender
{
private static final AxisAlignedBB field_174836_a = new AxisAlignedBB(0.0D, 0.0D, 0.0D, 0.0D, 0.0D, 0.0D);
private static int nextEntityID;
private int entityId;
public double renderDistanceWeight;
/**
* Blocks entities from spawning when they do their AABB check to make sure the spot is clear of entities that can
* prevent spawning.
*/
public boolean preventEntitySpawning;
/** The entity that is riding this entity */
public Entity riddenByEntity;
/** The entity we are currently riding */
public Entity ridingEntity;
public boolean forceSpawn;
/** Reference to the World object. */
public World worldObj;
public double prevPosX;
public double prevPosY;
public double prevPosZ;
/** Entity position X */
public double posX;
/** Entity position Y */
public double posY;
/** Entity position Z */
public double posZ;
/** Entity motion X */
public double motionX;
/** Entity motion Y */
public double motionY;
/** Entity motion Z */
public double motionZ;
/** Entity rotation Yaw */
public float rotationYaw;
/** Entity rotation Pitch */
public float rotationPitch;
public float prevRotationYaw;
public float prevRotationPitch;
/** Axis aligned bounding box. */
private AxisAlignedBB boundingBox;
public boolean onGround;
/**
* True if after a move this entity has collided with something on X- or Z-axis
*/
public boolean isCollidedHorizontally;
/**
* True if after a move this entity has collided with something on Y-axis
*/
public boolean isCollidedVertically;
/**
* True if after a move this entity has collided with something either vertically or horizontally
*/
public boolean isCollided;
public boolean velocityChanged;
protected boolean isInWeb;
private boolean isOutsideBorder;
/**
* gets set by setEntityDead, so this must be the flag whether an Entity is dead (inactive may be better term)
*/
public boolean isDead;
/** How wide this entity is considered to be */
public float width;
/** How high this entity is considered to be */
public float height;
/** The previous ticks distance walked multiplied by 0.6 */
public float prevDistanceWalkedModified;
/** The distance walked multiplied by 0.6 */
public float distanceWalkedModified;
public float distanceWalkedOnStepModified;
public float fallDistance;
/**
* The distance that has to be exceeded in order to triger a new step sound and an onEntityWalking event on a block
*/
private int nextStepDistance;
/**
* The entity's X coordinate at the previous tick, used to calculate position during rendering routines
*/
public double lastTickPosX;
/**
* The entity's Y coordinate at the previous tick, used to calculate position during rendering routines
*/
public double lastTickPosY;
/**
* The entity's Z coordinate at the previous tick, used to calculate position during rendering routines
*/
public double lastTickPosZ;
/**
* How high this entity can step up when running into a block to try to get over it (currently make note the entity
* will always step up this amount and not just the amount needed)
*/
public float stepHeight;
/**
* Whether this entity won't clip with collision or not (make note it won't disable gravity)
*/
public boolean noClip;
/**
* Reduces the velocity applied by entity collisions by the specified percent.
*/
public float entityCollisionReduction;
protected Random rand;
/** How many ticks has this entity had ran since being alive */
public int ticksExisted;
/**
* The amount of ticks you have to stand inside of fire before be set on fire
*/
public int fireResistance;
private int fire;
/**
* Whether this entity is currently inside of water (if it handles water movement that is)
*/
protected boolean inWater;
/**
* Remaining time an entity will be "immune" to further damage after being hurt.
*/
public int hurtResistantTime;
protected boolean firstUpdate;
protected boolean isImmuneToFire;
protected DataWatcher dataWatcher;
private double entityRiderPitchDelta;
private double entityRiderYawDelta;
/** Has this entity been added to the chunk its within */
public boolean addedToChunk;
public int chunkCoordX;
public int chunkCoordY;
public int chunkCoordZ;
/**
* Render entity even if it is outside the camera frustum. Only true in EntityFish for now. Used in RenderGlobal:
* render if ignoreFrustumCheck or in frustum.
*/
public boolean ignoreFrustumCheck;
public boolean isAirBorne;
public int timeUntilPortal;
/** Whether the entity is inside a Portal */
protected boolean inPortal;
protected int portalCounter;
/** Which dimension the player is in (-1 = the Nether, 0 = normal world) */
public int dimension;
protected int teleportDirection;
private boolean invulnerable;
protected UUID entityUniqueID;
private final CommandResultStats field_174837_as;
private static final String __OBFID = "CL_00001533";
public int getEntityId()
{
return this.entityId;
}
public void setEntityId(int id)
{
this.entityId = id;
}
public void func_174812_G()
{
this.setDead();
}
public Entity(World worldIn)
{
this.entityId = nextEntityID++;
this.renderDistanceWeight = 1.0D;
this.boundingBox = field_174836_a;
this.width = 0.6F;
this.height = 1.8F;
this.nextStepDistance = 1;
this.rand = new Random();
this.fireResistance = 1;
this.firstUpdate = true;
this.entityUniqueID = MathHelper.func_180182_a(this.rand);
this.field_174837_as = new CommandResultStats();
this.worldObj = worldIn;
this.setPosition(0.0D, 0.0D, 0.0D);
if (worldIn != null)
{
this.dimension = worldIn.provider.getDimensionId();
}
this.dataWatcher = new DataWatcher(this);
this.dataWatcher.addObject(0, Byte.valueOf((byte)0));
this.dataWatcher.addObject(1, Short.valueOf((short)300));
this.dataWatcher.addObject(3, Byte.valueOf((byte)0));
this.dataWatcher.addObject(2, "");
this.dataWatcher.addObject(4, Byte.valueOf((byte)0));
this.entityInit();
}
protected abstract void entityInit();
public DataWatcher getDataWatcher()
{
return this.dataWatcher;
}
public boolean equals(Object p_equals_1_)
{
return p_equals_1_ instanceof Entity ? ((Entity)p_equals_1_).entityId == this.entityId : false;
}
public int hashCode()
{
return this.entityId;
}
/**
* Will get destroyed next tick.
*/
public void setDead()
{
this.isDead = true;
}
/**
* Sets the width and height of the entity. Args: width, height
*/
protected void setSize(float width, float height)
{
if (width != this.width || height != this.height)
{
float var3 = this.width;
this.width = width;
this.height = height;
this.func_174826_a(new AxisAlignedBB(this.getEntityBoundingBox().minX, this.getEntityBoundingBox().minY, this.getEntityBoundingBox().minZ, this.getEntityBoundingBox().minX + (double)this.width, this.getEntityBoundingBox().minY + (double)this.height, this.getEntityBoundingBox().minZ + (double)this.width));
if (this.width > var3 && !this.firstUpdate && !this.worldObj.isRemote)
{
this.moveEntity((double)(var3 - this.width), 0.0D, (double)(var3 - this.width));
}
}
}
/**
* Sets the rotation of the entity. Args: yaw, pitch (both in degrees)
*/
protected void setRotation(float yaw, float pitch)
{
this.rotationYaw = yaw % 360.0F;
this.rotationPitch = pitch % 360.0F;
}
/**
* 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;
float var7 = this.width / 2.0F;
float var8 = this.height;
this.func_174826_a(new AxisAlignedBB(x - (double)var7, y, z - (double)var7, x + (double)var7, y + (double)var8, z + (double)var7));
}
/**
* Called to update the entity's position/logic.
*/
public void onUpdate()
{
this.onEntityUpdate();
}
/**
* Gets called every tick from main Entity class
*/
public void onEntityUpdate()
{
this.worldObj.theProfiler.startSection("entityBaseTick");
if (this.ridingEntity != null && this.ridingEntity.isDead)
{
this.ridingEntity = null;
}
this.prevDistanceWalkedModified = this.distanceWalkedModified;
this.prevPosX = this.posX;
this.prevPosY = this.posY;
this.prevPosZ = this.posZ;
this.prevRotationPitch = this.rotationPitch;
this.prevRotationYaw = this.rotationYaw;
if (!this.worldObj.isRemote && this.worldObj instanceof WorldServer)
{
this.worldObj.theProfiler.startSection("portal");
MinecraftServer var1 = ((WorldServer)this.worldObj).func_73046_m();
int var2 = this.getMaxInPortalTime();
if (this.inPortal)
{
if (var1.getAllowNether())
{
if (this.ridingEntity == null && this.portalCounter++ >= var2)
{
this.portalCounter = var2;
this.timeUntilPortal = this.getPortalCooldown();
byte var3;
if (this.worldObj.provider.getDimensionId() == -1)
{
var3 = 0;
}
else
{
var3 = -1;
}
this.travelToDimension(var3);
}
this.inPortal = false;
}
}
else
{
if (this.portalCounter > 0)
{
this.portalCounter -= 4;
}
if (this.portalCounter < 0)
{
this.portalCounter = 0;
}
}
if (this.timeUntilPortal > 0)
{
--this.timeUntilPortal;
}
this.worldObj.theProfiler.endSection();
}
this.func_174830_Y();
this.handleWaterMovement();
if (this.worldObj.isRemote)
{
this.fire = 0;
}
else if (this.fire > 0)
{
if (this.isImmuneToFire)
{
this.fire -= 4;
if (this.fire < 0)
{
this.fire = 0;
}
}
else
{
if (this.fire % 20 == 0)
{
this.attackEntityFrom(DamageSource.onFire, 1.0F);
}
--this.fire;
}
}
if (this.func_180799_ab())
{
this.setOnFireFromLava();
this.fallDistance *= 0.5F;
}
if (this.posY < -64.0D)
{
this.kill();
}
if (!this.worldObj.isRemote)
{
this.setFlag(0, this.fire > 0);
}
this.firstUpdate = false;
this.worldObj.theProfiler.endSection();
}
/**
* Return the amount of time this entity should stay in a portal before being transported.
*/
public int getMaxInPortalTime()
{
return 0;
}
/**
* Called whenever the entity is walking inside of lava.
*/
protected void setOnFireFromLava()
{
if (!this.isImmuneToFire)
{
this.attackEntityFrom(DamageSource.lava, 4.0F);
this.setFire(15);
}
}
/**
* Sets entity to burn for x amount of seconds, cannot lower amount of existing fire.
*/
public void setFire(int seconds)
{
int var2 = seconds * 20;
var2 = EnchantmentProtection.getFireTimeForEntity(this, var2);
if (this.fire < var2)
{
this.fire = var2;
}
}
/**
* Removes fire from entity.
*/
public void extinguish()
{
this.fire = 0;
}
/**
* sets the dead flag. Used when you fall off the bottom of the world.
*/
protected void kill()
{
this.setDead();
}
/**
* Checks if the offset position from the entity's current position is inside of liquid. Args: x, y, z
*/
public boolean isOffsetPositionInLiquid(double x, double y, double z)
{
AxisAlignedBB var7 = this.getEntityBoundingBox().offset(x, y, z);
return this.func_174809_b(var7);
}
private boolean func_174809_b(AxisAlignedBB p_174809_1_)
{
return this.worldObj.getCollidingBoundingBoxes(this, p_174809_1_).isEmpty() && !this.worldObj.isAnyLiquid(p_174809_1_);
}
/**
* 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.noClip)
{
this.func_174826_a(this.getEntityBoundingBox().offset(x, y, z));
this.func_174829_m();
}
else
{
this.worldObj.theProfiler.startSection("move");
double var7 = this.posX;
double var9 = this.posY;
double var11 = this.posZ;
if (this.isInWeb)
{
this.isInWeb = false;
x *= 0.25D;
y *= 0.05000000074505806D;
z *= 0.25D;
this.motionX = 0.0D;
this.motionY = 0.0D;
this.motionZ = 0.0D;
}
double var13 = x;
double var15 = y;
double var17 = z;
boolean var19 = this.onGround && this.isSneaking() && this instanceof EntityPlayer;
if (var19)
{
double var20;
for (var20 = 0.05D; x != 0.0D && this.worldObj.getCollidingBoundingBoxes(this, this.getEntityBoundingBox().offset(x, -1.0D, 0.0D)).isEmpty(); var13 = x)
{
if (x < var20 && x >= -var20)
{
x = 0.0D;
}
else if (x > 0.0D)
{
x -= var20;
}
else
{
x += var20;
}
}
for (; z != 0.0D && this.worldObj.getCollidingBoundingBoxes(this, this.getEntityBoundingBox().offset(0.0D, -1.0D, z)).isEmpty(); var17 = z)
{
if (z < var20 && z >= -var20)
{
z = 0.0D;
}
else if (z > 0.0D)
{
z -= var20;
}
else
{
z += var20;
}
}
for (; x != 0.0D && z != 0.0D && this.worldObj.getCollidingBoundingBoxes(this, this.getEntityBoundingBox().offset(x, -1.0D, z)).isEmpty(); var17 = z)
{
if (x < var20 && x >= -var20)
{
x = 0.0D;
}
else if (x > 0.0D)
{
x -= var20;
}
else
{
x += var20;
}
var13 = x;
if (z < var20 && z >= -var20)
{
z = 0.0D;
}
else if (z > 0.0D)
{
z -= var20;
}
else
{
z += var20;
}
}
}
List var53 = this.worldObj.getCollidingBoundingBoxes(this, this.getEntityBoundingBox().addCoord(x, y, z));
AxisAlignedBB var21 = this.getEntityBoundingBox();
AxisAlignedBB var23;
for (Iterator var22 = var53.iterator(); var22.hasNext(); y = var23.calculateYOffset(this.getEntityBoundingBox(), y))
{
var23 = (AxisAlignedBB)var22.next();
}
this.func_174826_a(this.getEntityBoundingBox().offset(0.0D, y, 0.0D));
boolean var54 = this.onGround || var15 != y && var15 < 0.0D;
AxisAlignedBB var24;
Iterator var55;
for (var55 = var53.iterator(); var55.hasNext(); x = var24.calculateXOffset(this.getEntityBoundingBox(), x))
{
var24 = (AxisAlignedBB)var55.next();
}
this.func_174826_a(this.getEntityBoundingBox().offset(x, 0.0D, 0.0D));
for (var55 = var53.iterator(); var55.hasNext(); z = var24.calculateZOffset(this.getEntityBoundingBox(), z))
{
var24 = (AxisAlignedBB)var55.next();
}
this.func_174826_a(this.getEntityBoundingBox().offset(0.0D, 0.0D, z));
if (this.stepHeight > 0.0F && var54 && (var13 != x || var17 != z))
{
double var56 = x;
double var25 = y;
double var27 = z;
AxisAlignedBB var29 = this.getEntityBoundingBox();
this.func_174826_a(var21);
y = (double)this.stepHeight;
List var30 = this.worldObj.getCollidingBoundingBoxes(this, this.getEntityBoundingBox().addCoord(var13, y, var17));
AxisAlignedBB var31 = this.getEntityBoundingBox();
AxisAlignedBB var32 = var31.addCoord(var13, 0.0D, var17);
double var33 = y;
AxisAlignedBB var36;
for (Iterator var35 = var30.iterator(); var35.hasNext(); var33 = var36.calculateYOffset(var32, var33))
{
var36 = (AxisAlignedBB)var35.next();
}
var31 = var31.offset(0.0D, var33, 0.0D);
double var67 = var13;
AxisAlignedBB var38;
for (Iterator var37 = var30.iterator(); var37.hasNext(); var67 = var38.calculateXOffset(var31, var67))
{
var38 = (AxisAlignedBB)var37.next();
}
var31 = var31.offset(var67, 0.0D, 0.0D);
double var68 = var17;
AxisAlignedBB var40;
for (Iterator var39 = var30.iterator(); var39.hasNext(); var68 = var40.calculateZOffset(var31, var68))
{
var40 = (AxisAlignedBB)var39.next();
}
var31 = var31.offset(0.0D, 0.0D, var68);
AxisAlignedBB var69 = this.getEntityBoundingBox();
double var70 = y;
AxisAlignedBB var43;
for (Iterator var42 = var30.iterator(); var42.hasNext(); var70 = var43.calculateYOffset(var69, var70))
{
var43 = (AxisAlignedBB)var42.next();
}
var69 = var69.offset(0.0D, var70, 0.0D);
double var71 = var13;
AxisAlignedBB var45;
for (Iterator var44 = var30.iterator(); var44.hasNext(); var71 = var45.calculateXOffset(var69, var71))
{
var45 = (AxisAlignedBB)var44.next();
}
var69 = var69.offset(var71, 0.0D, 0.0D);
double var72 = var17;
AxisAlignedBB var47;
for (Iterator var46 = var30.iterator(); var46.hasNext(); var72 = var47.calculateZOffset(var69, var72))
{
var47 = (AxisAlignedBB)var46.next();
}
var69 = var69.offset(0.0D, 0.0D, var72);
double var73 = var67 * var67 + var68 * var68;
double var48 = var71 * var71 + var72 * var72;
if (var73 > var48)
{
x = var67;
z = var68;
this.func_174826_a(var31);
}
else
{
x = var71;
z = var72;
this.func_174826_a(var69);
}
y = (double)(-this.stepHeight);
AxisAlignedBB var51;
for (Iterator var50 = var30.iterator(); var50.hasNext(); y = var51.calculateYOffset(this.getEntityBoundingBox(), y))
{
var51 = (AxisAlignedBB)var50.next();
}
this.func_174826_a(this.getEntityBoundingBox().offset(0.0D, y, 0.0D));
if (var56 * var56 + var27 * var27 >= x * x + z * z)
{
x = var56;
y = var25;
z = var27;
this.func_174826_a(var29);
}
}
this.worldObj.theProfiler.endSection();
this.worldObj.theProfiler.startSection("rest");
this.func_174829_m();
this.isCollidedHorizontally = var13 != x || var17 != z;
this.isCollidedVertically = var15 != y;
this.onGround = this.isCollidedVertically && var15 < 0.0D;
this.isCollided = this.isCollidedHorizontally || this.isCollidedVertically;
int var57 = MathHelper.floor_double(this.posX);
int var58 = MathHelper.floor_double(this.posY - 0.20000000298023224D);
int var59 = MathHelper.floor_double(this.posZ);
BlockPos var26 = new BlockPos(var57, var58, var59);
Block var60 = this.worldObj.getBlockState(var26).getBlock();
if (var60.getMaterial() == Material.air)
{
Block var28 = this.worldObj.getBlockState(var26.offsetDown()).getBlock();
if (var28 instanceof BlockFence || var28 instanceof BlockWall || var28 instanceof BlockFenceGate)
{
var60 = var28;
var26 = var26.offsetDown();
}
}
this.func_180433_a(y, this.onGround, var60, var26);
if (var13 != x)
{
this.motionX = 0.0D;
}
if (var17 != z)
{
this.motionZ = 0.0D;
}
if (var15 != y)
{
var60.onLanded(this.worldObj, this);
}
if (this.canTriggerWalking() && !var19 && this.ridingEntity == null)
{
double var61 = this.posX - var7;
double var64 = this.posY - var9;
double var66 = this.posZ - var11;
if (var60 != Blocks.ladder)
{
var64 = 0.0D;
}
if (var60 != null && this.onGround)
{
var60.onEntityCollidedWithBlock(this.worldObj, var26, this);
}
this.distanceWalkedModified = (float)((double)this.distanceWalkedModified + (double)MathHelper.sqrt_double(var61 * var61 + var66 * var66) * 0.6D);
this.distanceWalkedOnStepModified = (float)((double)this.distanceWalkedOnStepModified + (double)MathHelper.sqrt_double(var61 * var61 + var64 * var64 + var66 * var66) * 0.6D);
if (this.distanceWalkedOnStepModified > (float)this.nextStepDistance && var60.getMaterial() != Material.air)
{
this.nextStepDistance = (int)this.distanceWalkedOnStepModified + 1;
if (this.isInWater())
{
float var34 = MathHelper.sqrt_double(this.motionX * this.motionX * 0.20000000298023224D + this.motionY * this.motionY + this.motionZ * this.motionZ * 0.20000000298023224D) * 0.35F;
if (var34 > 1.0F)
{
var34 = 1.0F;
}
this.playSound(this.getSwimSound(), var34, 1.0F + (this.rand.nextFloat() - this.rand.nextFloat()) * 0.4F);
}
this.func_180429_a(var26, var60);
}
}
try
{
this.doBlockCollisions();
}
catch (Throwable var52)
{
CrashReport var63 = CrashReport.makeCrashReport(var52, "Checking entity block collision");
CrashReportCategory var65 = var63.makeCategory("Entity being checked for collision");
this.addEntityCrashInfo(var65);
throw new ReportedException(var63);
}
boolean var62 = this.isWet();
if (this.worldObj.func_147470_e(this.getEntityBoundingBox().contract(0.001D, 0.001D, 0.001D)))
{
this.dealFireDamage(1);
if (!var62)
{
++this.fire;
if (this.fire == 0)
{
this.setFire(8);
}
}
}
else if (this.fire <= 0)
{
this.fire = -this.fireResistance;
}
if (var62 && this.fire > 0)
{
this.playSound("random.fizz", 0.7F, 1.6F + (this.rand.nextFloat() - this.rand.nextFloat()) * 0.4F);
this.fire = -this.fireResistance;
}
this.worldObj.theProfiler.endSection();
}
}
private void func_174829_m()
{
this.posX = (this.getEntityBoundingBox().minX + this.getEntityBoundingBox().maxX) / 2.0D;
this.posY = this.getEntityBoundingBox().minY;
this.posZ = (this.getEntityBoundingBox().minZ + this.getEntityBoundingBox().maxZ) / 2.0D;
}
protected String getSwimSound()
{
return "game.neutral.swim";
}
protected void doBlockCollisions()
{
BlockPos var1 = new BlockPos(this.getEntityBoundingBox().minX + 0.001D, this.getEntityBoundingBox().minY + 0.001D, this.getEntityBoundingBox().minZ + 0.001D);
BlockPos var2 = new BlockPos(this.getEntityBoundingBox().maxX - 0.001D, this.getEntityBoundingBox().maxY - 0.001D, this.getEntityBoundingBox().maxZ - 0.001D);
if (this.worldObj.isAreaLoaded(var1, var2))
{
for (int var3 = var1.getX(); var3 <= var2.getX(); ++var3)
{
for (int var4 = var1.getY(); var4 <= var2.getY(); ++var4)
{
for (int var5 = var1.getZ(); var5 <= var2.getZ(); ++var5)
{
BlockPos var6 = new BlockPos(var3, var4, var5);
IBlockState var7 = this.worldObj.getBlockState(var6);
try
{
var7.getBlock().onEntityCollidedWithBlock(this.worldObj, var6, var7, this);
}
catch (Throwable var11)
{
CrashReport var9 = CrashReport.makeCrashReport(var11, "Colliding entity with block");
CrashReportCategory var10 = var9.makeCategory("Block being collided with");
CrashReportCategory.addBlockInfo(var10, var6, var7);
throw new ReportedException(var9);
}
}
}
}
}
}
protected void func_180429_a(BlockPos p_180429_1_, Block p_180429_2_)
{
Block.SoundType var3 = p_180429_2_.stepSound;
if (this.worldObj.getBlockState(p_180429_1_.offsetUp()).getBlock() == Blocks.snow_layer)
{
var3 = Blocks.snow_layer.stepSound;
this.playSound(var3.getStepSound(), var3.getVolume() * 0.15F, var3.getFrequency());
}
else if (!p_180429_2_.getMaterial().isLiquid())
{
this.playSound(var3.getStepSound(), var3.getVolume() * 0.15F, var3.getFrequency());
}
}
public void playSound(String name, float volume, float pitch)
{
if (!this.isSlient())
{
this.worldObj.playSoundAtEntity(this, name, volume, pitch);
}
}
/**
* @return True if this entity will not play sounds
*/
public boolean isSlient()
{
return this.dataWatcher.getWatchableObjectByte(4) == 1;
}
public void func_174810_b(boolean p_174810_1_)
{
this.dataWatcher.updateObject(4, Byte.valueOf((byte)(p_174810_1_ ? 1 : 0)));
}
/**
* returns if this entity triggers Block.onEntityWalking on the blocks they walk on. used for spiders and wolves to
* prevent them from trampling crops
*/
protected boolean canTriggerWalking()
{
return true;
}
protected void func_180433_a(double p_180433_1_, boolean p_180433_3_, Block p_180433_4_, BlockPos p_180433_5_)
{
if (p_180433_3_)
{
if (this.fallDistance > 0.0F)
{
if (p_180433_4_ != null)
{
p_180433_4_.onFallenUpon(this.worldObj, p_180433_5_, this, this.fallDistance);
}
else
{
this.fall(this.fallDistance, 1.0F);
}
this.fallDistance = 0.0F;
}
}
else if (p_180433_1_ < 0.0D)
{
this.fallDistance = (float)((double)this.fallDistance - p_180433_1_);
}
}
/**
* returns the bounding box for this entity
*/
public AxisAlignedBB getBoundingBox()
{
return null;
}
/**
* Will deal the specified amount of damage to the entity if the entity isn't immune to fire damage. Args:
* amountDamage
*/
protected void dealFireDamage(int amount)
{
if (!this.isImmuneToFire)
{
this.attackEntityFrom(DamageSource.inFire, (float)amount);
}
}
public final boolean isImmuneToFire()
{
return this.isImmuneToFire;
}
public void fall(float distance, float damageMultiplier)
{
if (this.riddenByEntity != null)
{
this.riddenByEntity.fall(distance, damageMultiplier);
}
}
/**
* Checks if this entity is either in water or on an open air block in rain (used in wolves).
*/
public boolean isWet()
{
return this.inWater || this.worldObj.func_175727_C(new BlockPos(this.posX, this.posY, this.posZ)) || this.worldObj.func_175727_C(new BlockPos(this.posX, this.posY + (double)this.height, this.posZ));
}
/**
* Checks if this entity is inside water (if inWater field is true as a result of handleWaterMovement() returning
* true)
*/
public boolean isInWater()
{
return this.inWater;
}
/**
* Returns if this entity is in water and will end up adding the waters velocity to the entity
*/
public boolean handleWaterMovement()
{
if (this.worldObj.handleMaterialAcceleration(this.getEntityBoundingBox().expand(0.0D, -0.4000000059604645D, 0.0D).contract(0.001D, 0.001D, 0.001D), Material.water, this))
{
if (!this.inWater && !this.firstUpdate)
{
this.resetHeight();
}
this.fallDistance = 0.0F;
this.inWater = true;
this.fire = 0;
}
else
{
this.inWater = false;
}
return this.inWater;
}
/**
* sets the players height back to normal after doing things like sleeping and dieing
*/
protected void resetHeight()
{
float var1 = MathHelper.sqrt_double(this.motionX * this.motionX * 0.20000000298023224D + this.motionY * this.motionY + this.motionZ * this.motionZ * 0.20000000298023224D) * 0.2F;
if (var1 > 1.0F)
{
var1 = 1.0F;
}
this.playSound(this.getSplashSound(), var1, 1.0F + (this.rand.nextFloat() - this.rand.nextFloat()) * 0.4F);
float var2 = (float)MathHelper.floor_double(this.getEntityBoundingBox().minY);
int var3;
float var4;
float var5;
for (var3 = 0; (float)var3 < 1.0F + this.width * 20.0F; ++var3)
{
var4 = (this.rand.nextFloat() * 2.0F - 1.0F) * this.width;
var5 = (this.rand.nextFloat() * 2.0F - 1.0F) * this.width;
this.worldObj.spawnParticle(EnumParticleTypes.WATER_BUBBLE, this.posX + (double)var4, (double)(var2 + 1.0F), this.posZ + (double)var5, this.motionX, this.motionY - (double)(this.rand.nextFloat() * 0.2F), this.motionZ, new int[0]);
}
for (var3 = 0; (float)var3 < 1.0F + this.width * 20.0F; ++var3)
{
var4 = (this.rand.nextFloat() * 2.0F - 1.0F) * this.width;
var5 = (this.rand.nextFloat() * 2.0F - 1.0F) * this.width;
this.worldObj.spawnParticle(EnumParticleTypes.WATER_SPLASH, this.posX + (double)var4, (double)(var2 + 1.0F), this.posZ + (double)var5, this.motionX, this.motionY, this.motionZ, new int[0]);
}
}
public void func_174830_Y()
{
if (this.isSprinting() && !this.isInWater())
{
this.func_174808_Z();
}
}
protected void func_174808_Z()
{
int var1 = MathHelper.floor_double(this.posX);
int var2 = MathHelper.floor_double(this.posY - 0.20000000298023224D);
int var3 = MathHelper.floor_double(this.posZ);
BlockPos var4 = new BlockPos(var1, var2, var3);
IBlockState var5 = this.worldObj.getBlockState(var4);
Block var6 = var5.getBlock();
if (var6.getRenderType() != -1)
{
this.worldObj.spawnParticle(EnumParticleTypes.BLOCK_CRACK, this.posX + ((double)this.rand.nextFloat() - 0.5D) * (double)this.width, this.getEntityBoundingBox().minY + 0.1D, this.posZ + ((double)this.rand.nextFloat() - 0.5D) * (double)this.width, -this.motionX * 4.0D, 1.5D, -this.motionZ * 4.0D, new int[] {Block.getStateId(var5)});
}
}
protected String getSplashSound()
{
return "game.neutral.swim.splash";
}
/**
* Checks if the current block the entity is within of the specified material type
*/
public boolean isInsideOfMaterial(Material materialIn)
{
double var2 = this.posY + (double)this.getEyeHeight();
BlockPos var4 = new BlockPos(this.posX, var2, this.posZ);
IBlockState var5 = this.worldObj.getBlockState(var4);
Block var6 = var5.getBlock();
if (var6.getMaterial() == materialIn)
{
float var7 = BlockLiquid.getLiquidHeightPercent(var5.getBlock().getMetaFromState(var5)) - 0.11111111F;
float var8 = (float)(var4.getY() + 1) - var7;
boolean var9 = var2 < (double)var8;
return !var9 && this instanceof EntityPlayer ? false : var9;
}
else
{
return false;
}
}
public boolean func_180799_ab()
{
return this.worldObj.isMaterialInBB(this.getEntityBoundingBox().expand(-0.10000000149011612D, -0.4000000059604645D, -0.10000000149011612D), Material.lava);
}
/**
* Used in both water and by flying objects
*/
public void moveFlying(float strafe, float forward, float friction)
{
float var4 = strafe * strafe + forward * forward;
if (var4 >= 1.0E-4F)
{
var4 = MathHelper.sqrt_float(var4);
if (var4 < 1.0F)
{
var4 = 1.0F;
}
var4 = friction / var4;
strafe *= var4;
forward *= var4;
float var5 = MathHelper.sin(this.rotationYaw * (float)Math.PI / 180.0F);
float var6 = MathHelper.cos(this.rotationYaw * (float)Math.PI / 180.0F);
this.motionX += (double)(strafe * var6 - forward * var5);
this.motionZ += (double)(forward * var6 + strafe * var5);
}
}
/**
* Gets how bright this entity is.
*/
public float getBrightness(float p_70013_1_)
{
BlockPos var2 = new BlockPos(this.posX, 0.0D, this.posZ);
if (this.worldObj.isBlockLoaded(var2))
{
double var3 = (this.getEntityBoundingBox().maxY - this.getEntityBoundingBox().minY) * 0.66D;
int var5 = MathHelper.floor_double(this.posY + var3);
return this.worldObj.getLightBrightness(var2.offsetUp(var5));
}
else
{
return 0.0F;
}
}
/**
* Sets the reference to the World object.
*/
public void setWorld(World worldIn)
{
this.worldObj = worldIn;
}
/**
* Sets the entity's position and rotation.
*/
public void setPositionAndRotation(double x, double y, double z, float yaw, float pitch)
{
this.prevPosX = this.posX = x;
this.prevPosY = this.posY = y;
this.prevPosZ = this.posZ = z;
this.prevRotationYaw = this.rotationYaw = yaw;
this.prevRotationPitch = this.rotationPitch = pitch;
double var9 = (double)(this.prevRotationYaw - yaw);
if (var9 < -180.0D)
{
this.prevRotationYaw += 360.0F;
}
if (var9 >= 180.0D)
{
this.prevRotationYaw -= 360.0F;
}
this.setPosition(this.posX, this.posY, this.posZ);
this.setRotation(yaw, pitch);
}
public void func_174828_a(BlockPos p_174828_1_, float p_174828_2_, float p_174828_3_)
{
this.setLocationAndAngles((double)p_174828_1_.getX() + 0.5D, (double)p_174828_1_.getY(), (double)p_174828_1_.getZ() + 0.5D, p_174828_2_, p_174828_3_);
}
/**
* Sets the location and Yaw/Pitch of an entity in the world
*/
public void setLocationAndAngles(double x, double y, double z, float yaw, float pitch)
{
this.lastTickPosX = this.prevPosX = this.posX = x;
this.lastTickPosY = this.prevPosY = this.posY = y;
this.lastTickPosZ = this.prevPosZ = this.posZ = z;
this.rotationYaw = yaw;
this.rotationPitch = pitch;
this.setPosition(this.posX, this.posY, this.posZ);
}
/**
* Returns the distance to the entity. Args: entity
*/
public float getDistanceToEntity(Entity entityIn)
{
float var2 = (float)(this.posX - entityIn.posX);
float var3 = (float)(this.posY - entityIn.posY);
float var4 = (float)(this.posZ - entityIn.posZ);
return MathHelper.sqrt_float(var2 * var2 + var3 * var3 + var4 * var4);
}
/**
* Gets the squared distance to the position. Args: x, y, z
*/
public double getDistanceSq(double x, double y, double z)
{
double var7 = this.posX - x;
double var9 = this.posY - y;
double var11 = this.posZ - z;
return var7 * var7 + var9 * var9 + var11 * var11;
}
public double getDistanceSq(BlockPos p_174818_1_)
{
return p_174818_1_.distanceSq(this.posX, this.posY, this.posZ);
}
public double func_174831_c(BlockPos p_174831_1_)
{
return p_174831_1_.distanceSqToCenter(this.posX, this.posY, this.posZ);
}
/**
* Gets the distance to the position. Args: x, y, z
*/
public double getDistance(double x, double y, double z)
{
double var7 = this.posX - x;
double var9 = this.posY - y;
double var11 = this.posZ - z;
return (double)MathHelper.sqrt_double(var7 * var7 + var9 * var9 + var11 * var11);
}
/**
* Returns the squared distance to the entity. Args: entity
*/
public double getDistanceSqToEntity(Entity entityIn)
{
double var2 = this.posX - entityIn.posX;
double var4 = this.posY - entityIn.posY;
double var6 = this.posZ - entityIn.posZ;
return var2 * var2 + var4 * var4 + var6 * var6;
}
/**
* Called by a player entity when they collide with an entity
*/
public void onCollideWithPlayer(EntityPlayer entityIn) {}
/**
* Applies a velocity to each of the entities pushing them away from each other. Args: entity
*/
public void applyEntityCollision(Entity entityIn)
{
if (entityIn.riddenByEntity != this && entityIn.ridingEntity != this)
{
if (!entityIn.noClip && !this.noClip)
{
double var2 = entityIn.posX - this.posX;
double var4 = entityIn.posZ - this.posZ;
double var6 = MathHelper.abs_max(var2, var4);
if (var6 >= 0.009999999776482582D)
{
var6 = (double)MathHelper.sqrt_double(var6);
var2 /= var6;
var4 /= var6;
double var8 = 1.0D / var6;
if (var8 > 1.0D)
{
var8 = 1.0D;
}
var2 *= var8;
var4 *= var8;
var2 *= 0.05000000074505806D;
var4 *= 0.05000000074505806D;
var2 *= (double)(1.0F - this.entityCollisionReduction);
var4 *= (double)(1.0F - this.entityCollisionReduction);
if (this.riddenByEntity == null)
{
this.addVelocity(-var2, 0.0D, -var4);
}
if (entityIn.riddenByEntity == null)
{
entityIn.addVelocity(var2, 0.0D, var4);
}
}
}
}
}
/**
* Adds to the current velocity of the entity. Args: x, y, z
*/
public void addVelocity(double x, double y, double z)
{
this.motionX += x;
this.motionY += y;
this.motionZ += z;
this.isAirBorne = true;
}
/**
* Sets that this entity has been attacked.
*/
protected void setBeenAttacked()
{
this.velocityChanged = true;
}
/**
* Called when the entity is attacked.
*/
public boolean attackEntityFrom(DamageSource source, float amount)
{
if (this.func_180431_b(source))
{
return false;
}
else
{
this.setBeenAttacked();
return false;
}
}
/**
* interpolated look vector
*/
public Vec3 getLook(float p_70676_1_)
{
if (p_70676_1_ == 1.0F)
{
return this.func_174806_f(this.rotationPitch, this.rotationYaw);
}
else
{
float var2 = this.prevRotationPitch + (this.rotationPitch - this.prevRotationPitch) * p_70676_1_;
float var3 = this.prevRotationYaw + (this.rotationYaw - this.prevRotationYaw) * p_70676_1_;
return this.func_174806_f(var2, var3);
}
}
protected final Vec3 func_174806_f(float p_174806_1_, float p_174806_2_)
{
float var3 = MathHelper.cos(-p_174806_2_ * 0.017453292F - (float)Math.PI);
float var4 = MathHelper.sin(-p_174806_2_ * 0.017453292F - (float)Math.PI);
float var5 = -MathHelper.cos(-p_174806_1_ * 0.017453292F);
float var6 = MathHelper.sin(-p_174806_1_ * 0.017453292F);
return new Vec3((double)(var4 * var5), (double)var6, (double)(var3 * var5));
}
/**
* Returns true if other Entities should be prevented from moving through this Entity.
*/
public boolean canBeCollidedWith()
{
return false;
}
/**
* Returns true if this entity should push and be pushed by other entities when colliding.
*/
public boolean canBePushed()
{
return false;
}
/**
* Adds a value to the player score. Currently not actually used and the entity passed in does nothing. Args:
* entity, scoreToAdd
*/
public void addToPlayerScore(Entity entityIn, int amount) {}
/**
* Like writeToNBTOptional but does not check if the entity is ridden. Used for saving ridden entities with their
* riders.
*/
public boolean writeMountToNBT(NBTTagCompound tagCompund)
{
String var2 = this.getEntityString();
if (!this.isDead && var2 != null)
{
tagCompund.setString("id", var2);
this.writeToNBT(tagCompund);
return true;
}
else
{
return false;
}
}
/**
* Either write this entity to the NBT tag given and return true, or return false without doing anything. If this
* returns false the entity is not saved on disk. Ridden entities return false here as they are saved with their
* rider.
*/
public boolean writeToNBTOptional(NBTTagCompound tagCompund)
{
String var2 = this.getEntityString();
if (!this.isDead && var2 != null && this.riddenByEntity == null)
{
tagCompund.setString("id", var2);
this.writeToNBT(tagCompund);
return true;
}
else
{
return false;
}
}
/**
* Save the entity to NBT (calls an abstract helper method to write extra data)
*/
public void writeToNBT(NBTTagCompound tagCompund)
{
try
{
tagCompund.setTag("Pos", this.newDoubleNBTList(new double[] {this.posX, this.posY, this.posZ}));
tagCompund.setTag("Motion", this.newDoubleNBTList(new double[] {this.motionX, this.motionY, this.motionZ}));
tagCompund.setTag("Rotation", this.newFloatNBTList(new float[] {this.rotationYaw, this.rotationPitch}));
tagCompund.setFloat("FallDistance", this.fallDistance);
tagCompund.setShort("Fire", (short)this.fire);
tagCompund.setShort("Air", (short)this.getAir());
tagCompund.setBoolean("OnGround", this.onGround);
tagCompund.setInteger("Dimension", this.dimension);
tagCompund.setBoolean("Invulnerable", this.invulnerable);
tagCompund.setInteger("PortalCooldown", this.timeUntilPortal);
tagCompund.setLong("UUIDMost", this.getUniqueID().getMostSignificantBits());
tagCompund.setLong("UUIDLeast", this.getUniqueID().getLeastSignificantBits());
if (this.getCustomNameTag() != null && this.getCustomNameTag().length() > 0)
{
tagCompund.setString("CustomName", this.getCustomNameTag());
tagCompund.setBoolean("CustomNameVisible", this.getAlwaysRenderNameTag());
}
this.field_174837_as.func_179670_b(tagCompund);
if (this.isSlient())
{
tagCompund.setBoolean("Silent", this.isSlient());
}
this.writeEntityToNBT(tagCompund);
if (this.ridingEntity != null)
{
NBTTagCompound var2 = new NBTTagCompound();
if (this.ridingEntity.writeMountToNBT(var2))
{
tagCompund.setTag("Riding", var2);
}
}
}
catch (Throwable var5)
{
CrashReport var3 = CrashReport.makeCrashReport(var5, "Saving entity NBT");
CrashReportCategory var4 = var3.makeCategory("Entity being saved");
this.addEntityCrashInfo(var4);
throw new ReportedException(var3);
}
}
/**
* Reads the entity from NBT (calls an abstract helper method to read specialized data)
*/
public void readFromNBT(NBTTagCompound tagCompund)
{
try
{
NBTTagList var2 = tagCompund.getTagList("Pos", 6);
NBTTagList var6 = tagCompund.getTagList("Motion", 6);
NBTTagList var7 = tagCompund.getTagList("Rotation", 5);
this.motionX = var6.getDouble(0);
this.motionY = var6.getDouble(1);
this.motionZ = var6.getDouble(2);
if (Math.abs(this.motionX) > 10.0D)
{
this.motionX = 0.0D;
}
if (Math.abs(this.motionY) > 10.0D)
{
this.motionY = 0.0D;
}
if (Math.abs(this.motionZ) > 10.0D)
{
this.motionZ = 0.0D;
}
this.prevPosX = this.lastTickPosX = this.posX = var2.getDouble(0);
this.prevPosY = this.lastTickPosY = this.posY = var2.getDouble(1);
this.prevPosZ = this.lastTickPosZ = this.posZ = var2.getDouble(2);
this.prevRotationYaw = this.rotationYaw = var7.getFloat(0);
this.prevRotationPitch = this.rotationPitch = var7.getFloat(1);
this.fallDistance = tagCompund.getFloat("FallDistance");
this.fire = tagCompund.getShort("Fire");
this.setAir(tagCompund.getShort("Air"));
this.onGround = tagCompund.getBoolean("OnGround");
this.dimension = tagCompund.getInteger("Dimension");
this.invulnerable = tagCompund.getBoolean("Invulnerable");
this.timeUntilPortal = tagCompund.getInteger("PortalCooldown");
if (tagCompund.hasKey("UUIDMost", 4) && tagCompund.hasKey("UUIDLeast", 4))
{
this.entityUniqueID = new UUID(tagCompund.getLong("UUIDMost"), tagCompund.getLong("UUIDLeast"));
}
else if (tagCompund.hasKey("UUID", 8))
{
this.entityUniqueID = UUID.fromString(tagCompund.getString("UUID"));
}
this.setPosition(this.posX, this.posY, this.posZ);
this.setRotation(this.rotationYaw, this.rotationPitch);
if (tagCompund.hasKey("CustomName", 8) && tagCompund.getString("CustomName").length() > 0)
{
this.setCustomNameTag(tagCompund.getString("CustomName"));
}
this.setAlwaysRenderNameTag(tagCompund.getBoolean("CustomNameVisible"));
this.field_174837_as.func_179668_a(tagCompund);
this.func_174810_b(tagCompund.getBoolean("Silent"));
this.readEntityFromNBT(tagCompund);
if (this.shouldSetPosAfterLoading())
{
this.setPosition(this.posX, this.posY, this.posZ);
}
}
catch (Throwable var5)
{
CrashReport var3 = CrashReport.makeCrashReport(var5, "Loading entity NBT");
CrashReportCategory var4 = var3.makeCategory("Entity being loaded");
this.addEntityCrashInfo(var4);
throw new ReportedException(var3);
}
}
protected boolean shouldSetPosAfterLoading()
{
return true;
}
/**
* Returns the string that identifies this Entity's class
*/
protected final String getEntityString()
{
return EntityList.getEntityString(this);
}
/**
* (abstract) Protected helper method to read subclass entity data from NBT.
*/
protected abstract void readEntityFromNBT(NBTTagCompound tagCompund);
/**
* (abstract) Protected helper method to write subclass entity data to NBT.
*/
protected abstract void writeEntityToNBT(NBTTagCompound tagCompound);
public void onChunkLoad() {}
/**
* creates a NBT list from the array of doubles passed to this function
*/
protected NBTTagList newDoubleNBTList(double ... numbers)
{
NBTTagList var2 = new NBTTagList();
double[] var3 = numbers;
int var4 = numbers.length;
for (int var5 = 0; var5 < var4; ++var5)
{
double var6 = var3[var5];
var2.appendTag(new NBTTagDouble(var6));
}
return var2;
}
/**
* Returns a new NBTTagList filled with the specified floats
*/
protected NBTTagList newFloatNBTList(float ... numbers)
{
NBTTagList var2 = new NBTTagList();
float[] var3 = numbers;
int var4 = numbers.length;
for (int var5 = 0; var5 < var4; ++var5)
{
float var6 = var3[var5];
var2.appendTag(new NBTTagFloat(var6));
}
return var2;
}
public EntityItem dropItem(Item itemIn, int size)
{
return this.dropItemWithOffset(itemIn, size, 0.0F);
}
public EntityItem dropItemWithOffset(Item itemIn, int size, float p_145778_3_)
{
return this.entityDropItem(new ItemStack(itemIn, size, 0), p_145778_3_);
}
/**
* Drops an item at the position of the entity.
*/
public EntityItem entityDropItem(ItemStack itemStackIn, float offsetY)
{
if (itemStackIn.stackSize != 0 && itemStackIn.getItem() != null)
{
EntityItem var3 = new EntityItem(this.worldObj, this.posX, this.posY + (double)offsetY, this.posZ, itemStackIn);
var3.setDefaultPickupDelay();
this.worldObj.spawnEntityInWorld(var3);
return var3;
}
else
{
return null;
}
}
/**
* Checks whether target entity is alive.
*/
public boolean isEntityAlive()
{
return !this.isDead;
}
/**
* Checks if this entity is inside of an opaque block
*/
public boolean isEntityInsideOpaqueBlock()
{
if (this.noClip)
{
return false;
}
else
{
for (int var1 = 0; var1 < 8; ++var1)
{
double var2 = this.posX + (double)(((float)((var1 >> 0) % 2) - 0.5F) * this.width * 0.8F);
double var4 = this.posY + (double)(((float)((var1 >> 1) % 2) - 0.5F) * 0.1F);
double var6 = this.posZ + (double)(((float)((var1 >> 2) % 2) - 0.5F) * this.width * 0.8F);
if (this.worldObj.getBlockState(new BlockPos(var2, var4 + (double)this.getEyeHeight(), var6)).getBlock().isVisuallyOpaque())
{
return true;
}
}
return false;
}
}
/**
* First layer of player interaction
*/
public boolean interactFirst(EntityPlayer playerIn)
{
return false;
}
/**
* Returns a boundingBox used to collide the entity with other entities and blocks. This enables the entity to be
* pushable on contact, like boats or minecarts.
*/
public AxisAlignedBB getCollisionBox(Entity entityIn)
{
return null;
}
/**
* Handles updating while being ridden by an entity
*/
public void updateRidden()
{
if (this.ridingEntity.isDead)
{
this.ridingEntity = null;
}
else
{
this.motionX = 0.0D;
this.motionY = 0.0D;
this.motionZ = 0.0D;
this.onUpdate();
if (this.ridingEntity != null)
{
this.ridingEntity.updateRiderPosition();
this.entityRiderYawDelta += (double)(this.ridingEntity.rotationYaw - this.ridingEntity.prevRotationYaw);
for (this.entityRiderPitchDelta += (double)(this.ridingEntity.rotationPitch - this.ridingEntity.prevRotationPitch); this.entityRiderYawDelta >= 180.0D; this.entityRiderYawDelta -= 360.0D)
{
;
}
while (this.entityRiderYawDelta < -180.0D)
{
this.entityRiderYawDelta += 360.0D;
}
while (this.entityRiderPitchDelta >= 180.0D)
{
this.entityRiderPitchDelta -= 360.0D;
}
while (this.entityRiderPitchDelta < -180.0D)
{
this.entityRiderPitchDelta += 360.0D;
}
double var1 = this.entityRiderYawDelta * 0.5D;
double var3 = this.entityRiderPitchDelta * 0.5D;
float var5 = 10.0F;
if (var1 > (double)var5)
{
var1 = (double)var5;
}
if (var1 < (double)(-var5))
{
var1 = (double)(-var5);
}
if (var3 > (double)var5)
{
var3 = (double)var5;
}
if (var3 < (double)(-var5))
{
var3 = (double)(-var5);
}
this.entityRiderYawDelta -= var1;
this.entityRiderPitchDelta -= var3;
}
}
}
public void updateRiderPosition()
{
if (this.riddenByEntity != null)
{
this.riddenByEntity.setPosition(this.posX, this.posY + this.getMountedYOffset() + this.riddenByEntity.getYOffset(), this.posZ);
}
}
/**
* Returns the Y Offset of this entity.
*/
public double getYOffset()
{
return 0.0D;
}
/**
* Returns the Y offset from the entity's position for any entity riding this one.
*/
public double getMountedYOffset()
{
return (double)this.height * 0.75D;
}
/**
* Called when a player mounts an entity. e.g. mounts a pig, mounts a boat.
*/
public void mountEntity(Entity entityIn)
{
this.entityRiderPitchDelta = 0.0D;
this.entityRiderYawDelta = 0.0D;
if (entityIn == null)
{
if (this.ridingEntity != null)
{
this.setLocationAndAngles(this.ridingEntity.posX, this.ridingEntity.getEntityBoundingBox().minY + (double)this.ridingEntity.height, this.ridingEntity.posZ, this.rotationYaw, this.rotationPitch);
this.ridingEntity.riddenByEntity = null;
}
this.ridingEntity = null;
}
else
{
if (this.ridingEntity != null)
{
this.ridingEntity.riddenByEntity = null;
}
if (entityIn != null)
{
for (Entity var2 = entityIn.ridingEntity; var2 != null; var2 = var2.ridingEntity)
{
if (var2 == this)
{
return;
}
}
}
this.ridingEntity = entityIn;
entityIn.riddenByEntity = this;
}
}
public float getCollisionBorderSize()
{
return 0.1F;
}
/**
* returns a (normalized) vector of where this entity is looking
*/
public Vec3 getLookVec()
{
return null;
}
/**
* Called by portal blocks when an entity is within it.
*/
public void setInPortal()
{
if (this.timeUntilPortal > 0)
{
this.timeUntilPortal = this.getPortalCooldown();
}
else
{
double var1 = this.prevPosX - this.posX;
double var3 = this.prevPosZ - this.posZ;
if (!this.worldObj.isRemote && !this.inPortal)
{
int var5;
if (MathHelper.abs((float)var1) > MathHelper.abs((float)var3))
{
var5 = var1 > 0.0D ? EnumFacing.WEST.getHorizontalIndex() : EnumFacing.EAST.getHorizontalIndex();
}
else
{
var5 = var3 > 0.0D ? EnumFacing.NORTH.getHorizontalIndex() : EnumFacing.SOUTH.getHorizontalIndex();
}
this.teleportDirection = var5;
}
this.inPortal = true;
}
}
/**
* Return the amount of cooldown before this entity can use a portal again.
*/
public int getPortalCooldown()
{
return 300;
}
/**
* returns the inventory of this entity (only used in EntityPlayerMP it seems)
*/
public ItemStack[] getInventory()
{
return null;
}
/**
* 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) {}
/**
* Returns true if the entity is on fire. Used by render to add the fire effect on rendering.
*/
public boolean isBurning()
{
boolean var1 = this.worldObj != null && this.worldObj.isRemote;
return !this.isImmuneToFire && (this.fire > 0 || var1 && this.getFlag(0));
}
/**
* Returns true if the entity is riding another entity, used by render to rotate the legs to be in 'sit' position
* for players.
*/
public boolean isRiding()
{
return this.ridingEntity != null;
}
/**
* Returns if this entity is sneaking.
*/
public boolean isSneaking()
{
return this.getFlag(1);
}
/**
* Sets the sneaking flag.
*/
public void setSneaking(boolean sneaking)
{
this.setFlag(1, sneaking);
}
/**
* Get if the Entity is sprinting.
*/
public boolean isSprinting()
{
return this.getFlag(3);
}
/**
* Set sprinting switch for Entity.
*/
public void setSprinting(boolean sprinting)
{
this.setFlag(3, sprinting);
}
public boolean isInvisible()
{
return this.getFlag(5);
}
public void setInvisible(boolean invisible)
{
this.setFlag(5, invisible);
}
public void setEating(boolean eating)
{
this.setFlag(4, eating);
}
/**
* Returns true if the flag is active for the entity. Known flags: 0) is burning; 1) is sneaking; 2) is riding
* something; 3) is sprinting; 4) is eating
*/
protected boolean getFlag(int flag)
{
return (this.dataWatcher.getWatchableObjectByte(0) & 1 << flag) != 0;
}
/**
* Enable or disable a entity flag, see getEntityFlag to read the know flags.
*/
protected void setFlag(int flag, boolean set)
{
byte var3 = this.dataWatcher.getWatchableObjectByte(0);
if (set)
{
this.dataWatcher.updateObject(0, Byte.valueOf((byte)(var3 | 1 << flag)));
}
else
{
this.dataWatcher.updateObject(0, Byte.valueOf((byte)(var3 & ~(1 << flag))));
}
}
public int getAir()
{
return this.dataWatcher.getWatchableObjectShort(1);
}
public void setAir(int air)
{
this.dataWatcher.updateObject(1, Short.valueOf((short)air));
}
/**
* Called when a lightning bolt hits the entity.
*/
public void onStruckByLightning(EntityLightningBolt lightningBolt)
{
this.attackEntityFrom(DamageSource.field_180137_b, 5.0F);
++this.fire;
if (this.fire == 0)
{
this.setFire(8);
}
}
/**
* This method gets called when the entity kills another one.
*/
public void onKillEntity(EntityLivingBase entityLivingIn) {}
protected boolean pushOutOfBlocks(double x, double y, double z)
{
BlockPos var7 = new BlockPos(x, y, z);
double var8 = x - (double)var7.getX();
double var10 = y - (double)var7.getY();
double var12 = z - (double)var7.getZ();
List var14 = this.worldObj.func_147461_a(this.getEntityBoundingBox());
if (var14.isEmpty() && !this.worldObj.func_175665_u(var7))
{
return false;
}
else
{
byte var15 = 3;
double var16 = 9999.0D;
if (!this.worldObj.func_175665_u(var7.offsetWest()) && var8 < var16)
{
var16 = var8;
var15 = 0;
}
if (!this.worldObj.func_175665_u(var7.offsetEast()) && 1.0D - var8 < var16)
{
var16 = 1.0D - var8;
var15 = 1;
}
if (!this.worldObj.func_175665_u(var7.offsetUp()) && 1.0D - var10 < var16)
{
var16 = 1.0D - var10;
var15 = 3;
}
if (!this.worldObj.func_175665_u(var7.offsetNorth()) && var12 < var16)
{
var16 = var12;
var15 = 4;
}
if (!this.worldObj.func_175665_u(var7.offsetSouth()) && 1.0D - var12 < var16)
{
var16 = 1.0D - var12;
var15 = 5;
}
float var18 = this.rand.nextFloat() * 0.2F + 0.1F;
if (var15 == 0)
{
this.motionX = (double)(-var18);
}
if (var15 == 1)
{
this.motionX = (double)var18;
}
if (var15 == 3)
{
this.motionY = (double)var18;
}
if (var15 == 4)
{
this.motionZ = (double)(-var18);
}
if (var15 == 5)
{
this.motionZ = (double)var18;
}
return true;
}
}
/**
* Sets the Entity inside a web block.
*/
public void setInWeb()
{
this.isInWeb = true;
this.fallDistance = 0.0F;
}
/**
* Gets the name of this command sender (usually username, but possibly "Rcon")
*/
public String getName()
{
if (this.hasCustomName())
{
return this.getCustomNameTag();
}
else
{
String var1 = EntityList.getEntityString(this);
if (var1 == null)
{
var1 = "generic";
}
return StatCollector.translateToLocal("entity." + var1 + ".name");
}
}
/**
* Return the Entity parts making up this Entity (currently only for dragons)
*/
public Entity[] getParts()
{
return null;
}
/**
* Returns true if Entity argument is equal to this Entity
*/
public boolean isEntityEqual(Entity entityIn)
{
return this == entityIn;
}
public float getRotationYawHead()
{
return 0.0F;
}
/**
* Sets the head's yaw rotation of the entity.
*/
public void setRotationYawHead(float rotation) {}
/**
* If returns false, the item will not inflict any damage against entities.
*/
public boolean canAttackWithItem()
{
return true;
}
/**
* Called when a player attacks an entity. If this returns true the attack will not happen.
*/
public boolean hitByEntity(Entity entityIn)
{
return false;
}
public String toString()
{
return String.format("%s[\'%s\'/%d, l=\'%s\', x=%.2f, y=%.2f, z=%.2f]", new Object[] {this.getClass().getSimpleName(), this.getName(), Integer.valueOf(this.entityId), this.worldObj == null ? "~NULL~" : this.worldObj.getWorldInfo().getWorldName(), Double.valueOf(this.posX), Double.valueOf(this.posY), Double.valueOf(this.posZ)});
}
public boolean func_180431_b(DamageSource p_180431_1_)
{
return this.invulnerable && p_180431_1_ != DamageSource.outOfWorld && !p_180431_1_.func_180136_u();
}
/**
* Sets this entity's location and angles to the location and angles of the passed in entity.
*/
public void copyLocationAndAnglesFrom(Entity entityIn)
{
this.setLocationAndAngles(entityIn.posX, entityIn.posY, entityIn.posZ, entityIn.rotationYaw, entityIn.rotationPitch);
}
public void func_180432_n(Entity p_180432_1_)
{
NBTTagCompound var2 = new NBTTagCompound();
p_180432_1_.writeToNBT(var2);
this.readFromNBT(var2);
this.timeUntilPortal = p_180432_1_.timeUntilPortal;
this.teleportDirection = p_180432_1_.teleportDirection;
}
/**
* Teleports the entity to another dimension. Params: Dimension number to teleport to
*/
public void travelToDimension(int dimensionId)
{
if (!this.worldObj.isRemote && !this.isDead)
{
this.worldObj.theProfiler.startSection("changeDimension");
MinecraftServer var2 = MinecraftServer.getServer();
int var3 = this.dimension;
WorldServer var4 = var2.worldServerForDimension(var3);
WorldServer var5 = var2.worldServerForDimension(dimensionId);
this.dimension = dimensionId;
if (var3 == 1 && dimensionId == 1)
{
var5 = var2.worldServerForDimension(0);
this.dimension = 0;
}
this.worldObj.removeEntity(this);
this.isDead = false;
this.worldObj.theProfiler.startSection("reposition");
var2.getConfigurationManager().transferEntityToWorld(this, var3, var4, var5);
this.worldObj.theProfiler.endStartSection("reloading");
Entity var6 = EntityList.createEntityByName(EntityList.getEntityString(this), var5);
if (var6 != null)
{
var6.func_180432_n(this);
if (var3 == 1 && dimensionId == 1)
{
BlockPos var7 = this.worldObj.func_175672_r(var5.getSpawnPoint());
var6.func_174828_a(var7, var6.rotationYaw, var6.rotationPitch);
}
var5.spawnEntityInWorld(var6);
}
this.isDead = true;
this.worldObj.theProfiler.endSection();
var4.resetUpdateEntityTick();
var5.resetUpdateEntityTick();
this.worldObj.theProfiler.endSection();
}
}
/**
* Explosion resistance of a block relative to this entity
*/
public float getExplosionResistance(Explosion p_180428_1_, World worldIn, BlockPos p_180428_3_, IBlockState p_180428_4_)
{
return p_180428_4_.getBlock().getExplosionResistance(this);
}
public boolean func_174816_a(Explosion p_174816_1_, World worldIn, BlockPos p_174816_3_, IBlockState p_174816_4_, float p_174816_5_)
{
return true;
}
/**
* The maximum height from where the entity is alowed to jump (used in pathfinder)
*/
public int getMaxFallHeight()
{
return 3;
}
public int getTeleportDirection()
{
return this.teleportDirection;
}
/**
* Return whether this entity should NOT trigger a pressure plate or a tripwire.
*/
public boolean doesEntityNotTriggerPressurePlate()
{
return false;
}
public void addEntityCrashInfo(CrashReportCategory category)
{
category.addCrashSectionCallable("Entity Type", new Callable()
{
private static final String __OBFID = "CL_00001534";
public String call()
{
return EntityList.getEntityString(Entity.this) + " (" + Entity.this.getClass().getCanonicalName() + ")";
}
});
category.addCrashSection("Entity ID", Integer.valueOf(this.entityId));
category.addCrashSectionCallable("Entity Name", new Callable()
{
private static final String __OBFID = "CL_00001535";
public String call()
{
return Entity.this.getName();
}
});
category.addCrashSection("Entity\'s Exact location", String.format("%.2f, %.2f, %.2f", new Object[] {Double.valueOf(this.posX), Double.valueOf(this.posY), Double.valueOf(this.posZ)}));
category.addCrashSection("Entity\'s Block location", CrashReportCategory.getCoordinateInfo((double)MathHelper.floor_double(this.posX), (double)MathHelper.floor_double(this.posY), (double)MathHelper.floor_double(this.posZ)));
category.addCrashSection("Entity\'s Momentum", String.format("%.2f, %.2f, %.2f", new Object[] {Double.valueOf(this.motionX), Double.valueOf(this.motionY), Double.valueOf(this.motionZ)}));
category.addCrashSectionCallable("Entity\'s Rider", new Callable()
{
private static final String __OBFID = "CL_00002259";
public String func_180118_a()
{
return Entity.this.riddenByEntity.toString();
}
public Object call()
{
return this.func_180118_a();
}
});
category.addCrashSectionCallable("Entity\'s Vehicle", new Callable()
{
private static final String __OBFID = "CL_00002258";
public String func_180116_a()
{
return Entity.this.ridingEntity.toString();
}
public Object call()
{
return this.func_180116_a();
}
});
}
public UUID getUniqueID()
{
return this.entityUniqueID;
}
public boolean isPushedByWater()
{
return true;
}
public IChatComponent getDisplayName()
{
ChatComponentText var1 = new ChatComponentText(this.getName());
var1.getChatStyle().setChatHoverEvent(this.func_174823_aP());
var1.getChatStyle().setInsertion(this.getUniqueID().toString());
return var1;
}
/**
* Sets the custom name tag for this entity
*/
public void setCustomNameTag(String p_96094_1_)
{
this.dataWatcher.updateObject(2, p_96094_1_);
}
public String getCustomNameTag()
{
return this.dataWatcher.getWatchableObjectString(2);
}
/**
* Returns true if this thing is named
*/
public boolean hasCustomName()
{
return this.dataWatcher.getWatchableObjectString(2).length() > 0;
}
public void setAlwaysRenderNameTag(boolean p_174805_1_)
{
this.dataWatcher.updateObject(3, Byte.valueOf((byte)(p_174805_1_ ? 1 : 0)));
}
public boolean getAlwaysRenderNameTag()
{
return this.dataWatcher.getWatchableObjectByte(3) == 1;
}
/**
* Sets the position of the entity and updates the 'last' variables
*/
public void setPositionAndUpdate(double p_70634_1_, double p_70634_3_, double p_70634_5_)
{
this.setLocationAndAngles(p_70634_1_, p_70634_3_, p_70634_5_, this.rotationYaw, this.rotationPitch);
}
public void func_145781_i(int p_145781_1_) {}
public EnumFacing func_174811_aO()
{
return EnumFacing.getHorizontal(MathHelper.floor_double((double)(this.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3);
}
protected HoverEvent func_174823_aP()
{
NBTTagCompound var1 = new NBTTagCompound();
String var2 = EntityList.getEntityString(this);
var1.setString("id", this.getUniqueID().toString());
if (var2 != null)
{
var1.setString("type", var2);
}
var1.setString("name", this.getName());
return new HoverEvent(HoverEvent.Action.SHOW_ENTITY, new ChatComponentText(var1.toString()));
}
public boolean func_174827_a(EntityPlayerMP p_174827_1_)
{
return true;
}
public AxisAlignedBB getEntityBoundingBox()
{
return this.boundingBox;
}
public void func_174826_a(AxisAlignedBB p_174826_1_)
{
this.boundingBox = p_174826_1_;
}
public float getEyeHeight()
{
return this.height * 0.85F;
}
public boolean isOutsideBorder()
{
return this.isOutsideBorder;
}
public void setOutsideBorder(boolean p_174821_1_)
{
this.isOutsideBorder = p_174821_1_;
}
public boolean func_174820_d(int p_174820_1_, ItemStack p_174820_2_)
{
return false;
}
/**
* Notifies this sender of some sort of information. This is for messages intended to display to the user. Used
* for typical output (like "you asked for whether or not this game rule is set, so here's your answer"), warnings
* (like "I fetched this block for you by ID, but I'd like you to know that every time you do this, I die a little
* inside"), and errors (like "it's not called iron_pixacke, silly").
*/
public void addChatMessage(IChatComponent message) {}
/**
* Returns true if the command sender is allowed to use the given command.
*/
public boolean canCommandSenderUseCommand(int permissionLevel, String command)
{
return true;
}
public BlockPos getPosition()
{
return new BlockPos(this.posX, this.posY + 0.5D, this.posZ);
}
public Vec3 getPositionVector()
{
return new Vec3(this.posX, this.posY, this.posZ);
}
public World getEntityWorld()
{
return this.worldObj;
}
public Entity getCommandSenderEntity()
{
return this;
}
public boolean sendCommandFeedback()
{
return false;
}
public void func_174794_a(CommandResultStats.Type p_174794_1_, int p_174794_2_)
{
this.field_174837_as.func_179672_a(this, p_174794_1_, p_174794_2_);
}
public CommandResultStats func_174807_aT()
{
return this.field_174837_as;
}
public void func_174817_o(Entity p_174817_1_)
{
this.field_174837_as.func_179671_a(p_174817_1_.func_174807_aT());
}
public NBTTagCompound func_174819_aU()
{
return null;
}
public boolean func_174825_a(EntityPlayer p_174825_1_, Vec3 p_174825_2_)
{
return false;
}
public boolean func_180427_aV()
{
return false;
}
protected void func_174815_a(EntityLivingBase p_174815_1_, Entity p_174815_2_)
{
if (p_174815_2_ instanceof EntityLivingBase)
{
EnchantmentHelper.func_151384_a((EntityLivingBase)p_174815_2_, p_174815_1_);
}
EnchantmentHelper.func_151385_b(p_174815_1_, p_174815_2_);
}
}