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