001    package net.minecraft.src;
002    
003    public class EntityAIMoveIndoors extends EntityAIBase
004    {
005        private EntityCreature entityObj;
006        private VillageDoorInfo doorInfo;
007        private int insidePosX = -1;
008        private int insidePosZ = -1;
009    
010        public EntityAIMoveIndoors(EntityCreature par1EntityCreature)
011        {
012            this.entityObj = par1EntityCreature;
013            this.setMutexBits(1);
014        }
015    
016        /**
017         * Returns whether the EntityAIBase should begin execution.
018         */
019        public boolean shouldExecute()
020        {
021            if ((!this.entityObj.worldObj.isDaytime() || this.entityObj.worldObj.isRaining()) && !this.entityObj.worldObj.provider.hasNoSky)
022            {
023                if (this.entityObj.getRNG().nextInt(50) != 0)
024                {
025                    return false;
026                }
027                else if (this.insidePosX != -1 && this.entityObj.getDistanceSq((double)this.insidePosX, this.entityObj.posY, (double)this.insidePosZ) < 4.0D)
028                {
029                    return false;
030                }
031                else
032                {
033                    Village var1 = this.entityObj.worldObj.villageCollectionObj.findNearestVillage(MathHelper.floor_double(this.entityObj.posX), MathHelper.floor_double(this.entityObj.posY), MathHelper.floor_double(this.entityObj.posZ), 14);
034    
035                    if (var1 == null)
036                    {
037                        return false;
038                    }
039                    else
040                    {
041                        this.doorInfo = var1.findNearestDoorUnrestricted(MathHelper.floor_double(this.entityObj.posX), MathHelper.floor_double(this.entityObj.posY), MathHelper.floor_double(this.entityObj.posZ));
042                        return this.doorInfo != null;
043                    }
044                }
045            }
046            else
047            {
048                return false;
049            }
050        }
051    
052        /**
053         * Returns whether an in-progress EntityAIBase should continue executing
054         */
055        public boolean continueExecuting()
056        {
057            return !this.entityObj.getNavigator().noPath();
058        }
059    
060        /**
061         * Execute a one shot task or start executing a continuous task
062         */
063        public void startExecuting()
064        {
065            this.insidePosX = -1;
066    
067            if (this.entityObj.getDistanceSq((double)this.doorInfo.getInsidePosX(), (double)this.doorInfo.posY, (double)this.doorInfo.getInsidePosZ()) > 256.0D)
068            {
069                Vec3 var1 = RandomPositionGenerator.findRandomTargetBlockTowards(this.entityObj, 14, 3, Vec3.getVec3Pool().getVecFromPool((double)this.doorInfo.getInsidePosX() + 0.5D, (double)this.doorInfo.getInsidePosY(), (double)this.doorInfo.getInsidePosZ() + 0.5D));
070    
071                if (var1 != null)
072                {
073                    this.entityObj.getNavigator().tryMoveToXYZ(var1.xCoord, var1.yCoord, var1.zCoord, 0.3F);
074                }
075            }
076            else
077            {
078                this.entityObj.getNavigator().tryMoveToXYZ((double)this.doorInfo.getInsidePosX() + 0.5D, (double)this.doorInfo.getInsidePosY(), (double)this.doorInfo.getInsidePosZ() + 0.5D, 0.3F);
079            }
080        }
081    
082        /**
083         * Resets the task
084         */
085        public void resetTask()
086        {
087            this.insidePosX = this.doorInfo.getInsidePosX();
088            this.insidePosZ = this.doorInfo.getInsidePosZ();
089            this.doorInfo = null;
090        }
091    }