001    package net.minecraft.entity.ai;
002    
003    import net.minecraft.entity.EntityCreature;
004    import net.minecraft.util.MathHelper;
005    import net.minecraft.village.Village;
006    import net.minecraft.village.VillageDoorInfo;
007    
008    public class EntityAIRestrictOpenDoor extends EntityAIBase
009    {
010        private EntityCreature entityObj;
011        private VillageDoorInfo frontDoor;
012    
013        public EntityAIRestrictOpenDoor(EntityCreature par1EntityCreature)
014        {
015            this.entityObj = par1EntityCreature;
016        }
017    
018        /**
019         * Returns whether the EntityAIBase should begin execution.
020         */
021        public boolean shouldExecute()
022        {
023            if (this.entityObj.worldObj.isDaytime())
024            {
025                return false;
026            }
027            else
028            {
029                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), 16);
030    
031                if (var1 == null)
032                {
033                    return false;
034                }
035                else
036                {
037                    this.frontDoor = var1.findNearestDoor(MathHelper.floor_double(this.entityObj.posX), MathHelper.floor_double(this.entityObj.posY), MathHelper.floor_double(this.entityObj.posZ));
038                    return this.frontDoor == null ? false : (double)this.frontDoor.getInsideDistanceSquare(MathHelper.floor_double(this.entityObj.posX), MathHelper.floor_double(this.entityObj.posY), MathHelper.floor_double(this.entityObj.posZ)) < 2.25D;
039                }
040            }
041        }
042    
043        /**
044         * Returns whether an in-progress EntityAIBase should continue executing
045         */
046        public boolean continueExecuting()
047        {
048            return this.entityObj.worldObj.isDaytime() ? false : !this.frontDoor.isDetachedFromVillageFlag && this.frontDoor.isInside(MathHelper.floor_double(this.entityObj.posX), MathHelper.floor_double(this.entityObj.posZ));
049        }
050    
051        /**
052         * Execute a one shot task or start executing a continuous task
053         */
054        public void startExecuting()
055        {
056            this.entityObj.getNavigator().setBreakDoors(false);
057            this.entityObj.getNavigator().setEnterDoors(false);
058        }
059    
060        /**
061         * Resets the task
062         */
063        public void resetTask()
064        {
065            this.entityObj.getNavigator().setBreakDoors(true);
066            this.entityObj.getNavigator().setEnterDoors(true);
067            this.frontDoor = null;
068        }
069    
070        /**
071         * Updates the task
072         */
073        public void updateTask()
074        {
075            this.frontDoor.incrementDoorOpeningRestrictionCounter();
076        }
077    }