001 package net.minecraft.entity.ai;
002
003 import net.minecraft.entity.EntityCreature;
004 import net.minecraft.entity.EntityLiving;
005 import net.minecraft.util.Vec3;
006
007 public class EntityAIMoveTowardsTarget extends EntityAIBase
008 {
009 private EntityCreature theEntity;
010 private EntityLiving targetEntity;
011 private double movePosX;
012 private double movePosY;
013 private double movePosZ;
014 private float field_75425_f;
015 private float field_75426_g;
016
017 public EntityAIMoveTowardsTarget(EntityCreature par1EntityCreature, float par2, float par3)
018 {
019 this.theEntity = par1EntityCreature;
020 this.field_75425_f = par2;
021 this.field_75426_g = par3;
022 this.setMutexBits(1);
023 }
024
025 /**
026 * Returns whether the EntityAIBase should begin execution.
027 */
028 public boolean shouldExecute()
029 {
030 this.targetEntity = this.theEntity.getAttackTarget();
031
032 if (this.targetEntity == null)
033 {
034 return false;
035 }
036 else if (this.targetEntity.getDistanceSqToEntity(this.theEntity) > (double)(this.field_75426_g * this.field_75426_g))
037 {
038 return false;
039 }
040 else
041 {
042 Vec3 var1 = RandomPositionGenerator.findRandomTargetBlockTowards(this.theEntity, 16, 7, this.theEntity.worldObj.getWorldVec3Pool().getVecFromPool(this.targetEntity.posX, this.targetEntity.posY, this.targetEntity.posZ));
043
044 if (var1 == null)
045 {
046 return false;
047 }
048 else
049 {
050 this.movePosX = var1.xCoord;
051 this.movePosY = var1.yCoord;
052 this.movePosZ = var1.zCoord;
053 return true;
054 }
055 }
056 }
057
058 /**
059 * Returns whether an in-progress EntityAIBase should continue executing
060 */
061 public boolean continueExecuting()
062 {
063 return !this.theEntity.getNavigator().noPath() && this.targetEntity.isEntityAlive() && this.targetEntity.getDistanceSqToEntity(this.theEntity) < (double)(this.field_75426_g * this.field_75426_g);
064 }
065
066 /**
067 * Resets the task
068 */
069 public void resetTask()
070 {
071 this.targetEntity = null;
072 }
073
074 /**
075 * Execute a one shot task or start executing a continuous task
076 */
077 public void startExecuting()
078 {
079 this.theEntity.getNavigator().tryMoveToXYZ(this.movePosX, this.movePosY, this.movePosZ, this.field_75425_f);
080 }
081 }