    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}