    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    }