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