package net.minecraft.entity.ai; import com.google.common.collect.Lists; import java.util.Iterator; import java.util.List; import net.minecraft.entity.EntityCreature; import net.minecraft.pathfinding.PathEntity; import net.minecraft.pathfinding.PathNavigateGround; import net.minecraft.util.BlockPos; import net.minecraft.util.MathHelper; import net.minecraft.util.Vec3; import net.minecraft.village.Village; import net.minecraft.village.VillageDoorInfo; public class EntityAIMoveThroughVillage extends EntityAIBase { private EntityCreature theEntity; private double movementSpeed; /** The PathNavigate of our entity. */ private PathEntity entityPathNavigate; private VillageDoorInfo doorInfo; private boolean isNocturnal; private List doorList = Lists.newArrayList(); private static final String __OBFID = "CL_00001597"; public EntityAIMoveThroughVillage(EntityCreature p_i1638_1_, double p_i1638_2_, boolean p_i1638_4_) { this.theEntity = p_i1638_1_; this.movementSpeed = p_i1638_2_; this.isNocturnal = p_i1638_4_; this.setMutexBits(1); if (!(p_i1638_1_.getNavigator() instanceof PathNavigateGround)) { throw new IllegalArgumentException("Unsupported mob for MoveThroughVillageGoal"); } } /** * Returns whether the EntityAIBase should begin execution. */ public boolean shouldExecute() { this.func_75414_f(); if (this.isNocturnal && this.theEntity.worldObj.isDaytime()) { return false; } else { Village var1 = this.theEntity.worldObj.getVillageCollection().func_176056_a(new BlockPos(this.theEntity), 0); if (var1 == null) { return false; } else { this.doorInfo = this.func_75412_a(var1); if (this.doorInfo == null) { return false; } else { PathNavigateGround var2 = (PathNavigateGround)this.theEntity.getNavigator(); boolean var3 = var2.func_179686_g(); var2.func_179688_b(false); this.entityPathNavigate = var2.func_179680_a(this.doorInfo.func_179852_d()); var2.func_179688_b(var3); if (this.entityPathNavigate != null) { return true; } else { Vec3 var4 = RandomPositionGenerator.findRandomTargetBlockTowards(this.theEntity, 10, 7, new Vec3((double)this.doorInfo.func_179852_d().getX(), (double)this.doorInfo.func_179852_d().getY(), (double)this.doorInfo.func_179852_d().getZ())); if (var4 == null) { return false; } else { var2.func_179688_b(false); this.entityPathNavigate = this.theEntity.getNavigator().getPathToXYZ(var4.xCoord, var4.yCoord, var4.zCoord); var2.func_179688_b(var3); return this.entityPathNavigate != null; } } } } } } /** * Returns whether an in-progress EntityAIBase should continue executing */ public boolean continueExecuting() { if (this.theEntity.getNavigator().noPath()) { return false; } else { float var1 = this.theEntity.width + 4.0F; return this.theEntity.getDistanceSq(this.doorInfo.func_179852_d()) > (double)(var1 * var1); } } /** * Execute a one shot task or start executing a continuous task */ public void startExecuting() { this.theEntity.getNavigator().setPath(this.entityPathNavigate, this.movementSpeed); } /** * Resets the task */ public void resetTask() { if (this.theEntity.getNavigator().noPath() || this.theEntity.getDistanceSq(this.doorInfo.func_179852_d()) < 16.0D) { this.doorList.add(this.doorInfo); } } private VillageDoorInfo func_75412_a(Village p_75412_1_) { VillageDoorInfo var2 = null; int var3 = Integer.MAX_VALUE; List var4 = p_75412_1_.getVillageDoorInfoList(); Iterator var5 = var4.iterator(); while (var5.hasNext()) { VillageDoorInfo var6 = (VillageDoorInfo)var5.next(); int var7 = var6.getDistanceSquared(MathHelper.floor_double(this.theEntity.posX), MathHelper.floor_double(this.theEntity.posY), MathHelper.floor_double(this.theEntity.posZ)); if (var7 < var3 && !this.func_75413_a(var6)) { var2 = var6; var3 = var7; } } return var2; } private boolean func_75413_a(VillageDoorInfo p_75413_1_) { Iterator var2 = this.doorList.iterator(); VillageDoorInfo var3; do { if (!var2.hasNext()) { return false; } var3 = (VillageDoorInfo)var2.next(); } while (!p_75413_1_.func_179852_d().equals(var3.func_179852_d())); return true; } private void func_75414_f() { if (this.doorList.size() > 15) { this.doorList.remove(0); } } }