    001package net.minecraft.entity.ai;
    002
    003import net.minecraft.entity.EntityCreature;
    004import net.minecraft.util.MathHelper;
    005import net.minecraft.village.Village;
    006import net.minecraft.village.VillageDoorInfo;
    007
    008public 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 village = 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 (village == null)
    032            {
    033                return false;
    034            }
    035            else
    036            {
    037                this.frontDoor = village.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}