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