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