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 }