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 }