001    package net.minecraft.src;
002    
003    import java.util.Random;
004    
005    import net.minecraftforge.common.DungeonHooks;
006    import net.minecraftforge.common.MinecraftForge;
007    
008    public class WorldGenDungeons extends WorldGenerator
009    {
010        public boolean generate(World par1World, Random par2Random, int par3, int par4, int par5)
011        {
012            byte var6 = 3;
013            int var7 = par2Random.nextInt(2) + 2;
014            int var8 = par2Random.nextInt(2) + 2;
015            int var9 = 0;
016            int var10;
017            int var11;
018            int var12;
019    
020            for (var10 = par3 - var7 - 1; var10 <= par3 + var7 + 1; ++var10)
021            {
022                for (var11 = par4 - 1; var11 <= par4 + var6 + 1; ++var11)
023                {
024                    for (var12 = par5 - var8 - 1; var12 <= par5 + var8 + 1; ++var12)
025                    {
026                        Material var13 = par1World.getBlockMaterial(var10, var11, var12);
027    
028                        if (var11 == par4 - 1 && !var13.isSolid())
029                        {
030                            return false;
031                        }
032    
033                        if (var11 == par4 + var6 + 1 && !var13.isSolid())
034                        {
035                            return false;
036                        }
037    
038                        if ((var10 == par3 - var7 - 1 || var10 == par3 + var7 + 1 || var12 == par5 - var8 - 1 || var12 == par5 + var8 + 1) && var11 == par4 && par1World.isAirBlock(var10, var11, var12) && par1World.isAirBlock(var10, var11 + 1, var12))
039                        {
040                            ++var9;
041                        }
042                    }
043                }
044            }
045    
046            if (var9 >= 1 && var9 <= 5)
047            {
048                for (var10 = par3 - var7 - 1; var10 <= par3 + var7 + 1; ++var10)
049                {
050                    for (var11 = par4 + var6; var11 >= par4 - 1; --var11)
051                    {
052                        for (var12 = par5 - var8 - 1; var12 <= par5 + var8 + 1; ++var12)
053                        {
054                            if (var10 != par3 - var7 - 1 && var11 != par4 - 1 && var12 != par5 - var8 - 1 && var10 != par3 + var7 + 1 && var11 != par4 + var6 + 1 && var12 != par5 + var8 + 1)
055                            {
056                                par1World.setBlockWithNotify(var10, var11, var12, 0);
057                            }
058                            else if (var11 >= 0 && !par1World.getBlockMaterial(var10, var11 - 1, var12).isSolid())
059                            {
060                                par1World.setBlockWithNotify(var10, var11, var12, 0);
061                            }
062                            else if (par1World.getBlockMaterial(var10, var11, var12).isSolid())
063                            {
064                                if (var11 == par4 - 1 && par2Random.nextInt(4) != 0)
065                                {
066                                    par1World.setBlockWithNotify(var10, var11, var12, Block.cobblestoneMossy.blockID);
067                                }
068                                else
069                                {
070                                    par1World.setBlockWithNotify(var10, var11, var12, Block.cobblestone.blockID);
071                                }
072                            }
073                        }
074                    }
075                }
076    
077                var10 = 0;
078    
079                while (var10 < 2)
080                {
081                    var11 = 0;
082    
083                    while (true)
084                    {
085                        if (var11 < 3)
086                        {
087                            label210:
088                            {
089                                var12 = par3 + par2Random.nextInt(var7 * 2 + 1) - var7;
090                                int var14 = par5 + par2Random.nextInt(var8 * 2 + 1) - var8;
091    
092                                if (par1World.isAirBlock(var12, par4, var14))
093                                {
094                                    int var15 = 0;
095    
096                                    if (par1World.getBlockMaterial(var12 - 1, par4, var14).isSolid())
097                                    {
098                                        ++var15;
099                                    }
100    
101                                    if (par1World.getBlockMaterial(var12 + 1, par4, var14).isSolid())
102                                    {
103                                        ++var15;
104                                    }
105    
106                                    if (par1World.getBlockMaterial(var12, par4, var14 - 1).isSolid())
107                                    {
108                                        ++var15;
109                                    }
110    
111                                    if (par1World.getBlockMaterial(var12, par4, var14 + 1).isSolid())
112                                    {
113                                        ++var15;
114                                    }
115    
116                                    if (var15 == 1)
117                                    {
118                                        par1World.setBlockWithNotify(var12, par4, var14, Block.chest.blockID);
119                                        TileEntityChest var16 = (TileEntityChest)par1World.getBlockTileEntity(var12, par4, var14);
120    
121                                        if (var16 != null)
122                                        {
123                                            for (int var17 = 0; var17 < DungeonHooks.getDungeonLootTries(); ++var17)
124                                            {
125                                                ItemStack var18 = DungeonHooks.getRandomDungeonLoot(par2Random);
126    
127                                                if (var18 != null)
128                                                {
129                                                    var16.setInventorySlotContents(par2Random.nextInt(var16.getSizeInventory()), var18);
130                                                }
131                                            }
132                                        }
133    
134                                        break label210;
135                                    }
136                                }
137    
138                                ++var11;
139                                continue;
140                            }
141                        }
142    
143                        ++var10;
144                        break;
145                    }
146                }
147    
148                par1World.setBlockWithNotify(par3, par4, par5, Block.mobSpawner.blockID);
149                TileEntityMobSpawner var19 = (TileEntityMobSpawner)par1World.getBlockTileEntity(par3, par4, par5);
150    
151                if (var19 != null)
152                {
153                    var19.setMobID(DungeonHooks.getRandomDungeonMob(par2Random));
154                }
155                else
156                {
157                    System.err.println("Failed to fetch mob spawner entity at (" + par3 + ", " + par4 + ", " + par5 + ")");
158                }
159    
160                return true;
161            }
162            else
163            {
164                return false;
165            }
166        }
167    
168        /**
169         * Picks potentially a random item to add to a dungeon chest.
170         */
171        private ItemStack pickCheckLootItem(Random par1Random)
172        {
173            int var2 = par1Random.nextInt(11);
174            return var2 == 0 ? new ItemStack(Item.saddle) : (var2 == 1 ? new ItemStack(Item.ingotIron, par1Random.nextInt(4) + 1) : (var2 == 2 ? new ItemStack(Item.bread) : (var2 == 3 ? new ItemStack(Item.wheat, par1Random.nextInt(4) + 1) : (var2 == 4 ? new ItemStack(Item.gunpowder, par1Random.nextInt(4) + 1) : (var2 == 5 ? new ItemStack(Item.silk, par1Random.nextInt(4) + 1) : (var2 == 6 ? new ItemStack(Item.bucketEmpty) : (var2 == 7 && par1Random.nextInt(100) == 0 ? new ItemStack(Item.appleGold) : (var2 == 8 && par1Random.nextInt(2) == 0 ? new ItemStack(Item.redstone, par1Random.nextInt(4) + 1) : (var2 == 9 && par1Random.nextInt(10) == 0 ? new ItemStack(Item.itemsList[Item.record13.shiftedIndex + par1Random.nextInt(2)]) : (var2 == 10 ? new ItemStack(Item.dyePowder, 1, 3) : null))))))))));
175        }
176    
177        /**
178         * Randomly decides which spawner to use in a dungeon
179         */
180        private String pickMobSpawner(Random par1Random)
181        {
182            int var2 = par1Random.nextInt(4);
183            return var2 == 0 ? "Skeleton" : (var2 == 1 ? "Zombie" : (var2 == 2 ? "Zombie" : (var2 == 3 ? "Spider" : "")));
184        }
185    }