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