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 }