001 package net.minecraft.src;
002
003 import java.util.ArrayList;
004 import java.util.Iterator;
005 import java.util.List;
006
007 public class EntityAIMoveThroughVillage extends EntityAIBase
008 {
009 private EntityCreature theEntity;
010 private float movementSpeed;
011
012 /** The PathNavigate of our entity. */
013 private PathEntity entityPathNavigate;
014 private VillageDoorInfo doorInfo;
015 private boolean isNocturnal;
016 private List doorList = new ArrayList();
017
018 public EntityAIMoveThroughVillage(EntityCreature par1EntityCreature, float par2, boolean par3)
019 {
020 this.theEntity = par1EntityCreature;
021 this.movementSpeed = par2;
022 this.isNocturnal = par3;
023 this.setMutexBits(1);
024 }
025
026 /**
027 * Returns whether the EntityAIBase should begin execution.
028 */
029 public boolean shouldExecute()
030 {
031 this.func_75414_f();
032
033 if (this.isNocturnal && this.theEntity.worldObj.isDaytime())
034 {
035 return false;
036 }
037 else
038 {
039 Village var1 = this.theEntity.worldObj.villageCollectionObj.findNearestVillage(MathHelper.floor_double(this.theEntity.posX), MathHelper.floor_double(this.theEntity.posY), MathHelper.floor_double(this.theEntity.posZ), 0);
040
041 if (var1 == null)
042 {
043 return false;
044 }
045 else
046 {
047 this.doorInfo = this.func_75412_a(var1);
048
049 if (this.doorInfo == null)
050 {
051 return false;
052 }
053 else
054 {
055 boolean var2 = this.theEntity.getNavigator().getCanBreakDoors();
056 this.theEntity.getNavigator().setBreakDoors(false);
057 this.entityPathNavigate = this.theEntity.getNavigator().getPathToXYZ((double)this.doorInfo.posX, (double)this.doorInfo.posY, (double)this.doorInfo.posZ);
058 this.theEntity.getNavigator().setBreakDoors(var2);
059
060 if (this.entityPathNavigate != null)
061 {
062 return true;
063 }
064 else
065 {
066 Vec3 var3 = RandomPositionGenerator.findRandomTargetBlockTowards(this.theEntity, 10, 7, this.theEntity.worldObj.func_82732_R().getVecFromPool((double)this.doorInfo.posX, (double)this.doorInfo.posY, (double)this.doorInfo.posZ));
067
068 if (var3 == null)
069 {
070 return false;
071 }
072 else
073 {
074 this.theEntity.getNavigator().setBreakDoors(false);
075 this.entityPathNavigate = this.theEntity.getNavigator().getPathToXYZ(var3.xCoord, var3.yCoord, var3.zCoord);
076 this.theEntity.getNavigator().setBreakDoors(var2);
077 return this.entityPathNavigate != null;
078 }
079 }
080 }
081 }
082 }
083 }
084
085 /**
086 * Returns whether an in-progress EntityAIBase should continue executing
087 */
088 public boolean continueExecuting()
089 {
090 if (this.theEntity.getNavigator().noPath())
091 {
092 return false;
093 }
094 else
095 {
096 float var1 = this.theEntity.width + 4.0F;
097 return this.theEntity.getDistanceSq((double)this.doorInfo.posX, (double)this.doorInfo.posY, (double)this.doorInfo.posZ) > (double)(var1 * var1);
098 }
099 }
100
101 /**
102 * Execute a one shot task or start executing a continuous task
103 */
104 public void startExecuting()
105 {
106 this.theEntity.getNavigator().setPath(this.entityPathNavigate, this.movementSpeed);
107 }
108
109 /**
110 * Resets the task
111 */
112 public void resetTask()
113 {
114 if (this.theEntity.getNavigator().noPath() || this.theEntity.getDistanceSq((double)this.doorInfo.posX, (double)this.doorInfo.posY, (double)this.doorInfo.posZ) < 16.0D)
115 {
116 this.doorList.add(this.doorInfo);
117 }
118 }
119
120 private VillageDoorInfo func_75412_a(Village par1Village)
121 {
122 VillageDoorInfo var2 = null;
123 int var3 = Integer.MAX_VALUE;
124 List var4 = par1Village.getVillageDoorInfoList();
125 Iterator var5 = var4.iterator();
126
127 while (var5.hasNext())
128 {
129 VillageDoorInfo var6 = (VillageDoorInfo)var5.next();
130 int var7 = var6.getDistanceSquared(MathHelper.floor_double(this.theEntity.posX), MathHelper.floor_double(this.theEntity.posY), MathHelper.floor_double(this.theEntity.posZ));
131
132 if (var7 < var3 && !this.func_75413_a(var6))
133 {
134 var2 = var6;
135 var3 = var7;
136 }
137 }
138
139 return var2;
140 }
141
142 private boolean func_75413_a(VillageDoorInfo par1VillageDoorInfo)
143 {
144 Iterator var2 = this.doorList.iterator();
145 VillageDoorInfo var3;
146
147 do
148 {
149 if (!var2.hasNext())
150 {
151 return false;
152 }
153
154 var3 = (VillageDoorInfo)var2.next();
155 }
156 while (par1VillageDoorInfo.posX != var3.posX || par1VillageDoorInfo.posY != var3.posY || par1VillageDoorInfo.posZ != var3.posZ);
157
158 return true;
159 }
160
161 private void func_75414_f()
162 {
163 if (this.doorList.size() > 15)
164 {
165 this.doorList.remove(0);
166 }
167 }
168 }