    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 b0 = 3;
    023        int l = par2Random.nextInt(2) + 2;
    024        int i1 = par2Random.nextInt(2) + 2;
    025        int j1 = 0;
    026        int k1;
    027        int l1;
    028        int i2;
    029
    030        for (k1 = par3 - l - 1; k1 <= par3 + l + 1; ++k1)
    031        {
    032            for (l1 = par4 - 1; l1 <= par4 + b0 + 1; ++l1)
    033            {
    034                for (i2 = par5 - i1 - 1; i2 <= par5 + i1 + 1; ++i2)
    035                {
    036                    Material material = par1World.getBlockMaterial(k1, l1, i2);
    037
    038                    if (l1 == par4 - 1 && !material.isSolid())
    039                    {
    040                        return false;
    041                    }
    042
    043                    if (l1 == par4 + b0 + 1 && !material.isSolid())
    044                    {
    045                        return false;
    046                    }
    047
    048                    if ((k1 == par3 - l - 1 || k1 == par3 + l + 1 || i2 == par5 - i1 - 1 || i2 == par5 + i1 + 1) && l1 == par4 && par1World.isAirBlock(k1, l1, i2) && par1World.isAirBlock(k1, l1 + 1, i2))
    049                    {
    050                        ++j1;
    051                    }
    052                }
    053            }
    054        }
    055
    056        if (j1 >= 1 && j1 <= 5)
    057        {
    058            for (k1 = par3 - l - 1; k1 <= par3 + l + 1; ++k1)
    059            {
    060                for (l1 = par4 + b0; l1 >= par4 - 1; --l1)
    061                {
    062                    for (i2 = par5 - i1 - 1; i2 <= par5 + i1 + 1; ++i2)
    063                    {
    064                        if (k1 != par3 - l - 1 && l1 != par4 - 1 && i2 != par5 - i1 - 1 && k1 != par3 + l + 1 && l1 != par4 + b0 + 1 && i2 != par5 + i1 + 1)
    065                        {
    066                            par1World.func_94571_i(k1, l1, i2);
    067                        }
    068                        else if (l1 >= 0 && !par1World.getBlockMaterial(k1, l1 - 1, i2).isSolid())
    069                        {
    070                            par1World.func_94571_i(k1, l1, i2);
    071                        }
    072                        else if (par1World.getBlockMaterial(k1, l1, i2).isSolid())
    073                        {
    074                            if (l1 == par4 - 1 && par2Random.nextInt(4) != 0)
    075                            {
    076                                par1World.setBlockAndMetadataWithNotify(k1, l1, i2, Block.cobblestoneMossy.blockID, 0, 2);
    077                            }
    078                            else
    079                            {
    080                                par1World.setBlockAndMetadataWithNotify(k1, l1, i2, Block.cobblestone.blockID, 0, 2);
    081                            }
    082                        }
    083                    }
    084                }
    085            }
    086
    087            k1 = 0;
    088
    089            while (k1 < 2)
    090            {
    091                l1 = 0;
    092
    093                while (true)
    094                {
    095                    if (l1 < 3)
    096                    {
    097                        label210:
    098                        {
    099                            i2 = par3 + par2Random.nextInt(l * 2 + 1) - l;
    100                            int j2 = par5 + par2Random.nextInt(i1 * 2 + 1) - i1;
    101
    102                            if (par1World.isAirBlock(i2, par4, j2))
    103                            {
    104                                int k2 = 0;
    105
    106                                if (par1World.getBlockMaterial(i2 - 1, par4, j2).isSolid())
    107                                {
    108                                    ++k2;
    109                                }
    110
    111                                if (par1World.getBlockMaterial(i2 + 1, par4, j2).isSolid())
    112                                {
    113                                    ++k2;
    114                                }
    115
    116                                if (par1World.getBlockMaterial(i2, par4, j2 - 1).isSolid())
    117                                {
    118                                    ++k2;
    119                                }
    120
    121                                if (par1World.getBlockMaterial(i2, par4, j2 + 1).isSolid())
    122                                {
    123                                    ++k2;
    124                                }
    125
    126                                if (k2 == 1)
    127                                {
    128                                    par1World.setBlockAndMetadataWithNotify(i2, par4, j2, Block.chest.blockID, 0, 2);
    129                                    TileEntityChest tileentitychest = (TileEntityChest)par1World.getBlockTileEntity(i2, par4, j2);
    130
    131                                    if (tileentitychest != null)
    132                                    {
    133                                        ChestGenHooks info = ChestGenHooks.getInfo(ChestGenHooks.DUNGEON_CHEST);
    134                                        WeightedRandomChestContent.generateChestContents(par2Random, info.getItems(par2Random), tileentitychest, info.getCount(par2Random));
    135                                    }
    136
    137                                    break label210;
    138                                }
    139                            }
    140
    141                            ++l1;
    142                            continue;
    143                        }
    144                    }
    145
    146                    ++k1;
    147                    break;
    148                }
    149            }
    150
    151            par1World.setBlockAndMetadataWithNotify(par3, par4, par5, Block.mobSpawner.blockID, 0, 2);
    152            TileEntityMobSpawner tileentitymobspawner = (TileEntityMobSpawner)par1World.getBlockTileEntity(par3, par4, par5);
    153
    154            if (tileentitymobspawner != null)
    155            {
    156                tileentitymobspawner.func_98049_a().func_98272_a(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}