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