package net.minecraft.world.gen.feature; import java.util.Random; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntityChest; import net.minecraft.tileentity.TileEntityMobSpawner; import net.minecraft.util.WeightedRandom; import net.minecraft.util.WeightedRandomChestContent; import net.minecraft.world.World; import net.minecraftforge.common.ChestGenHooks; import net.minecraftforge.common.DungeonHooks; import net.minecraftforge.common.MinecraftForge; public class WorldGenDungeons extends WorldGenerator { public boolean generate(World par1World, Random par2Random, int par3, int par4, int par5) { byte b0 = 3; int l = par2Random.nextInt(2) + 2; int i1 = par2Random.nextInt(2) + 2; int j1 = 0; int k1; int l1; int i2; for (k1 = par3 - l - 1; k1 <= par3 + l + 1; ++k1) { for (l1 = par4 - 1; l1 <= par4 + b0 + 1; ++l1) { for (i2 = par5 - i1 - 1; i2 <= par5 + i1 + 1; ++i2) { Material material = par1World.getBlockMaterial(k1, l1, i2); if (l1 == par4 - 1 && !material.isSolid()) { return false; } if (l1 == par4 + b0 + 1 && !material.isSolid()) { return false; } 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)) { ++j1; } } } } if (j1 >= 1 && j1 <= 5) { for (k1 = par3 - l - 1; k1 <= par3 + l + 1; ++k1) { for (l1 = par4 + b0; l1 >= par4 - 1; --l1) { for (i2 = par5 - i1 - 1; i2 <= par5 + i1 + 1; ++i2) { if (k1 != par3 - l - 1 && l1 != par4 - 1 && i2 != par5 - i1 - 1 && k1 != par3 + l + 1 && l1 != par4 + b0 + 1 && i2 != par5 + i1 + 1) { par1World.setBlockToAir(k1, l1, i2); } else if (l1 >= 0 && !par1World.getBlockMaterial(k1, l1 - 1, i2).isSolid()) { par1World.setBlockToAir(k1, l1, i2); } else if (par1World.getBlockMaterial(k1, l1, i2).isSolid()) { if (l1 == par4 - 1 && par2Random.nextInt(4) != 0) { par1World.setBlock(k1, l1, i2, Block.cobblestoneMossy.blockID, 0, 2); } else { par1World.setBlock(k1, l1, i2, Block.cobblestone.blockID, 0, 2); } } } } } k1 = 0; while (k1 < 2) { l1 = 0; while (true) { if (l1 < 3) { label210: { i2 = par3 + par2Random.nextInt(l * 2 + 1) - l; int j2 = par5 + par2Random.nextInt(i1 * 2 + 1) - i1; if (par1World.isAirBlock(i2, par4, j2)) { int k2 = 0; if (par1World.getBlockMaterial(i2 - 1, par4, j2).isSolid()) { ++k2; } if (par1World.getBlockMaterial(i2 + 1, par4, j2).isSolid()) { ++k2; } if (par1World.getBlockMaterial(i2, par4, j2 - 1).isSolid()) { ++k2; } if (par1World.getBlockMaterial(i2, par4, j2 + 1).isSolid()) { ++k2; } if (k2 == 1) { par1World.setBlock(i2, par4, j2, Block.chest.blockID, 0, 2); TileEntityChest tileentitychest = (TileEntityChest)par1World.getBlockTileEntity(i2, par4, j2); if (tileentitychest != null) { ChestGenHooks info = ChestGenHooks.getInfo(ChestGenHooks.DUNGEON_CHEST); WeightedRandomChestContent.generateChestContents(par2Random, info.getItems(par2Random), tileentitychest, info.getCount(par2Random)); } break label210; } } ++l1; continue; } } ++k1; break; } } par1World.setBlock(par3, par4, par5, Block.mobSpawner.blockID, 0, 2); TileEntityMobSpawner tileentitymobspawner = (TileEntityMobSpawner)par1World.getBlockTileEntity(par3, par4, par5); if (tileentitymobspawner != null) { tileentitymobspawner.func_98049_a().setMobID(this.pickMobSpawner(par2Random)); } else { System.err.println("Failed to fetch mob spawner entity at (" + par3 + ", " + par4 + ", " + par5 + ")"); } return true; } else { return false; } } /** * Picks potentially a random item to add to a dungeon chest. */ private ItemStack pickCheckLootItem(Random par1Random) { return ChestGenHooks.getOneItem(ChestGenHooks.DUNGEON_CHEST, par1Random); } /** * Randomly decides which spawner to use in a dungeon */ private String pickMobSpawner(Random par1Random) { return DungeonHooks.getRandomDungeonMob(par1Random); } }