001 package net.minecraft.world.gen.structure;
002
003 import java.util.Iterator;
004 import java.util.List;
005 import java.util.Random;
006 import net.minecraft.block.Block;
007 import net.minecraft.block.BlockDirectional;
008 import net.minecraft.item.ItemDoor;
009 import net.minecraft.tileentity.TileEntityChest;
010 import net.minecraft.tileentity.TileEntityDispenser;
011 import net.minecraft.util.Direction;
012 import net.minecraft.util.Facing;
013 import net.minecraft.util.WeightedRandomChestContent;
014 import net.minecraft.world.ChunkPosition;
015 import net.minecraft.world.World;
016
017 public abstract class StructureComponent
018 {
019 protected StructureBoundingBox boundingBox;
020
021 /** switches the Coordinate System base off the Bounding Box */
022 protected int coordBaseMode;
023
024 /** The type ID of this component. */
025 protected int componentType;
026
027 protected StructureComponent(int par1)
028 {
029 this.componentType = par1;
030 this.coordBaseMode = -1;
031 }
032
033 /**
034 * Initiates construction of the Structure Component picked, at the current Location of StructGen
035 */
036 public void buildComponent(StructureComponent par1StructureComponent, List par2List, Random par3Random) {}
037
038 /**
039 * second Part of Structure generating, this for example places Spiderwebs, Mob Spawners, it closes Mineshafts at
040 * the end, it adds Fences...
041 */
042 public abstract boolean addComponentParts(World var1, Random var2, StructureBoundingBox var3);
043
044 public StructureBoundingBox getBoundingBox()
045 {
046 return this.boundingBox;
047 }
048
049 /**
050 * Returns the component type ID of this component.
051 */
052 public int getComponentType()
053 {
054 return this.componentType;
055 }
056
057 /**
058 * Discover if bounding box can fit within the current bounding box object.
059 */
060 public static StructureComponent findIntersecting(List par0List, StructureBoundingBox par1StructureBoundingBox)
061 {
062 Iterator var2 = par0List.iterator();
063 StructureComponent var3;
064
065 do
066 {
067 if (!var2.hasNext())
068 {
069 return null;
070 }
071
072 var3 = (StructureComponent)var2.next();
073 }
074 while (var3.getBoundingBox() == null || !var3.getBoundingBox().intersectsWith(par1StructureBoundingBox));
075
076 return var3;
077 }
078
079 public ChunkPosition getCenter()
080 {
081 return new ChunkPosition(this.boundingBox.getCenterX(), this.boundingBox.getCenterY(), this.boundingBox.getCenterZ());
082 }
083
084 /**
085 * checks the entire StructureBoundingBox for Liquids
086 */
087 protected boolean isLiquidInStructureBoundingBox(World par1World, StructureBoundingBox par2StructureBoundingBox)
088 {
089 int var3 = Math.max(this.boundingBox.minX - 1, par2StructureBoundingBox.minX);
090 int var4 = Math.max(this.boundingBox.minY - 1, par2StructureBoundingBox.minY);
091 int var5 = Math.max(this.boundingBox.minZ - 1, par2StructureBoundingBox.minZ);
092 int var6 = Math.min(this.boundingBox.maxX + 1, par2StructureBoundingBox.maxX);
093 int var7 = Math.min(this.boundingBox.maxY + 1, par2StructureBoundingBox.maxY);
094 int var8 = Math.min(this.boundingBox.maxZ + 1, par2StructureBoundingBox.maxZ);
095 int var9;
096 int var10;
097 int var11;
098
099 for (var9 = var3; var9 <= var6; ++var9)
100 {
101 for (var10 = var5; var10 <= var8; ++var10)
102 {
103 var11 = par1World.getBlockId(var9, var4, var10);
104
105 if (var11 > 0 && Block.blocksList[var11].blockMaterial.isLiquid())
106 {
107 return true;
108 }
109
110 var11 = par1World.getBlockId(var9, var7, var10);
111
112 if (var11 > 0 && Block.blocksList[var11].blockMaterial.isLiquid())
113 {
114 return true;
115 }
116 }
117 }
118
119 for (var9 = var3; var9 <= var6; ++var9)
120 {
121 for (var10 = var4; var10 <= var7; ++var10)
122 {
123 var11 = par1World.getBlockId(var9, var10, var5);
124
125 if (var11 > 0 && Block.blocksList[var11].blockMaterial.isLiquid())
126 {
127 return true;
128 }
129
130 var11 = par1World.getBlockId(var9, var10, var8);
131
132 if (var11 > 0 && Block.blocksList[var11].blockMaterial.isLiquid())
133 {
134 return true;
135 }
136 }
137 }
138
139 for (var9 = var5; var9 <= var8; ++var9)
140 {
141 for (var10 = var4; var10 <= var7; ++var10)
142 {
143 var11 = par1World.getBlockId(var3, var10, var9);
144
145 if (var11 > 0 && Block.blocksList[var11].blockMaterial.isLiquid())
146 {
147 return true;
148 }
149
150 var11 = par1World.getBlockId(var6, var10, var9);
151
152 if (var11 > 0 && Block.blocksList[var11].blockMaterial.isLiquid())
153 {
154 return true;
155 }
156 }
157 }
158
159 return false;
160 }
161
162 protected int getXWithOffset(int par1, int par2)
163 {
164 switch (this.coordBaseMode)
165 {
166 case 0:
167 case 2:
168 return this.boundingBox.minX + par1;
169 case 1:
170 return this.boundingBox.maxX - par2;
171 case 3:
172 return this.boundingBox.minX + par2;
173 default:
174 return par1;
175 }
176 }
177
178 protected int getYWithOffset(int par1)
179 {
180 return this.coordBaseMode == -1 ? par1 : par1 + this.boundingBox.minY;
181 }
182
183 protected int getZWithOffset(int par1, int par2)
184 {
185 switch (this.coordBaseMode)
186 {
187 case 0:
188 return this.boundingBox.minZ + par2;
189 case 1:
190 case 3:
191 return this.boundingBox.minZ + par1;
192 case 2:
193 return this.boundingBox.maxZ - par2;
194 default:
195 return par2;
196 }
197 }
198
199 /**
200 * Returns the direction-shifted metadata for blocks that require orientation, e.g. doors, stairs, ladders.
201 * Parameters: block ID, original metadata
202 */
203 protected int getMetadataWithOffset(int par1, int par2)
204 {
205 if (par1 == Block.rail.blockID)
206 {
207 if (this.coordBaseMode == 1 || this.coordBaseMode == 3)
208 {
209 if (par2 == 1)
210 {
211 return 0;
212 }
213
214 return 1;
215 }
216 }
217 else if (par1 != Block.doorWood.blockID && par1 != Block.doorSteel.blockID)
218 {
219 if (par1 != Block.stairCompactCobblestone.blockID && par1 != Block.stairCompactPlanks.blockID && par1 != Block.stairsNetherBrick.blockID && par1 != Block.stairsStoneBrickSmooth.blockID && par1 != Block.stairsSandStone.blockID)
220 {
221 if (par1 == Block.ladder.blockID)
222 {
223 if (this.coordBaseMode == 0)
224 {
225 if (par2 == 2)
226 {
227 return 3;
228 }
229
230 if (par2 == 3)
231 {
232 return 2;
233 }
234 }
235 else if (this.coordBaseMode == 1)
236 {
237 if (par2 == 2)
238 {
239 return 4;
240 }
241
242 if (par2 == 3)
243 {
244 return 5;
245 }
246
247 if (par2 == 4)
248 {
249 return 2;
250 }
251
252 if (par2 == 5)
253 {
254 return 3;
255 }
256 }
257 else if (this.coordBaseMode == 3)
258 {
259 if (par2 == 2)
260 {
261 return 5;
262 }
263
264 if (par2 == 3)
265 {
266 return 4;
267 }
268
269 if (par2 == 4)
270 {
271 return 2;
272 }
273
274 if (par2 == 5)
275 {
276 return 3;
277 }
278 }
279 }
280 else if (par1 == Block.stoneButton.blockID)
281 {
282 if (this.coordBaseMode == 0)
283 {
284 if (par2 == 3)
285 {
286 return 4;
287 }
288
289 if (par2 == 4)
290 {
291 return 3;
292 }
293 }
294 else if (this.coordBaseMode == 1)
295 {
296 if (par2 == 3)
297 {
298 return 1;
299 }
300
301 if (par2 == 4)
302 {
303 return 2;
304 }
305
306 if (par2 == 2)
307 {
308 return 3;
309 }
310
311 if (par2 == 1)
312 {
313 return 4;
314 }
315 }
316 else if (this.coordBaseMode == 3)
317 {
318 if (par2 == 3)
319 {
320 return 2;
321 }
322
323 if (par2 == 4)
324 {
325 return 1;
326 }
327
328 if (par2 == 2)
329 {
330 return 3;
331 }
332
333 if (par2 == 1)
334 {
335 return 4;
336 }
337 }
338 }
339 else if (par1 != Block.tripWireSource.blockID && (Block.blocksList[par1] == null || !(Block.blocksList[par1] instanceof BlockDirectional)))
340 {
341 if (par1 == Block.pistonBase.blockID || par1 == Block.pistonStickyBase.blockID || par1 == Block.lever.blockID || par1 == Block.dispenser.blockID)
342 {
343 if (this.coordBaseMode == 0)
344 {
345 if (par2 == 2 || par2 == 3)
346 {
347 return Facing.faceToSide[par2];
348 }
349 }
350 else if (this.coordBaseMode == 1)
351 {
352 if (par2 == 2)
353 {
354 return 4;
355 }
356
357 if (par2 == 3)
358 {
359 return 5;
360 }
361
362 if (par2 == 4)
363 {
364 return 2;
365 }
366
367 if (par2 == 5)
368 {
369 return 3;
370 }
371 }
372 else if (this.coordBaseMode == 3)
373 {
374 if (par2 == 2)
375 {
376 return 5;
377 }
378
379 if (par2 == 3)
380 {
381 return 4;
382 }
383
384 if (par2 == 4)
385 {
386 return 2;
387 }
388
389 if (par2 == 5)
390 {
391 return 3;
392 }
393 }
394 }
395 }
396 else if (this.coordBaseMode == 0)
397 {
398 if (par2 == 0 || par2 == 2)
399 {
400 return Direction.footInvisibleFaceRemap[par2];
401 }
402 }
403 else if (this.coordBaseMode == 1)
404 {
405 if (par2 == 2)
406 {
407 return 1;
408 }
409
410 if (par2 == 0)
411 {
412 return 3;
413 }
414
415 if (par2 == 1)
416 {
417 return 2;
418 }
419
420 if (par2 == 3)
421 {
422 return 0;
423 }
424 }
425 else if (this.coordBaseMode == 3)
426 {
427 if (par2 == 2)
428 {
429 return 3;
430 }
431
432 if (par2 == 0)
433 {
434 return 1;
435 }
436
437 if (par2 == 1)
438 {
439 return 2;
440 }
441
442 if (par2 == 3)
443 {
444 return 0;
445 }
446 }
447 }
448 else if (this.coordBaseMode == 0)
449 {
450 if (par2 == 2)
451 {
452 return 3;
453 }
454
455 if (par2 == 3)
456 {
457 return 2;
458 }
459 }
460 else if (this.coordBaseMode == 1)
461 {
462 if (par2 == 0)
463 {
464 return 2;
465 }
466
467 if (par2 == 1)
468 {
469 return 3;
470 }
471
472 if (par2 == 2)
473 {
474 return 0;
475 }
476
477 if (par2 == 3)
478 {
479 return 1;
480 }
481 }
482 else if (this.coordBaseMode == 3)
483 {
484 if (par2 == 0)
485 {
486 return 2;
487 }
488
489 if (par2 == 1)
490 {
491 return 3;
492 }
493
494 if (par2 == 2)
495 {
496 return 1;
497 }
498
499 if (par2 == 3)
500 {
501 return 0;
502 }
503 }
504 }
505 else if (this.coordBaseMode == 0)
506 {
507 if (par2 == 0)
508 {
509 return 2;
510 }
511
512 if (par2 == 2)
513 {
514 return 0;
515 }
516 }
517 else
518 {
519 if (this.coordBaseMode == 1)
520 {
521 return par2 + 1 & 3;
522 }
523
524 if (this.coordBaseMode == 3)
525 {
526 return par2 + 3 & 3;
527 }
528 }
529
530 return par2;
531 }
532
533 /**
534 * current Position depends on currently set Coordinates mode, is computed here
535 */
536 protected void placeBlockAtCurrentPosition(World par1World, int par2, int par3, int par4, int par5, int par6, StructureBoundingBox par7StructureBoundingBox)
537 {
538 int var8 = this.getXWithOffset(par4, par6);
539 int var9 = this.getYWithOffset(par5);
540 int var10 = this.getZWithOffset(par4, par6);
541
542 if (par7StructureBoundingBox.isVecInside(var8, var9, var10))
543 {
544 par1World.setBlockAndMetadata(var8, var9, var10, par2, par3);
545 }
546 }
547
548 protected int getBlockIdAtCurrentPosition(World par1World, int par2, int par3, int par4, StructureBoundingBox par5StructureBoundingBox)
549 {
550 int var6 = this.getXWithOffset(par2, par4);
551 int var7 = this.getYWithOffset(par3);
552 int var8 = this.getZWithOffset(par2, par4);
553 return !par5StructureBoundingBox.isVecInside(var6, var7, var8) ? 0 : par1World.getBlockId(var6, var7, var8);
554 }
555
556 /**
557 * arguments: (World worldObj, StructureBoundingBox structBB, int minX, int minY, int minZ, int maxX, int maxY, int
558 * maxZ)
559 */
560 protected void fillWithAir(World par1World, StructureBoundingBox par2StructureBoundingBox, int par3, int par4, int par5, int par6, int par7, int par8)
561 {
562 for (int var9 = par4; var9 <= par7; ++var9)
563 {
564 for (int var10 = par3; var10 <= par6; ++var10)
565 {
566 for (int var11 = par5; var11 <= par8; ++var11)
567 {
568 this.placeBlockAtCurrentPosition(par1World, 0, 0, var10, var9, var11, par2StructureBoundingBox);
569 }
570 }
571 }
572 }
573
574 /**
575 * arguments: (World worldObj, StructureBoundingBox structBB, int minX, int minY, int minZ, int maxX, int maxY, int
576 * maxZ, int placeBlockId, int replaceBlockId, boolean alwaysreplace)
577 */
578 protected void fillWithBlocks(World par1World, StructureBoundingBox par2StructureBoundingBox, int par3, int par4, int par5, int par6, int par7, int par8, int par9, int par10, boolean par11)
579 {
580 for (int var12 = par4; var12 <= par7; ++var12)
581 {
582 for (int var13 = par3; var13 <= par6; ++var13)
583 {
584 for (int var14 = par5; var14 <= par8; ++var14)
585 {
586 if (!par11 || this.getBlockIdAtCurrentPosition(par1World, var13, var12, var14, par2StructureBoundingBox) != 0)
587 {
588 if (var12 != par4 && var12 != par7 && var13 != par3 && var13 != par6 && var14 != par5 && var14 != par8)
589 {
590 this.placeBlockAtCurrentPosition(par1World, par10, 0, var13, var12, var14, par2StructureBoundingBox);
591 }
592 else
593 {
594 this.placeBlockAtCurrentPosition(par1World, par9, 0, var13, var12, var14, par2StructureBoundingBox);
595 }
596 }
597 }
598 }
599 }
600 }
601
602 /**
603 * arguments: (World worldObj, StructureBoundingBox structBB, int minX, int minY, int minZ, int maxX, int maxY, int
604 * maxZ, int placeBlockId, int placeBlockMetadata, int replaceBlockId, int replaceBlockMetadata, boolean
605 * alwaysreplace)
606 */
607 protected void fillWithMetadataBlocks(World par1World, StructureBoundingBox par2StructureBoundingBox, int par3, int par4, int par5, int par6, int par7, int par8, int par9, int par10, int par11, int par12, boolean par13)
608 {
609 for (int var14 = par4; var14 <= par7; ++var14)
610 {
611 for (int var15 = par3; var15 <= par6; ++var15)
612 {
613 for (int var16 = par5; var16 <= par8; ++var16)
614 {
615 if (!par13 || this.getBlockIdAtCurrentPosition(par1World, var15, var14, var16, par2StructureBoundingBox) != 0)
616 {
617 if (var14 != par4 && var14 != par7 && var15 != par3 && var15 != par6 && var16 != par5 && var16 != par8)
618 {
619 this.placeBlockAtCurrentPosition(par1World, par11, par12, var15, var14, var16, par2StructureBoundingBox);
620 }
621 else
622 {
623 this.placeBlockAtCurrentPosition(par1World, par9, par10, var15, var14, var16, par2StructureBoundingBox);
624 }
625 }
626 }
627 }
628 }
629 }
630
631 /**
632 * arguments: World worldObj, StructureBoundingBox structBB, int minX, int minY, int minZ, int maxX, int maxY, int
633 * maxZ, boolean alwaysreplace, Random rand, StructurePieceBlockSelector blockselector
634 */
635 protected void fillWithRandomizedBlocks(World par1World, StructureBoundingBox par2StructureBoundingBox, int par3, int par4, int par5, int par6, int par7, int par8, boolean par9, Random par10Random, StructurePieceBlockSelector par11StructurePieceBlockSelector)
636 {
637 for (int var12 = par4; var12 <= par7; ++var12)
638 {
639 for (int var13 = par3; var13 <= par6; ++var13)
640 {
641 for (int var14 = par5; var14 <= par8; ++var14)
642 {
643 if (!par9 || this.getBlockIdAtCurrentPosition(par1World, var13, var12, var14, par2StructureBoundingBox) != 0)
644 {
645 par11StructurePieceBlockSelector.selectBlocks(par10Random, var13, var12, var14, var12 == par4 || var12 == par7 || var13 == par3 || var13 == par6 || var14 == par5 || var14 == par8);
646 this.placeBlockAtCurrentPosition(par1World, par11StructurePieceBlockSelector.getSelectedBlockId(), par11StructurePieceBlockSelector.getSelectedBlockMetaData(), var13, var12, var14, par2StructureBoundingBox);
647 }
648 }
649 }
650 }
651 }
652
653 /**
654 * arguments: World worldObj, StructureBoundingBox structBB, Random rand, float randLimit, int minX, int minY, int
655 * minZ, int maxX, int maxY, int maxZ, int olaceBlockId, int replaceBlockId, boolean alwaysreplace
656 */
657 protected void randomlyFillWithBlocks(World par1World, StructureBoundingBox par2StructureBoundingBox, Random par3Random, float par4, int par5, int par6, int par7, int par8, int par9, int par10, int par11, int par12, boolean par13)
658 {
659 for (int var14 = par6; var14 <= par9; ++var14)
660 {
661 for (int var15 = par5; var15 <= par8; ++var15)
662 {
663 for (int var16 = par7; var16 <= par10; ++var16)
664 {
665 if (par3Random.nextFloat() <= par4 && (!par13 || this.getBlockIdAtCurrentPosition(par1World, var15, var14, var16, par2StructureBoundingBox) != 0))
666 {
667 if (var14 != par6 && var14 != par9 && var15 != par5 && var15 != par8 && var16 != par7 && var16 != par10)
668 {
669 this.placeBlockAtCurrentPosition(par1World, par12, 0, var15, var14, var16, par2StructureBoundingBox);
670 }
671 else
672 {
673 this.placeBlockAtCurrentPosition(par1World, par11, 0, var15, var14, var16, par2StructureBoundingBox);
674 }
675 }
676 }
677 }
678 }
679 }
680
681 /**
682 * Randomly decides if placing or not. Used for Decoration such as Torches and Spiderwebs
683 */
684 protected void randomlyPlaceBlock(World par1World, StructureBoundingBox par2StructureBoundingBox, Random par3Random, float par4, int par5, int par6, int par7, int par8, int par9)
685 {
686 if (par3Random.nextFloat() < par4)
687 {
688 this.placeBlockAtCurrentPosition(par1World, par8, par9, par5, par6, par7, par2StructureBoundingBox);
689 }
690 }
691
692 /**
693 * arguments: World worldObj, StructureBoundingBox structBB, int minX, int minY, int minZ, int maxX, int maxY, int
694 * maxZ, int placeBlockId, boolean alwaysreplace
695 */
696 protected void randomlyRareFillWithBlocks(World par1World, StructureBoundingBox par2StructureBoundingBox, int par3, int par4, int par5, int par6, int par7, int par8, int par9, boolean par10)
697 {
698 float var11 = (float)(par6 - par3 + 1);
699 float var12 = (float)(par7 - par4 + 1);
700 float var13 = (float)(par8 - par5 + 1);
701 float var14 = (float)par3 + var11 / 2.0F;
702 float var15 = (float)par5 + var13 / 2.0F;
703
704 for (int var16 = par4; var16 <= par7; ++var16)
705 {
706 float var17 = (float)(var16 - par4) / var12;
707
708 for (int var18 = par3; var18 <= par6; ++var18)
709 {
710 float var19 = ((float)var18 - var14) / (var11 * 0.5F);
711
712 for (int var20 = par5; var20 <= par8; ++var20)
713 {
714 float var21 = ((float)var20 - var15) / (var13 * 0.5F);
715
716 if (!par10 || this.getBlockIdAtCurrentPosition(par1World, var18, var16, var20, par2StructureBoundingBox) != 0)
717 {
718 float var22 = var19 * var19 + var17 * var17 + var21 * var21;
719
720 if (var22 <= 1.05F)
721 {
722 this.placeBlockAtCurrentPosition(par1World, par9, 0, var18, var16, var20, par2StructureBoundingBox);
723 }
724 }
725 }
726 }
727 }
728 }
729
730 /**
731 * Deletes all continuous blocks from selected position upwards. Stops at hitting air.
732 */
733 protected void clearCurrentPositionBlocksUpwards(World par1World, int par2, int par3, int par4, StructureBoundingBox par5StructureBoundingBox)
734 {
735 int var6 = this.getXWithOffset(par2, par4);
736 int var7 = this.getYWithOffset(par3);
737 int var8 = this.getZWithOffset(par2, par4);
738
739 if (par5StructureBoundingBox.isVecInside(var6, var7, var8))
740 {
741 while (!par1World.isAirBlock(var6, var7, var8) && var7 < 255)
742 {
743 par1World.setBlockAndMetadata(var6, var7, var8, 0, 0);
744 ++var7;
745 }
746 }
747 }
748
749 /**
750 * Overwrites air and liquids from selected position downwards, stops at hitting anything else.
751 */
752 protected void fillCurrentPositionBlocksDownwards(World par1World, int par2, int par3, int par4, int par5, int par6, StructureBoundingBox par7StructureBoundingBox)
753 {
754 int var8 = this.getXWithOffset(par4, par6);
755 int var9 = this.getYWithOffset(par5);
756 int var10 = this.getZWithOffset(par4, par6);
757
758 if (par7StructureBoundingBox.isVecInside(var8, var9, var10))
759 {
760 while ((par1World.isAirBlock(var8, var9, var10) || par1World.getBlockMaterial(var8, var9, var10).isLiquid()) && var9 > 1)
761 {
762 par1World.setBlockAndMetadata(var8, var9, var10, par2, par3);
763 --var9;
764 }
765 }
766 }
767
768 /**
769 * Used to generate chests with items in it. ex: Temple Chests, Village Blacksmith Chests, Mineshaft Chests.
770 */
771 protected boolean generateStructureChestContents(World par1World, StructureBoundingBox par2StructureBoundingBox, Random par3Random, int par4, int par5, int par6, WeightedRandomChestContent[] par7ArrayOfWeightedRandomChestContent, int par8)
772 {
773 int var9 = this.getXWithOffset(par4, par6);
774 int var10 = this.getYWithOffset(par5);
775 int var11 = this.getZWithOffset(par4, par6);
776
777 if (par2StructureBoundingBox.isVecInside(var9, var10, var11) && par1World.getBlockId(var9, var10, var11) != Block.chest.blockID)
778 {
779 par1World.setBlockWithNotify(var9, var10, var11, Block.chest.blockID);
780 TileEntityChest var12 = (TileEntityChest)par1World.getBlockTileEntity(var9, var10, var11);
781
782 if (var12 != null)
783 {
784 WeightedRandomChestContent.generateChestContents(par3Random, par7ArrayOfWeightedRandomChestContent, var12, par8);
785 }
786
787 return true;
788 }
789 else
790 {
791 return false;
792 }
793 }
794
795 /**
796 * Used to generate dispenser contents for structures. ex: Jungle Temples.
797 */
798 protected boolean generateStructureDispenserContents(World par1World, StructureBoundingBox par2StructureBoundingBox, Random par3Random, int par4, int par5, int par6, int par7, WeightedRandomChestContent[] par8ArrayOfWeightedRandomChestContent, int par9)
799 {
800 int var10 = this.getXWithOffset(par4, par6);
801 int var11 = this.getYWithOffset(par5);
802 int var12 = this.getZWithOffset(par4, par6);
803
804 if (par2StructureBoundingBox.isVecInside(var10, var11, var12) && par1World.getBlockId(var10, var11, var12) != Block.dispenser.blockID)
805 {
806 par1World.setBlockAndMetadataWithNotify(var10, var11, var12, Block.dispenser.blockID, this.getMetadataWithOffset(Block.dispenser.blockID, par7));
807 TileEntityDispenser var13 = (TileEntityDispenser)par1World.getBlockTileEntity(var10, var11, var12);
808
809 if (var13 != null)
810 {
811 WeightedRandomChestContent.generateDispenserContents(par3Random, par8ArrayOfWeightedRandomChestContent, var13, par9);
812 }
813
814 return true;
815 }
816 else
817 {
818 return false;
819 }
820 }
821
822 protected void placeDoorAtCurrentPosition(World par1World, StructureBoundingBox par2StructureBoundingBox, Random par3Random, int par4, int par5, int par6, int par7)
823 {
824 int var8 = this.getXWithOffset(par4, par6);
825 int var9 = this.getYWithOffset(par5);
826 int var10 = this.getZWithOffset(par4, par6);
827
828 if (par2StructureBoundingBox.isVecInside(var8, var9, var10))
829 {
830 ItemDoor.placeDoorBlock(par1World, var8, var9, var10, par7, Block.doorWood);
831 }
832 }
833 }