001package net.minecraft.world.gen.feature;
002
003import java.util.Random;
004import net.minecraft.block.Block;
005import net.minecraft.block.material.Material;
006import net.minecraft.item.Item;
007import net.minecraft.item.ItemStack;
008import net.minecraft.tileentity.TileEntityChest;
009import net.minecraft.tileentity.TileEntityMobSpawner;
010import net.minecraft.util.WeightedRandom;
011import net.minecraft.util.WeightedRandomChestContent;
012import net.minecraft.world.World;
013
014import net.minecraftforge.common.ChestGenHooks;
015import net.minecraftforge.common.DungeonHooks;
016import net.minecraftforge.common.MinecraftForge;
017
018public 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}