001package net.minecraft.entity.ai;
002
003import net.minecraft.entity.EntityCreature;
004import net.minecraft.entity.EntityLiving;
005import net.minecraft.util.Vec3;
006
007public 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 vec3 = RandomPositionGenerator.findRandomTargetBlockTowards(this.theEntity, 16, 7, this.theEntity.worldObj.getWorldVec3Pool().getVecFromPool(this.targetEntity.posX, this.targetEntity.posY, this.targetEntity.posZ));
043
044            if (vec3 == null)
045            {
046                return false;
047            }
048            else
049            {
050                this.movePosX = vec3.xCoord;
051                this.movePosY = vec3.yCoord;
052                this.movePosZ = vec3.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}