001 package net.minecraft.world.gen.structure; 002 003 import java.util.List; 004 import java.util.Random; 005 import net.minecraft.block.Block; 006 import net.minecraft.item.Item; 007 import net.minecraft.tileentity.TileEntityMobSpawner; 008 import net.minecraft.util.WeightedRandomChestContent; 009 import net.minecraft.world.World; 010 011 import net.minecraftforge.common.ChestGenHooks; 012 import static net.minecraftforge.common.ChestGenHooks.*; 013 014 public class ComponentMineshaftCorridor extends StructureComponent 015 { 016 private final boolean hasRails; 017 private final boolean hasSpiders; 018 private boolean spawnerPlaced; 019 020 /** 021 * A count of the different sections of this mine. The space between ceiling supports. 022 */ 023 private int sectionCount; 024 025 public ComponentMineshaftCorridor(int par1, Random par2Random, StructureBoundingBox par3StructureBoundingBox, int par4) 026 { 027 super(par1); 028 this.coordBaseMode = par4; 029 this.boundingBox = par3StructureBoundingBox; 030 this.hasRails = par2Random.nextInt(3) == 0; 031 this.hasSpiders = !this.hasRails && par2Random.nextInt(23) == 0; 032 033 if (this.coordBaseMode != 2 && this.coordBaseMode != 0) 034 { 035 this.sectionCount = par3StructureBoundingBox.getXSize() / 5; 036 } 037 else 038 { 039 this.sectionCount = par3StructureBoundingBox.getZSize() / 5; 040 } 041 } 042 043 public static StructureBoundingBox findValidPlacement(List par0List, Random par1Random, int par2, int par3, int par4, int par5) 044 { 045 StructureBoundingBox var6 = new StructureBoundingBox(par2, par3, par4, par2, par3 + 2, par4); 046 int var7; 047 048 for (var7 = par1Random.nextInt(3) + 2; var7 > 0; --var7) 049 { 050 int var8 = var7 * 5; 051 052 switch (par5) 053 { 054 case 0: 055 var6.maxX = par2 + 2; 056 var6.maxZ = par4 + (var8 - 1); 057 break; 058 case 1: 059 var6.minX = par2 - (var8 - 1); 060 var6.maxZ = par4 + 2; 061 break; 062 case 2: 063 var6.maxX = par2 + 2; 064 var6.minZ = par4 - (var8 - 1); 065 break; 066 case 3: 067 var6.maxX = par2 + (var8 - 1); 068 var6.maxZ = par4 + 2; 069 } 070 071 if (StructureComponent.findIntersecting(par0List, var6) == null) 072 { 073 break; 074 } 075 } 076 077 return var7 > 0 ? var6 : null; 078 } 079 080 /** 081 * Initiates construction of the Structure Component picked, at the current Location of StructGen 082 */ 083 public void buildComponent(StructureComponent par1StructureComponent, List par2List, Random par3Random) 084 { 085 int var4 = this.getComponentType(); 086 int var5 = par3Random.nextInt(4); 087 088 switch (this.coordBaseMode) 089 { 090 case 0: 091 if (var5 <= 1) 092 { 093 StructureMineshaftPieces.getNextComponent(par1StructureComponent, par2List, par3Random, this.boundingBox.minX, this.boundingBox.minY - 1 + par3Random.nextInt(3), this.boundingBox.maxZ + 1, this.coordBaseMode, var4); 094 } 095 else if (var5 == 2) 096 { 097 StructureMineshaftPieces.getNextComponent(par1StructureComponent, par2List, par3Random, this.boundingBox.minX - 1, this.boundingBox.minY - 1 + par3Random.nextInt(3), this.boundingBox.maxZ - 3, 1, var4); 098 } 099 else 100 { 101 StructureMineshaftPieces.getNextComponent(par1StructureComponent, par2List, par3Random, this.boundingBox.maxX + 1, this.boundingBox.minY - 1 + par3Random.nextInt(3), this.boundingBox.maxZ - 3, 3, var4); 102 } 103 104 break; 105 case 1: 106 if (var5 <= 1) 107 { 108 StructureMineshaftPieces.getNextComponent(par1StructureComponent, par2List, par3Random, this.boundingBox.minX - 1, this.boundingBox.minY - 1 + par3Random.nextInt(3), this.boundingBox.minZ, this.coordBaseMode, var4); 109 } 110 else if (var5 == 2) 111 { 112 StructureMineshaftPieces.getNextComponent(par1StructureComponent, par2List, par3Random, this.boundingBox.minX, this.boundingBox.minY - 1 + par3Random.nextInt(3), this.boundingBox.minZ - 1, 2, var4); 113 } 114 else 115 { 116 StructureMineshaftPieces.getNextComponent(par1StructureComponent, par2List, par3Random, this.boundingBox.minX, this.boundingBox.minY - 1 + par3Random.nextInt(3), this.boundingBox.maxZ + 1, 0, var4); 117 } 118 119 break; 120 case 2: 121 if (var5 <= 1) 122 { 123 StructureMineshaftPieces.getNextComponent(par1StructureComponent, par2List, par3Random, this.boundingBox.minX, this.boundingBox.minY - 1 + par3Random.nextInt(3), this.boundingBox.minZ - 1, this.coordBaseMode, var4); 124 } 125 else if (var5 == 2) 126 { 127 StructureMineshaftPieces.getNextComponent(par1StructureComponent, par2List, par3Random, this.boundingBox.minX - 1, this.boundingBox.minY - 1 + par3Random.nextInt(3), this.boundingBox.minZ, 1, var4); 128 } 129 else 130 { 131 StructureMineshaftPieces.getNextComponent(par1StructureComponent, par2List, par3Random, this.boundingBox.maxX + 1, this.boundingBox.minY - 1 + par3Random.nextInt(3), this.boundingBox.minZ, 3, var4); 132 } 133 134 break; 135 case 3: 136 if (var5 <= 1) 137 { 138 StructureMineshaftPieces.getNextComponent(par1StructureComponent, par2List, par3Random, this.boundingBox.maxX + 1, this.boundingBox.minY - 1 + par3Random.nextInt(3), this.boundingBox.minZ, this.coordBaseMode, var4); 139 } 140 else if (var5 == 2) 141 { 142 StructureMineshaftPieces.getNextComponent(par1StructureComponent, par2List, par3Random, this.boundingBox.maxX - 3, this.boundingBox.minY - 1 + par3Random.nextInt(3), this.boundingBox.minZ - 1, 2, var4); 143 } 144 else 145 { 146 StructureMineshaftPieces.getNextComponent(par1StructureComponent, par2List, par3Random, this.boundingBox.maxX - 3, this.boundingBox.minY - 1 + par3Random.nextInt(3), this.boundingBox.maxZ + 1, 0, var4); 147 } 148 } 149 150 if (var4 < 8) 151 { 152 int var6; 153 int var7; 154 155 if (this.coordBaseMode != 2 && this.coordBaseMode != 0) 156 { 157 for (var6 = this.boundingBox.minX + 3; var6 + 3 <= this.boundingBox.maxX; var6 += 5) 158 { 159 var7 = par3Random.nextInt(5); 160 161 if (var7 == 0) 162 { 163 StructureMineshaftPieces.getNextComponent(par1StructureComponent, par2List, par3Random, var6, this.boundingBox.minY, this.boundingBox.minZ - 1, 2, var4 + 1); 164 } 165 else if (var7 == 1) 166 { 167 StructureMineshaftPieces.getNextComponent(par1StructureComponent, par2List, par3Random, var6, this.boundingBox.minY, this.boundingBox.maxZ + 1, 0, var4 + 1); 168 } 169 } 170 } 171 else 172 { 173 for (var6 = this.boundingBox.minZ + 3; var6 + 3 <= this.boundingBox.maxZ; var6 += 5) 174 { 175 var7 = par3Random.nextInt(5); 176 177 if (var7 == 0) 178 { 179 StructureMineshaftPieces.getNextComponent(par1StructureComponent, par2List, par3Random, this.boundingBox.minX - 1, this.boundingBox.minY, var6, 1, var4 + 1); 180 } 181 else if (var7 == 1) 182 { 183 StructureMineshaftPieces.getNextComponent(par1StructureComponent, par2List, par3Random, this.boundingBox.maxX + 1, this.boundingBox.minY, var6, 3, var4 + 1); 184 } 185 } 186 } 187 } 188 } 189 190 /** 191 * second Part of Structure generating, this for example places Spiderwebs, Mob Spawners, it closes Mineshafts at 192 * the end, it adds Fences... 193 */ 194 public boolean addComponentParts(World par1World, Random par2Random, StructureBoundingBox par3StructureBoundingBox) 195 { 196 if (this.isLiquidInStructureBoundingBox(par1World, par3StructureBoundingBox)) 197 { 198 return false; 199 } 200 else 201 { 202 int var8 = this.sectionCount * 5 - 1; 203 this.fillWithBlocks(par1World, par3StructureBoundingBox, 0, 0, 0, 2, 1, var8, 0, 0, false); 204 this.randomlyFillWithBlocks(par1World, par3StructureBoundingBox, par2Random, 0.8F, 0, 2, 0, 2, 2, var8, 0, 0, false); 205 206 if (this.hasSpiders) 207 { 208 this.randomlyFillWithBlocks(par1World, par3StructureBoundingBox, par2Random, 0.6F, 0, 0, 0, 2, 1, var8, Block.web.blockID, 0, false); 209 } 210 211 int var9; 212 int var10; 213 int var11; 214 215 for (var9 = 0; var9 < this.sectionCount; ++var9) 216 { 217 var10 = 2 + var9 * 5; 218 this.fillWithBlocks(par1World, par3StructureBoundingBox, 0, 0, var10, 0, 1, var10, Block.fence.blockID, 0, false); 219 this.fillWithBlocks(par1World, par3StructureBoundingBox, 2, 0, var10, 2, 1, var10, Block.fence.blockID, 0, false); 220 221 if (par2Random.nextInt(4) == 0) 222 { 223 this.fillWithBlocks(par1World, par3StructureBoundingBox, 0, 2, var10, 0, 2, var10, Block.planks.blockID, 0, false); 224 this.fillWithBlocks(par1World, par3StructureBoundingBox, 2, 2, var10, 2, 2, var10, Block.planks.blockID, 0, false); 225 } 226 else 227 { 228 this.fillWithBlocks(par1World, par3StructureBoundingBox, 0, 2, var10, 2, 2, var10, Block.planks.blockID, 0, false); 229 } 230 231 this.randomlyPlaceBlock(par1World, par3StructureBoundingBox, par2Random, 0.1F, 0, 2, var10 - 1, Block.web.blockID, 0); 232 this.randomlyPlaceBlock(par1World, par3StructureBoundingBox, par2Random, 0.1F, 2, 2, var10 - 1, Block.web.blockID, 0); 233 this.randomlyPlaceBlock(par1World, par3StructureBoundingBox, par2Random, 0.1F, 0, 2, var10 + 1, Block.web.blockID, 0); 234 this.randomlyPlaceBlock(par1World, par3StructureBoundingBox, par2Random, 0.1F, 2, 2, var10 + 1, Block.web.blockID, 0); 235 this.randomlyPlaceBlock(par1World, par3StructureBoundingBox, par2Random, 0.05F, 0, 2, var10 - 2, Block.web.blockID, 0); 236 this.randomlyPlaceBlock(par1World, par3StructureBoundingBox, par2Random, 0.05F, 2, 2, var10 - 2, Block.web.blockID, 0); 237 this.randomlyPlaceBlock(par1World, par3StructureBoundingBox, par2Random, 0.05F, 0, 2, var10 + 2, Block.web.blockID, 0); 238 this.randomlyPlaceBlock(par1World, par3StructureBoundingBox, par2Random, 0.05F, 2, 2, var10 + 2, Block.web.blockID, 0); 239 this.randomlyPlaceBlock(par1World, par3StructureBoundingBox, par2Random, 0.05F, 1, 2, var10 - 1, Block.torchWood.blockID, 0); 240 this.randomlyPlaceBlock(par1World, par3StructureBoundingBox, par2Random, 0.05F, 1, 2, var10 + 1, Block.torchWood.blockID, 0); 241 242 ChestGenHooks info = ChestGenHooks.getInfo(MINESHAFT_CORRIDOR); 243 244 if (par2Random.nextInt(100) == 0) 245 { 246 this.generateStructureChestContents(par1World, par3StructureBoundingBox, par2Random, 2, 0, var10 - 1, info.getItems(par2Random), info.getCount(par2Random)); 247 } 248 249 if (par2Random.nextInt(100) == 0) 250 { 251 this.generateStructureChestContents(par1World, par3StructureBoundingBox, par2Random, 0, 0, var10 + 1, info.getItems(par2Random), info.getCount(par2Random)); 252 } 253 254 if (this.hasSpiders && !this.spawnerPlaced) 255 { 256 var11 = this.getYWithOffset(0); 257 int var12 = var10 - 1 + par2Random.nextInt(3); 258 int var13 = this.getXWithOffset(1, var12); 259 var12 = this.getZWithOffset(1, var12); 260 261 if (par3StructureBoundingBox.isVecInside(var13, var11, var12)) 262 { 263 this.spawnerPlaced = true; 264 par1World.setBlockWithNotify(var13, var11, var12, Block.mobSpawner.blockID); 265 TileEntityMobSpawner var14 = (TileEntityMobSpawner)par1World.getBlockTileEntity(var13, var11, var12); 266 267 if (var14 != null) 268 { 269 var14.setMobID("CaveSpider"); 270 } 271 } 272 } 273 } 274 275 for (var9 = 0; var9 <= 2; ++var9) 276 { 277 for (var10 = 0; var10 <= var8; ++var10) 278 { 279 var11 = this.getBlockIdAtCurrentPosition(par1World, var9, -1, var10, par3StructureBoundingBox); 280 281 if (var11 == 0) 282 { 283 this.placeBlockAtCurrentPosition(par1World, Block.planks.blockID, 0, var9, -1, var10, par3StructureBoundingBox); 284 } 285 } 286 } 287 288 if (this.hasRails) 289 { 290 for (var9 = 0; var9 <= var8; ++var9) 291 { 292 var10 = this.getBlockIdAtCurrentPosition(par1World, 1, -1, var9, par3StructureBoundingBox); 293 294 if (var10 > 0 && Block.opaqueCubeLookup[var10]) 295 { 296 this.randomlyPlaceBlock(par1World, par3StructureBoundingBox, par2Random, 0.7F, 1, 0, var9, Block.rail.blockID, this.getMetadataWithOffset(Block.rail.blockID, 0)); 297 } 298 } 299 } 300 301 return true; 302 } 303 } 304 }