001 package net.minecraft.src;
002
003 import java.util.Iterator;
004 import java.util.List;
005
006 public class VillageSiege
007 {
008 private World worldObj;
009 private boolean field_75535_b = false;
010 private int field_75536_c = -1;
011 private int field_75533_d;
012 private int field_75534_e;
013
014 /** Instance of Village. */
015 private Village theVillage;
016 private int field_75532_g;
017 private int field_75538_h;
018 private int field_75539_i;
019
020 public VillageSiege(World par1World)
021 {
022 this.worldObj = par1World;
023 }
024
025 /**
026 * Runs a single tick for the village siege
027 */
028 public void tick()
029 {
030 boolean var1 = false;
031
032 if (var1)
033 {
034 if (this.field_75536_c == 2)
035 {
036 this.field_75533_d = 100;
037 return;
038 }
039 }
040 else
041 {
042 if (this.worldObj.isDaytime())
043 {
044 this.field_75536_c = 0;
045 return;
046 }
047
048 if (this.field_75536_c == 2)
049 {
050 return;
051 }
052
053 if (this.field_75536_c == 0)
054 {
055 float var2 = this.worldObj.getCelestialAngle(0.0F);
056
057 if ((double)var2 < 0.5D || (double)var2 > 0.501D)
058 {
059 return;
060 }
061
062 this.field_75536_c = this.worldObj.rand.nextInt(10) == 0 ? 1 : 2;
063 this.field_75535_b = false;
064
065 if (this.field_75536_c == 2)
066 {
067 return;
068 }
069 }
070 }
071
072 if (!this.field_75535_b)
073 {
074 if (!this.func_75529_b())
075 {
076 return;
077 }
078
079 this.field_75535_b = true;
080 }
081
082 if (this.field_75534_e > 0)
083 {
084 --this.field_75534_e;
085 }
086 else
087 {
088 this.field_75534_e = 2;
089
090 if (this.field_75533_d > 0)
091 {
092 this.spawnZombie();
093 --this.field_75533_d;
094 }
095 else
096 {
097 this.field_75536_c = 2;
098 }
099 }
100 }
101
102 private boolean func_75529_b()
103 {
104 List var1 = this.worldObj.playerEntities;
105 Iterator var2 = var1.iterator();
106
107 while (var2.hasNext())
108 {
109 EntityPlayer var3 = (EntityPlayer)var2.next();
110 this.theVillage = this.worldObj.villageCollectionObj.findNearestVillage((int)var3.posX, (int)var3.posY, (int)var3.posZ, 1);
111
112 if (this.theVillage != null && this.theVillage.getNumVillageDoors() >= 10 && this.theVillage.getTicksSinceLastDoorAdding() >= 20 && this.theVillage.getNumVillagers() >= 20)
113 {
114 ChunkCoordinates var4 = this.theVillage.getCenter();
115 float var5 = (float)this.theVillage.getVillageRadius();
116 boolean var6 = false;
117 int var7 = 0;
118
119 while (true)
120 {
121 if (var7 < 10)
122 {
123 this.field_75532_g = var4.posX + (int)((double)(MathHelper.cos(this.worldObj.rand.nextFloat() * (float)Math.PI * 2.0F) * var5) * 0.9D);
124 this.field_75538_h = var4.posY;
125 this.field_75539_i = var4.posZ + (int)((double)(MathHelper.sin(this.worldObj.rand.nextFloat() * (float)Math.PI * 2.0F) * var5) * 0.9D);
126 var6 = false;
127 Iterator var8 = this.worldObj.villageCollectionObj.getVillageList().iterator();
128
129 while (var8.hasNext())
130 {
131 Village var9 = (Village)var8.next();
132
133 if (var9 != this.theVillage && var9.isInRange(this.field_75532_g, this.field_75538_h, this.field_75539_i))
134 {
135 var6 = true;
136 break;
137 }
138 }
139
140 if (var6)
141 {
142 ++var7;
143 continue;
144 }
145 }
146
147 if (var6)
148 {
149 return false;
150 }
151
152 Vec3 var10 = this.func_75527_a(this.field_75532_g, this.field_75538_h, this.field_75539_i);
153
154 if (var10 != null)
155 {
156 this.field_75534_e = 0;
157 this.field_75533_d = 20;
158 return true;
159 }
160
161 break;
162 }
163 }
164 }
165
166 return false;
167 }
168
169 private boolean spawnZombie()
170 {
171 Vec3 var1 = this.func_75527_a(this.field_75532_g, this.field_75538_h, this.field_75539_i);
172
173 if (var1 == null)
174 {
175 return false;
176 }
177 else
178 {
179 EntityZombie var2;
180
181 try
182 {
183 var2 = new EntityZombie(this.worldObj);
184 var2.initCreature();
185 var2.setVillager(false);
186 }
187 catch (Exception var4)
188 {
189 var4.printStackTrace();
190 return false;
191 }
192
193 var2.setLocationAndAngles(var1.xCoord, var1.yCoord, var1.zCoord, this.worldObj.rand.nextFloat() * 360.0F, 0.0F);
194 this.worldObj.spawnEntityInWorld(var2);
195 ChunkCoordinates var3 = this.theVillage.getCenter();
196 var2.setHomeArea(var3.posX, var3.posY, var3.posZ, this.theVillage.getVillageRadius());
197 return true;
198 }
199 }
200
201 private Vec3 func_75527_a(int par1, int par2, int par3)
202 {
203 for (int var4 = 0; var4 < 10; ++var4)
204 {
205 int var5 = par1 + this.worldObj.rand.nextInt(16) - 8;
206 int var6 = par2 + this.worldObj.rand.nextInt(6) - 3;
207 int var7 = par3 + this.worldObj.rand.nextInt(16) - 8;
208
209 if (this.theVillage.isInRange(var5, var6, var7) && SpawnerAnimals.canCreatureTypeSpawnAtLocation(EnumCreatureType.monster, this.worldObj, var5, var6, var7))
210 {
211 this.worldObj.getWorldVec3Pool().getVecFromPool((double)var5, (double)var6, (double)var7);
212 }
213 }
214
215 return null;
216 }
217 }