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.util.WeightedRandom;
011 import net.minecraft.util.WeightedRandomChestContent;
012 import net.minecraft.world.World;
013
014 import net.minecraftforge.common.ChestGenHooks;
015 import net.minecraftforge.common.DungeonHooks;
016 import net.minecraftforge.common.MinecraftForge;
017
018 public class WorldGenDungeons extends WorldGenerator
019 {
020 public boolean generate(World par1World, Random par2Random, int par3, int par4, int par5)
021 {
022 byte var6 = 3;
023 int var7 = par2Random.nextInt(2) + 2;
024 int var8 = par2Random.nextInt(2) + 2;
025 int var9 = 0;
026 int var10;
027 int var11;
028 int var12;
029
030 for (var10 = par3 - var7 - 1; var10 <= par3 + var7 + 1; ++var10)
031 {
032 for (var11 = par4 - 1; var11 <= par4 + var6 + 1; ++var11)
033 {
034 for (var12 = par5 - var8 - 1; var12 <= par5 + var8 + 1; ++var12)
035 {
036 Material var13 = par1World.getBlockMaterial(var10, var11, var12);
037
038 if (var11 == par4 - 1 && !var13.isSolid())
039 {
040 return false;
041 }
042
043 if (var11 == par4 + var6 + 1 && !var13.isSolid())
044 {
045 return false;
046 }
047
048 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))
049 {
050 ++var9;
051 }
052 }
053 }
054 }
055
056 if (var9 >= 1 && var9 <= 5)
057 {
058 for (var10 = par3 - var7 - 1; var10 <= par3 + var7 + 1; ++var10)
059 {
060 for (var11 = par4 + var6; var11 >= par4 - 1; --var11)
061 {
062 for (var12 = par5 - var8 - 1; var12 <= par5 + var8 + 1; ++var12)
063 {
064 if (var10 != par3 - var7 - 1 && var11 != par4 - 1 && var12 != par5 - var8 - 1 && var10 != par3 + var7 + 1 && var11 != par4 + var6 + 1 && var12 != par5 + var8 + 1)
065 {
066 par1World.setBlockWithNotify(var10, var11, var12, 0);
067 }
068 else if (var11 >= 0 && !par1World.getBlockMaterial(var10, var11 - 1, var12).isSolid())
069 {
070 par1World.setBlockWithNotify(var10, var11, var12, 0);
071 }
072 else if (par1World.getBlockMaterial(var10, var11, var12).isSolid())
073 {
074 if (var11 == par4 - 1 && par2Random.nextInt(4) != 0)
075 {
076 par1World.setBlockWithNotify(var10, var11, var12, Block.cobblestoneMossy.blockID);
077 }
078 else
079 {
080 par1World.setBlockWithNotify(var10, var11, var12, Block.cobblestone.blockID);
081 }
082 }
083 }
084 }
085 }
086
087 var10 = 0;
088
089 while (var10 < 2)
090 {
091 var11 = 0;
092
093 while (true)
094 {
095 if (var11 < 3)
096 {
097 label210:
098 {
099 var12 = par3 + par2Random.nextInt(var7 * 2 + 1) - var7;
100 int var14 = par5 + par2Random.nextInt(var8 * 2 + 1) - var8;
101
102 if (par1World.isAirBlock(var12, par4, var14))
103 {
104 int var15 = 0;
105
106 if (par1World.getBlockMaterial(var12 - 1, par4, var14).isSolid())
107 {
108 ++var15;
109 }
110
111 if (par1World.getBlockMaterial(var12 + 1, par4, var14).isSolid())
112 {
113 ++var15;
114 }
115
116 if (par1World.getBlockMaterial(var12, par4, var14 - 1).isSolid())
117 {
118 ++var15;
119 }
120
121 if (par1World.getBlockMaterial(var12, par4, var14 + 1).isSolid())
122 {
123 ++var15;
124 }
125
126 if (var15 == 1)
127 {
128 par1World.setBlockWithNotify(var12, par4, var14, Block.chest.blockID);
129 TileEntityChest var16 = (TileEntityChest)par1World.getBlockTileEntity(var12, par4, var14);
130
131 if (var16 != null)
132 {
133 ChestGenHooks info = ChestGenHooks.getInfo(ChestGenHooks.DUNGEON_CHEST);
134 WeightedRandomChestContent.generateChestContents(par2Random, info.getItems(par2Random), var16, info.getCount(par2Random));
135 }
136
137 break label210;
138 }
139 }
140
141 ++var11;
142 continue;
143 }
144 }
145
146 ++var10;
147 break;
148 }
149 }
150
151 par1World.setBlockWithNotify(par3, par4, par5, Block.mobSpawner.blockID);
152 TileEntityMobSpawner var19 = (TileEntityMobSpawner)par1World.getBlockTileEntity(par3, par4, par5);
153
154 if (var19 != null)
155 {
156 var19.setMobID(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 }