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 }