001package net.minecraft.world.gen.structure; 002 003import java.util.ArrayList; 004import java.util.Iterator; 005import java.util.List; 006import java.util.Random; 007 008import cpw.mods.fml.common.registry.VillagerRegistry; 009import net.minecraft.util.MathHelper; 010 011public class StructureVillagePieces 012{ 013 public static ArrayList getStructureVillageWeightedPieceList(Random par0Random, int par1) 014 { 015 ArrayList arraylist = new ArrayList(); 016 arraylist.add(new StructureVillagePieceWeight(ComponentVillageHouse4_Garden.class, 4, MathHelper.getRandomIntegerInRange(par0Random, 2 + par1, 4 + par1 * 2))); 017 arraylist.add(new StructureVillagePieceWeight(ComponentVillageChurch.class, 20, MathHelper.getRandomIntegerInRange(par0Random, 0 + par1, 1 + par1))); 018 arraylist.add(new StructureVillagePieceWeight(ComponentVillageHouse1.class, 20, MathHelper.getRandomIntegerInRange(par0Random, 0 + par1, 2 + par1))); 019 arraylist.add(new StructureVillagePieceWeight(ComponentVillageWoodHut.class, 3, MathHelper.getRandomIntegerInRange(par0Random, 2 + par1, 5 + par1 * 3))); 020 arraylist.add(new StructureVillagePieceWeight(ComponentVillageHall.class, 15, MathHelper.getRandomIntegerInRange(par0Random, 0 + par1, 2 + par1))); 021 arraylist.add(new StructureVillagePieceWeight(ComponentVillageField.class, 3, MathHelper.getRandomIntegerInRange(par0Random, 1 + par1, 4 + par1))); 022 arraylist.add(new StructureVillagePieceWeight(ComponentVillageField2.class, 3, MathHelper.getRandomIntegerInRange(par0Random, 2 + par1, 4 + par1 * 2))); 023 arraylist.add(new StructureVillagePieceWeight(ComponentVillageHouse2.class, 15, MathHelper.getRandomIntegerInRange(par0Random, 0, 1 + par1))); 024 arraylist.add(new StructureVillagePieceWeight(ComponentVillageHouse3.class, 8, MathHelper.getRandomIntegerInRange(par0Random, 0 + par1, 3 + par1 * 2))); 025 VillagerRegistry.addExtraVillageComponents(arraylist, par0Random, par1); 026 027 Iterator iterator = arraylist.iterator(); 028 029 while (iterator.hasNext()) 030 { 031 if (((StructureVillagePieceWeight)iterator.next()).villagePiecesLimit == 0) 032 { 033 iterator.remove(); 034 } 035 } 036 037 return arraylist; 038 } 039 040 private static int func_75079_a(List par0List) 041 { 042 boolean flag = false; 043 int i = 0; 044 StructureVillagePieceWeight structurevillagepieceweight; 045 046 for (Iterator iterator = par0List.iterator(); iterator.hasNext(); i += structurevillagepieceweight.villagePieceWeight) 047 { 048 structurevillagepieceweight = (StructureVillagePieceWeight)iterator.next(); 049 050 if (structurevillagepieceweight.villagePiecesLimit > 0 && structurevillagepieceweight.villagePiecesSpawned < structurevillagepieceweight.villagePiecesLimit) 051 { 052 flag = true; 053 } 054 } 055 056 return flag ? i : -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 oclass = par1StructureVillagePieceWeight.villagePieceClass; 062 Object object = null; 063 064 if (oclass == ComponentVillageHouse4_Garden.class) 065 { 066 object = ComponentVillageHouse4_Garden.func_74912_a(par0ComponentVillageStartPiece, par2List, par3Random, par4, par5, par6, par7, par8); 067 } 068 else if (oclass == ComponentVillageChurch.class) 069 { 070 object = ComponentVillageChurch.func_74919_a(par0ComponentVillageStartPiece, par2List, par3Random, par4, par5, par6, par7, par8); 071 } 072 else if (oclass == ComponentVillageHouse1.class) 073 { 074 object = ComponentVillageHouse1.func_74898_a(par0ComponentVillageStartPiece, par2List, par3Random, par4, par5, par6, par7, par8); 075 } 076 else if (oclass == ComponentVillageWoodHut.class) 077 { 078 object = ComponentVillageWoodHut.func_74908_a(par0ComponentVillageStartPiece, par2List, par3Random, par4, par5, par6, par7, par8); 079 } 080 else if (oclass == ComponentVillageHall.class) 081 { 082 object = ComponentVillageHall.func_74906_a(par0ComponentVillageStartPiece, par2List, par3Random, par4, par5, par6, par7, par8); 083 } 084 else if (oclass == ComponentVillageField.class) 085 { 086 object = ComponentVillageField.func_74900_a(par0ComponentVillageStartPiece, par2List, par3Random, par4, par5, par6, par7, par8); 087 } 088 else if (oclass == ComponentVillageField2.class) 089 { 090 object = ComponentVillageField2.func_74902_a(par0ComponentVillageStartPiece, par2List, par3Random, par4, par5, par6, par7, par8); 091 } 092 else if (oclass == ComponentVillageHouse2.class) 093 { 094 object = ComponentVillageHouse2.func_74915_a(par0ComponentVillageStartPiece, par2List, par3Random, par4, par5, par6, par7, par8); 095 } 096 else if (oclass == ComponentVillageHouse3.class) 097 { 098 object = ComponentVillageHouse3.func_74921_a(par0ComponentVillageStartPiece, par2List, par3Random, par4, par5, par6, par7, par8); 099 } 100 else 101 { 102 object = VillagerRegistry.getVillageComponent(par1StructureVillagePieceWeight, par0ComponentVillageStartPiece , par2List, par3Random, par4, par5, par6, par7, par8); 103 } 104 105 return (ComponentVillage)object; 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 j1 = func_75079_a(par0ComponentVillageStartPiece.structureVillageWeightedPieceList); 114 115 if (j1 <= 0) 116 { 117 return null; 118 } 119 else 120 { 121 int k1 = 0; 122 123 while (k1 < 5) 124 { 125 ++k1; 126 int l1 = par2Random.nextInt(j1); 127 Iterator iterator = par0ComponentVillageStartPiece.structureVillageWeightedPieceList.iterator(); 128 129 while (iterator.hasNext()) 130 { 131 StructureVillagePieceWeight structurevillagepieceweight = (StructureVillagePieceWeight)iterator.next(); 132 l1 -= structurevillagepieceweight.villagePieceWeight; 133 134 if (l1 < 0) 135 { 136 if (!structurevillagepieceweight.canSpawnMoreVillagePiecesOfType(par7) || structurevillagepieceweight == par0ComponentVillageStartPiece.structVillagePieceWeight && par0ComponentVillageStartPiece.structureVillageWeightedPieceList.size() > 1) 137 { 138 break; 139 } 140 141 ComponentVillage componentvillage = func_75083_a(par0ComponentVillageStartPiece, structurevillagepieceweight, par1List, par2Random, par3, par4, par5, par6, par7); 142 143 if (componentvillage != null) 144 { 145 ++structurevillagepieceweight.villagePiecesSpawned; 146 par0ComponentVillageStartPiece.structVillagePieceWeight = structurevillagepieceweight; 147 148 if (!structurevillagepieceweight.canSpawnMoreVillagePieces()) 149 { 150 par0ComponentVillageStartPiece.structureVillageWeightedPieceList.remove(structurevillagepieceweight); 151 } 152 153 return componentvillage; 154 } 155 } 156 } 157 } 158 159 StructureBoundingBox structureboundingbox = ComponentVillageTorch.func_74904_a(par0ComponentVillageStartPiece, par1List, par2Random, par3, par4, par5, par6); 160 161 if (structureboundingbox != null) 162 { 163 return new ComponentVillageTorch(par0ComponentVillageStartPiece, par7, par2Random, structureboundingbox, 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 componentvillage = getNextVillageComponent(par0ComponentVillageStartPiece, par1List, par2Random, par3, par4, par5, par6, par7 + 1); 184 185 if (componentvillage != null) 186 { 187 int j1 = (componentvillage.boundingBox.minX + componentvillage.boundingBox.maxX) / 2; 188 int k1 = (componentvillage.boundingBox.minZ + componentvillage.boundingBox.maxZ) / 2; 189 int l1 = componentvillage.boundingBox.maxX - componentvillage.boundingBox.minX; 190 int i2 = componentvillage.boundingBox.maxZ - componentvillage.boundingBox.minZ; 191 int j2 = l1 > i2 ? l1 : i2; 192 193 if (par0ComponentVillageStartPiece.getWorldChunkManager().areBiomesViable(j1, k1, j2 / 2 + 4, MapGenVillage.villageSpawnBiomes)) 194 { 195 par1List.add(componentvillage); 196 par0ComponentVillageStartPiece.field_74932_i.add(componentvillage); 197 return componentvillage; 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 structureboundingbox = ComponentVillagePathGen.func_74933_a(par0ComponentVillageStartPiece, par1List, par2Random, par3, par4, par5, par6); 218 219 if (structureboundingbox != null && structureboundingbox.minY > 10) 220 { 221 ComponentVillagePathGen componentvillagepathgen = new ComponentVillagePathGen(par0ComponentVillageStartPiece, par7, par2Random, structureboundingbox, par6); 222 int j1 = (componentvillagepathgen.boundingBox.minX + componentvillagepathgen.boundingBox.maxX) / 2; 223 int k1 = (componentvillagepathgen.boundingBox.minZ + componentvillagepathgen.boundingBox.maxZ) / 2; 224 int l1 = componentvillagepathgen.boundingBox.maxX - componentvillagepathgen.boundingBox.minX; 225 int i2 = componentvillagepathgen.boundingBox.maxZ - componentvillagepathgen.boundingBox.minZ; 226 int j2 = l1 > i2 ? l1 : i2; 227 228 if (par0ComponentVillageStartPiece.getWorldChunkManager().areBiomesViable(j1, k1, j2 / 2 + 4, MapGenVillage.villageSpawnBiomes)) 229 { 230 par1List.add(componentvillagepathgen); 231 par0ComponentVillageStartPiece.field_74930_j.add(componentvillagepathgen); 232 return componentvillagepathgen; 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}