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