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