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    }