001 package net.minecraft.src;
002
003 import java.util.ArrayList;
004 import java.util.Iterator;
005 import java.util.List;
006 import java.util.Random;
007
008 import cpw.mods.fml.common.registry.VillagerRegistry;
009
010 public class StructureVillagePieces
011 {
012 public static ArrayList getStructureVillageWeightedPieceList(Random par0Random, int par1)
013 {
014 ArrayList var2 = new ArrayList();
015 var2.add(new StructureVillagePieceWeight(ComponentVillageHouse4_Garden.class, 4, MathHelper.getRandomIntegerInRange(par0Random, 2 + par1, 4 + par1 * 2)));
016 var2.add(new StructureVillagePieceWeight(ComponentVillageChurch.class, 20, MathHelper.getRandomIntegerInRange(par0Random, 0 + par1, 1 + par1)));
017 var2.add(new StructureVillagePieceWeight(ComponentVillageHouse1.class, 20, MathHelper.getRandomIntegerInRange(par0Random, 0 + par1, 2 + par1)));
018 var2.add(new StructureVillagePieceWeight(ComponentVillageWoodHut.class, 3, MathHelper.getRandomIntegerInRange(par0Random, 2 + par1, 5 + par1 * 3)));
019 var2.add(new StructureVillagePieceWeight(ComponentVillageHall.class, 15, MathHelper.getRandomIntegerInRange(par0Random, 0 + par1, 2 + par1)));
020 var2.add(new StructureVillagePieceWeight(ComponentVillageField.class, 3, MathHelper.getRandomIntegerInRange(par0Random, 1 + par1, 4 + par1)));
021 var2.add(new StructureVillagePieceWeight(ComponentVillageField2.class, 3, MathHelper.getRandomIntegerInRange(par0Random, 2 + par1, 4 + par1 * 2)));
022 var2.add(new StructureVillagePieceWeight(ComponentVillageHouse2.class, 15, MathHelper.getRandomIntegerInRange(par0Random, 0, 1 + par1)));
023 var2.add(new StructureVillagePieceWeight(ComponentVillageHouse3.class, 8, MathHelper.getRandomIntegerInRange(par0Random, 0 + par1, 3 + par1 * 2)));
024 VillagerRegistry.addExtraVillageComponents(var2, par0Random, par1);
025
026 Iterator var3 = var2.iterator();
027
028 while (var3.hasNext())
029 {
030 if (((StructureVillagePieceWeight)var3.next()).villagePiecesLimit == 0)
031 {
032 var3.remove();
033 }
034 }
035
036 return var2;
037 }
038
039 private static int func_75079_a(List par0List)
040 {
041 boolean var1 = false;
042 int var2 = 0;
043 StructureVillagePieceWeight var4;
044
045 for (Iterator var3 = par0List.iterator(); var3.hasNext(); var2 += var4.villagePieceWeight)
046 {
047 var4 = (StructureVillagePieceWeight)var3.next();
048
049 if (var4.villagePiecesLimit > 0 && var4.villagePiecesSpawned < var4.villagePiecesLimit)
050 {
051 var1 = true;
052 }
053 }
054
055 return var1 ? var2 : -1;
056 }
057
058 private static ComponentVillage func_75083_a(ComponentVillageStartPiece par0ComponentVillageStartPiece, StructureVillagePieceWeight par1StructureVillagePieceWeight, List par2List, Random par3Random, int par4, int par5, int par6, int par7, int par8)
059 {
060 Class var9 = par1StructureVillagePieceWeight.villagePieceClass;
061 Object var10 = null;
062
063 if (var9 == ComponentVillageHouse4_Garden.class)
064 {
065 var10 = ComponentVillageHouse4_Garden.func_74912_a(par0ComponentVillageStartPiece, par2List, par3Random, par4, par5, par6, par7, par8);
066 }
067 else if (var9 == ComponentVillageChurch.class)
068 {
069 var10 = ComponentVillageChurch.func_74919_a(par0ComponentVillageStartPiece, par2List, par3Random, par4, par5, par6, par7, par8);
070 }
071 else if (var9 == ComponentVillageHouse1.class)
072 {
073 var10 = ComponentVillageHouse1.func_74898_a(par0ComponentVillageStartPiece, par2List, par3Random, par4, par5, par6, par7, par8);
074 }
075 else if (var9 == ComponentVillageWoodHut.class)
076 {
077 var10 = ComponentVillageWoodHut.func_74908_a(par0ComponentVillageStartPiece, par2List, par3Random, par4, par5, par6, par7, par8);
078 }
079 else if (var9 == ComponentVillageHall.class)
080 {
081 var10 = ComponentVillageHall.func_74906_a(par0ComponentVillageStartPiece, par2List, par3Random, par4, par5, par6, par7, par8);
082 }
083 else if (var9 == ComponentVillageField.class)
084 {
085 var10 = ComponentVillageField.func_74900_a(par0ComponentVillageStartPiece, par2List, par3Random, par4, par5, par6, par7, par8);
086 }
087 else if (var9 == ComponentVillageField2.class)
088 {
089 var10 = ComponentVillageField2.func_74902_a(par0ComponentVillageStartPiece, par2List, par3Random, par4, par5, par6, par7, par8);
090 }
091 else if (var9 == ComponentVillageHouse2.class)
092 {
093 var10 = ComponentVillageHouse2.func_74915_a(par0ComponentVillageStartPiece, par2List, par3Random, par4, par5, par6, par7, par8);
094 }
095 else if (var9 == ComponentVillageHouse3.class)
096 {
097 var10 = ComponentVillageHouse3.func_74921_a(par0ComponentVillageStartPiece, par2List, par3Random, par4, par5, par6, par7, par8);
098 }
099 else
100 {
101 var10 = VillagerRegistry.getVillageComponent(par1StructureVillagePieceWeight, par0ComponentVillageStartPiece , par2List, par3Random, par4, par5, par6, par7, par8);
102 }
103
104 return (ComponentVillage)var10;
105 }
106
107 /**
108 * attempts to find a next Village Component to be spawned
109 */
110 private static ComponentVillage getNextVillageComponent(ComponentVillageStartPiece par0ComponentVillageStartPiece, List par1List, Random par2Random, int par3, int par4, int par5, int par6, int par7)
111 {
112 int var8 = func_75079_a(par0ComponentVillageStartPiece.structureVillageWeightedPieceList);
113
114 if (var8 <= 0)
115 {
116 return null;
117 }
118 else
119 {
120 int var9 = 0;
121
122 while (var9 < 5)
123 {
124 ++var9;
125 int var10 = par2Random.nextInt(var8);
126 Iterator var11 = par0ComponentVillageStartPiece.structureVillageWeightedPieceList.iterator();
127
128 while (var11.hasNext())
129 {
130 StructureVillagePieceWeight var12 = (StructureVillagePieceWeight)var11.next();
131 var10 -= var12.villagePieceWeight;
132
133 if (var10 < 0)
134 {
135 if (!var12.canSpawnMoreVillagePiecesOfType(par7) || var12 == par0ComponentVillageStartPiece.structVillagePieceWeight && par0ComponentVillageStartPiece.structureVillageWeightedPieceList.size() > 1)
136 {
137 break;
138 }
139
140 ComponentVillage var13 = func_75083_a(par0ComponentVillageStartPiece, var12, par1List, par2Random, par3, par4, par5, par6, par7);
141
142 if (var13 != null)
143 {
144 ++var12.villagePiecesSpawned;
145 par0ComponentVillageStartPiece.structVillagePieceWeight = var12;
146
147 if (!var12.canSpawnMoreVillagePieces())
148 {
149 par0ComponentVillageStartPiece.structureVillageWeightedPieceList.remove(var12);
150 }
151
152 return var13;
153 }
154 }
155 }
156 }
157
158 StructureBoundingBox var14 = ComponentVillageTorch.func_74904_a(par0ComponentVillageStartPiece, par1List, par2Random, par3, par4, par5, par6);
159
160 if (var14 != null)
161 {
162 return new ComponentVillageTorch(par0ComponentVillageStartPiece, par7, par2Random, var14, par6);
163 }
164 else
165 {
166 return null;
167 }
168 }
169 }
170
171 /**
172 * attempts to find a next Structure Component to be spawned, private Village function
173 */
174 private static StructureComponent getNextVillageStructureComponent(ComponentVillageStartPiece par0ComponentVillageStartPiece, List par1List, Random par2Random, int par3, int par4, int par5, int par6, int par7)
175 {
176 if (par7 > 50)
177 {
178 return null;
179 }
180 else if (Math.abs(par3 - par0ComponentVillageStartPiece.getBoundingBox().minX) <= 112 && Math.abs(par5 - par0ComponentVillageStartPiece.getBoundingBox().minZ) <= 112)
181 {
182 ComponentVillage var8 = getNextVillageComponent(par0ComponentVillageStartPiece, par1List, par2Random, par3, par4, par5, par6, par7 + 1);
183
184 if (var8 != null)
185 {
186 int var9 = (var8.boundingBox.minX + var8.boundingBox.maxX) / 2;
187 int var10 = (var8.boundingBox.minZ + var8.boundingBox.maxZ) / 2;
188 int var11 = var8.boundingBox.maxX - var8.boundingBox.minX;
189 int var12 = var8.boundingBox.maxZ - var8.boundingBox.minZ;
190 int var13 = var11 > var12 ? var11 : var12;
191
192 if (par0ComponentVillageStartPiece.getWorldChunkManager().areBiomesViable(var9, var10, var13 / 2 + 4, MapGenVillage.villageSpawnBiomes))
193 {
194 par1List.add(var8);
195 par0ComponentVillageStartPiece.field_74932_i.add(var8);
196 return var8;
197 }
198 }
199
200 return null;
201 }
202 else
203 {
204 return null;
205 }
206 }
207
208 private static StructureComponent getNextComponentVillagePath(ComponentVillageStartPiece par0ComponentVillageStartPiece, List par1List, Random par2Random, int par3, int par4, int par5, int par6, int par7)
209 {
210 if (par7 > 3 + par0ComponentVillageStartPiece.terrainType)
211 {
212 return null;
213 }
214 else if (Math.abs(par3 - par0ComponentVillageStartPiece.getBoundingBox().minX) <= 112 && Math.abs(par5 - par0ComponentVillageStartPiece.getBoundingBox().minZ) <= 112)
215 {
216 StructureBoundingBox var8 = ComponentVillagePathGen.func_74933_a(par0ComponentVillageStartPiece, par1List, par2Random, par3, par4, par5, par6);
217
218 if (var8 != null && var8.minY > 10)
219 {
220 ComponentVillagePathGen var9 = new ComponentVillagePathGen(par0ComponentVillageStartPiece, par7, par2Random, var8, par6);
221 int var10 = (var9.boundingBox.minX + var9.boundingBox.maxX) / 2;
222 int var11 = (var9.boundingBox.minZ + var9.boundingBox.maxZ) / 2;
223 int var12 = var9.boundingBox.maxX - var9.boundingBox.minX;
224 int var13 = var9.boundingBox.maxZ - var9.boundingBox.minZ;
225 int var14 = var12 > var13 ? var12 : var13;
226
227 if (par0ComponentVillageStartPiece.getWorldChunkManager().areBiomesViable(var10, var11, var14 / 2 + 4, MapGenVillage.villageSpawnBiomes))
228 {
229 par1List.add(var9);
230 par0ComponentVillageStartPiece.field_74930_j.add(var9);
231 return var9;
232 }
233 }
234
235 return null;
236 }
237 else
238 {
239 return null;
240 }
241 }
242
243 /**
244 * attempts to find a next Structure Component to be spawned
245 */
246 static StructureComponent getNextStructureComponent(ComponentVillageStartPiece par0ComponentVillageStartPiece, List par1List, Random par2Random, int par3, int par4, int par5, int par6, int par7)
247 {
248 return getNextVillageStructureComponent(par0ComponentVillageStartPiece, par1List, par2Random, par3, par4, par5, par6, par7);
249 }
250
251 static StructureComponent getNextStructureComponentVillagePath(ComponentVillageStartPiece par0ComponentVillageStartPiece, List par1List, Random par2Random, int par3, int par4, int par5, int par6, int par7)
252 {
253 return getNextComponentVillagePath(par0ComponentVillageStartPiece, par1List, par2Random, par3, par4, par5, par6, par7);
254 }
255 }