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    }