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