package net.minecraft.entity; import java.util.UUID; import net.minecraft.entity.ai.EntityAIBase; import net.minecraft.entity.ai.EntityAIMoveTowardsRestriction; import net.minecraft.entity.ai.attributes.AttributeModifier; import net.minecraft.entity.passive.EntityTameable; import net.minecraft.pathfinding.PathNavigateGround; import net.minecraft.util.BlockPos; import net.minecraft.world.World; public abstract class EntityCreature extends EntityLiving { public static final UUID field_110179_h = UUID.fromString("E199AD21-BA8A-4C53-8D13-6182D5C69D3A"); public static final AttributeModifier field_110181_i = (new AttributeModifier(field_110179_h, "Fleeing speed bonus", 2.0D, 2)).setSaved(false); private BlockPos homePosition; /** If -1 there is no maximum distance */ private float maximumHomeDistance; private EntityAIBase aiBase; private boolean field_110180_bt; private static final String __OBFID = "CL_00001558"; public EntityCreature(World worldIn) { super(worldIn); this.homePosition = BlockPos.ORIGIN; this.maximumHomeDistance = -1.0F; this.aiBase = new EntityAIMoveTowardsRestriction(this, 1.0D); } public float func_180484_a(BlockPos p_180484_1_) { return 0.0F; } /** * Checks if the entity's current position is a valid location to spawn this entity. */ public boolean getCanSpawnHere() { return super.getCanSpawnHere() && this.func_180484_a(new BlockPos(this.posX, this.getEntityBoundingBox().minY, this.posZ)) >= 0.0F; } /** * if the entity got a PathEntity it returns true, else false */ public boolean hasPath() { return !this.navigator.noPath(); } public boolean isWithinHomeDistanceCurrentPosition() { return this.func_180485_d(new BlockPos(this)); } public boolean func_180485_d(BlockPos p_180485_1_) { return this.maximumHomeDistance == -1.0F ? true : this.homePosition.distanceSq(p_180485_1_) < (double)(this.maximumHomeDistance * this.maximumHomeDistance); } public void func_175449_a(BlockPos p_175449_1_, int p_175449_2_) { this.homePosition = p_175449_1_; this.maximumHomeDistance = (float)p_175449_2_; } public BlockPos func_180486_cf() { return this.homePosition; } public float getMaximumHomeDistance() { return this.maximumHomeDistance; } public void detachHome() { this.maximumHomeDistance = -1.0F; } /** * Returns whether a home area is defined for this entity. */ public boolean hasHome() { return this.maximumHomeDistance != -1.0F; } /** * Applies logic related to leashes, for example dragging the entity or breaking the leash. */ protected void updateLeashedState() { super.updateLeashedState(); if (this.getLeashed() && this.getLeashedToEntity() != null && this.getLeashedToEntity().worldObj == this.worldObj) { Entity var1 = this.getLeashedToEntity(); this.func_175449_a(new BlockPos((int)var1.posX, (int)var1.posY, (int)var1.posZ), 5); float var2 = this.getDistanceToEntity(var1); if (this instanceof EntityTameable && ((EntityTameable)this).isSitting()) { if (var2 > 10.0F) { this.clearLeashed(true, true); } return; } if (!this.field_110180_bt) { this.tasks.addTask(2, this.aiBase); if (this.getNavigator() instanceof PathNavigateGround) { ((PathNavigateGround)this.getNavigator()).func_179690_a(false); } this.field_110180_bt = true; } this.func_142017_o(var2); if (var2 > 4.0F) { this.getNavigator().tryMoveToEntityLiving(var1, 1.0D); } if (var2 > 6.0F) { double var3 = (var1.posX - this.posX) / (double)var2; double var5 = (var1.posY - this.posY) / (double)var2; double var7 = (var1.posZ - this.posZ) / (double)var2; this.motionX += var3 * Math.abs(var3) * 0.4D; this.motionY += var5 * Math.abs(var5) * 0.4D; this.motionZ += var7 * Math.abs(var7) * 0.4D; } if (var2 > 10.0F) { this.clearLeashed(true, true); } } else if (!this.getLeashed() && this.field_110180_bt) { this.field_110180_bt = false; this.tasks.removeTask(this.aiBase); if (this.getNavigator() instanceof PathNavigateGround) { ((PathNavigateGround)this.getNavigator()).func_179690_a(true); } this.detachHome(); } } protected void func_142017_o(float p_142017_1_) {} }