    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    }