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