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