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    public class StructureStrongholdPieces
009    {
010        private static final StructureStrongholdPieceWeight[] pieceWeightArray = new StructureStrongholdPieceWeight[] {new StructureStrongholdPieceWeight(ComponentStrongholdStraight.class, 40, 0), new StructureStrongholdPieceWeight(ComponentStrongholdPrison.class, 5, 5), new StructureStrongholdPieceWeight(ComponentStrongholdLeftTurn.class, 20, 0), new StructureStrongholdPieceWeight(ComponentStrongholdRightTurn.class, 20, 0), new StructureStrongholdPieceWeight(ComponentStrongholdRoomCrossing.class, 10, 6), new StructureStrongholdPieceWeight(ComponentStrongholdStairsStraight.class, 5, 5), new StructureStrongholdPieceWeight(ComponentStrongholdStairs.class, 5, 5), new StructureStrongholdPieceWeight(ComponentStrongholdCrossing.class, 5, 4), new StructureStrongholdPieceWeight(ComponentStrongholdChestCorridor.class, 5, 4), new StructureStrongholdPieceWeight2(ComponentStrongholdLibrary.class, 10, 2), new StructureStrongholdPieceWeight3(ComponentStrongholdPortalRoom.class, 20, 1)};
011        private static List structurePieceList;
012        private static Class strongComponentType;
013        static int totalWeight = 0;
014        private static final StructureStrongholdStones strongholdStones = new StructureStrongholdStones((StructureStrongholdPieceWeight2)null);
015    
016        /**
017         * sets up Arrays with the Structure pieces and their weights
018         */
019        public static void prepareStructurePieces()
020        {
021            structurePieceList = new ArrayList();
022            StructureStrongholdPieceWeight[] var0 = pieceWeightArray;
023            int var1 = var0.length;
024    
025            for (int var2 = 0; var2 < var1; ++var2)
026            {
027                StructureStrongholdPieceWeight var3 = var0[var2];
028                var3.instancesSpawned = 0;
029                structurePieceList.add(var3);
030            }
031    
032            strongComponentType = null;
033        }
034    
035        private static boolean canAddStructurePieces()
036        {
037            boolean var0 = false;
038            totalWeight = 0;
039            StructureStrongholdPieceWeight var2;
040    
041            for (Iterator var1 = structurePieceList.iterator(); var1.hasNext(); totalWeight += var2.pieceWeight)
042            {
043                var2 = (StructureStrongholdPieceWeight)var1.next();
044    
045                if (var2.instancesLimit > 0 && var2.instancesSpawned < var2.instancesLimit)
046                {
047                    var0 = true;
048                }
049            }
050    
051            return var0;
052        }
053    
054        /**
055         * translates the PieceWeight class to the Component class
056         */
057        private static ComponentStronghold getStrongholdComponentFromWeightedPiece(Class par0Class, List par1List, Random par2Random, int par3, int par4, int par5, int par6, int par7)
058        {
059            Object var8 = null;
060    
061            if (par0Class == ComponentStrongholdStraight.class)
062            {
063                var8 = ComponentStrongholdStraight.findValidPlacement(par1List, par2Random, par3, par4, par5, par6, par7);
064            }
065            else if (par0Class == ComponentStrongholdPrison.class)
066            {
067                var8 = ComponentStrongholdPrison.findValidPlacement(par1List, par2Random, par3, par4, par5, par6, par7);
068            }
069            else if (par0Class == ComponentStrongholdLeftTurn.class)
070            {
071                var8 = ComponentStrongholdLeftTurn.findValidPlacement(par1List, par2Random, par3, par4, par5, par6, par7);
072            }
073            else if (par0Class == ComponentStrongholdRightTurn.class)
074            {
075                var8 = ComponentStrongholdRightTurn.findValidPlacement(par1List, par2Random, par3, par4, par5, par6, par7);
076            }
077            else if (par0Class == ComponentStrongholdRoomCrossing.class)
078            {
079                var8 = ComponentStrongholdRoomCrossing.findValidPlacement(par1List, par2Random, par3, par4, par5, par6, par7);
080            }
081            else if (par0Class == ComponentStrongholdStairsStraight.class)
082            {
083                var8 = ComponentStrongholdStairsStraight.findValidPlacement(par1List, par2Random, par3, par4, par5, par6, par7);
084            }
085            else if (par0Class == ComponentStrongholdStairs.class)
086            {
087                var8 = ComponentStrongholdStairs.getStrongholdStairsComponent(par1List, par2Random, par3, par4, par5, par6, par7);
088            }
089            else if (par0Class == ComponentStrongholdCrossing.class)
090            {
091                var8 = ComponentStrongholdCrossing.findValidPlacement(par1List, par2Random, par3, par4, par5, par6, par7);
092            }
093            else if (par0Class == ComponentStrongholdChestCorridor.class)
094            {
095                var8 = ComponentStrongholdChestCorridor.findValidPlacement(par1List, par2Random, par3, par4, par5, par6, par7);
096            }
097            else if (par0Class == ComponentStrongholdLibrary.class)
098            {
099                var8 = ComponentStrongholdLibrary.findValidPlacement(par1List, par2Random, par3, par4, par5, par6, par7);
100            }
101            else if (par0Class == ComponentStrongholdPortalRoom.class)
102            {
103                var8 = ComponentStrongholdPortalRoom.findValidPlacement(par1List, par2Random, par3, par4, par5, par6, par7);
104            }
105    
106            return (ComponentStronghold)var8;
107        }
108    
109        private static ComponentStronghold getNextComponent(ComponentStrongholdStairs2 par0ComponentStrongholdStairs2, List par1List, Random par2Random, int par3, int par4, int par5, int par6, int par7)
110        {
111            if (!canAddStructurePieces())
112            {
113                return null;
114            }
115            else
116            {
117                if (strongComponentType != null)
118                {
119                    ComponentStronghold var8 = getStrongholdComponentFromWeightedPiece(strongComponentType, par1List, par2Random, par3, par4, par5, par6, par7);
120                    strongComponentType = null;
121    
122                    if (var8 != null)
123                    {
124                        return var8;
125                    }
126                }
127    
128                int var13 = 0;
129    
130                while (var13 < 5)
131                {
132                    ++var13;
133                    int var9 = par2Random.nextInt(totalWeight);
134                    Iterator var10 = structurePieceList.iterator();
135    
136                    while (var10.hasNext())
137                    {
138                        StructureStrongholdPieceWeight var11 = (StructureStrongholdPieceWeight)var10.next();
139                        var9 -= var11.pieceWeight;
140    
141                        if (var9 < 0)
142                        {
143                            if (!var11.canSpawnMoreStructuresOfType(par7) || var11 == par0ComponentStrongholdStairs2.strongholdPieceWeight)
144                            {
145                                break;
146                            }
147    
148                            ComponentStronghold var12 = getStrongholdComponentFromWeightedPiece(var11.pieceClass, par1List, par2Random, par3, par4, par5, par6, par7);
149    
150                            if (var12 != null)
151                            {
152                                ++var11.instancesSpawned;
153                                par0ComponentStrongholdStairs2.strongholdPieceWeight = var11;
154    
155                                if (!var11.canSpawnMoreStructures())
156                                {
157                                    structurePieceList.remove(var11);
158                                }
159    
160                                return var12;
161                            }
162                        }
163                    }
164                }
165    
166                StructureBoundingBox var14 = ComponentStrongholdCorridor.func_74992_a(par1List, par2Random, par3, par4, par5, par6);
167    
168                if (var14 != null && var14.minY > 1)
169                {
170                    return new ComponentStrongholdCorridor(par7, par2Random, var14, par6);
171                }
172                else
173                {
174                    return null;
175                }
176            }
177        }
178    
179        private static StructureComponent getNextValidComponent(ComponentStrongholdStairs2 par0ComponentStrongholdStairs2, List par1List, Random par2Random, int par3, int par4, int par5, int par6, int par7)
180        {
181            if (par7 > 50)
182            {
183                return null;
184            }
185            else if (Math.abs(par3 - par0ComponentStrongholdStairs2.getBoundingBox().minX) <= 112 && Math.abs(par5 - par0ComponentStrongholdStairs2.getBoundingBox().minZ) <= 112)
186            {
187                ComponentStronghold var8 = getNextComponent(par0ComponentStrongholdStairs2, par1List, par2Random, par3, par4, par5, par6, par7 + 1);
188    
189                if (var8 != null)
190                {
191                    par1List.add(var8);
192                    par0ComponentStrongholdStairs2.field_75026_c.add(var8);
193                }
194    
195                return var8;
196            }
197            else
198            {
199                return null;
200            }
201        }
202    
203        static StructureComponent getNextValidComponentAccess(ComponentStrongholdStairs2 par0ComponentStrongholdStairs2, List par1List, Random par2Random, int par3, int par4, int par5, int par6, int par7)
204        {
205            return getNextValidComponent(par0ComponentStrongholdStairs2, par1List, par2Random, par3, par4, par5, par6, par7);
206        }
207    
208        static Class setComponentType(Class par0Class)
209        {
210            strongComponentType = par0Class;
211            return par0Class;
212        }
213    
214        static StructureStrongholdStones getStrongholdStones()
215        {
216            return strongholdStones;
217        }
218    }