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