001    package net.minecraft.world.gen.structure;
002    
003    import java.util.Iterator;
004    import java.util.LinkedList;
005    import java.util.List;
006    import java.util.Random;
007    import net.minecraft.block.Block;
008    import net.minecraft.world.World;
009    
010    public class ComponentMineshaftRoom extends StructureComponent
011    {
012        /** List of other Mineshaft components linked to this room. */
013        private List roomsLinkedToTheRoom = new LinkedList();
014    
015        public ComponentMineshaftRoom(int par1, Random par2Random, int par3, int par4)
016        {
017            super(par1);
018            this.boundingBox = new StructureBoundingBox(par3, 50, par4, par3 + 7 + par2Random.nextInt(6), 54 + par2Random.nextInt(6), par4 + 7 + par2Random.nextInt(6));
019        }
020    
021        /**
022         * Initiates construction of the Structure Component picked, at the current Location of StructGen
023         */
024        public void buildComponent(StructureComponent par1StructureComponent, List par2List, Random par3Random)
025        {
026            int var4 = this.getComponentType();
027            int var6 = this.boundingBox.getYSize() - 3 - 1;
028    
029            if (var6 <= 0)
030            {
031                var6 = 1;
032            }
033    
034            int var5;
035            StructureComponent var7;
036            StructureBoundingBox var8;
037    
038            for (var5 = 0; var5 < this.boundingBox.getXSize(); var5 += 4)
039            {
040                var5 += par3Random.nextInt(this.boundingBox.getXSize());
041    
042                if (var5 + 3 > this.boundingBox.getXSize())
043                {
044                    break;
045                }
046    
047                var7 = StructureMineshaftPieces.getNextComponent(par1StructureComponent, par2List, par3Random, this.boundingBox.minX + var5, this.boundingBox.minY + par3Random.nextInt(var6) + 1, this.boundingBox.minZ - 1, 2, var4);
048    
049                if (var7 != null)
050                {
051                    var8 = var7.getBoundingBox();
052                    this.roomsLinkedToTheRoom.add(new StructureBoundingBox(var8.minX, var8.minY, this.boundingBox.minZ, var8.maxX, var8.maxY, this.boundingBox.minZ + 1));
053                }
054            }
055    
056            for (var5 = 0; var5 < this.boundingBox.getXSize(); var5 += 4)
057            {
058                var5 += par3Random.nextInt(this.boundingBox.getXSize());
059    
060                if (var5 + 3 > this.boundingBox.getXSize())
061                {
062                    break;
063                }
064    
065                var7 = StructureMineshaftPieces.getNextComponent(par1StructureComponent, par2List, par3Random, this.boundingBox.minX + var5, this.boundingBox.minY + par3Random.nextInt(var6) + 1, this.boundingBox.maxZ + 1, 0, var4);
066    
067                if (var7 != null)
068                {
069                    var8 = var7.getBoundingBox();
070                    this.roomsLinkedToTheRoom.add(new StructureBoundingBox(var8.minX, var8.minY, this.boundingBox.maxZ - 1, var8.maxX, var8.maxY, this.boundingBox.maxZ));
071                }
072            }
073    
074            for (var5 = 0; var5 < this.boundingBox.getZSize(); var5 += 4)
075            {
076                var5 += par3Random.nextInt(this.boundingBox.getZSize());
077    
078                if (var5 + 3 > this.boundingBox.getZSize())
079                {
080                    break;
081                }
082    
083                var7 = StructureMineshaftPieces.getNextComponent(par1StructureComponent, par2List, par3Random, this.boundingBox.minX - 1, this.boundingBox.minY + par3Random.nextInt(var6) + 1, this.boundingBox.minZ + var5, 1, var4);
084    
085                if (var7 != null)
086                {
087                    var8 = var7.getBoundingBox();
088                    this.roomsLinkedToTheRoom.add(new StructureBoundingBox(this.boundingBox.minX, var8.minY, var8.minZ, this.boundingBox.minX + 1, var8.maxY, var8.maxZ));
089                }
090            }
091    
092            for (var5 = 0; var5 < this.boundingBox.getZSize(); var5 += 4)
093            {
094                var5 += par3Random.nextInt(this.boundingBox.getZSize());
095    
096                if (var5 + 3 > this.boundingBox.getZSize())
097                {
098                    break;
099                }
100    
101                var7 = StructureMineshaftPieces.getNextComponent(par1StructureComponent, par2List, par3Random, this.boundingBox.maxX + 1, this.boundingBox.minY + par3Random.nextInt(var6) + 1, this.boundingBox.minZ + var5, 3, var4);
102    
103                if (var7 != null)
104                {
105                    var8 = var7.getBoundingBox();
106                    this.roomsLinkedToTheRoom.add(new StructureBoundingBox(this.boundingBox.maxX - 1, var8.minY, var8.minZ, this.boundingBox.maxX, var8.maxY, var8.maxZ));
107                }
108            }
109        }
110    
111        /**
112         * second Part of Structure generating, this for example places Spiderwebs, Mob Spawners, it closes Mineshafts at
113         * the end, it adds Fences...
114         */
115        public boolean addComponentParts(World par1World, Random par2Random, StructureBoundingBox par3StructureBoundingBox)
116        {
117            if (this.isLiquidInStructureBoundingBox(par1World, par3StructureBoundingBox))
118            {
119                return false;
120            }
121            else
122            {
123                this.fillWithBlocks(par1World, par3StructureBoundingBox, this.boundingBox.minX, this.boundingBox.minY, this.boundingBox.minZ, this.boundingBox.maxX, this.boundingBox.minY, this.boundingBox.maxZ, Block.dirt.blockID, 0, true);
124                this.fillWithBlocks(par1World, par3StructureBoundingBox, this.boundingBox.minX, this.boundingBox.minY + 1, this.boundingBox.minZ, this.boundingBox.maxX, Math.min(this.boundingBox.minY + 3, this.boundingBox.maxY), this.boundingBox.maxZ, 0, 0, false);
125                Iterator var4 = this.roomsLinkedToTheRoom.iterator();
126    
127                while (var4.hasNext())
128                {
129                    StructureBoundingBox var5 = (StructureBoundingBox)var4.next();
130                    this.fillWithBlocks(par1World, par3StructureBoundingBox, var5.minX, var5.maxY - 2, var5.minZ, var5.maxX, var5.maxY, var5.maxZ, 0, 0, false);
131                }
132    
133                this.randomlyRareFillWithBlocks(par1World, par3StructureBoundingBox, this.boundingBox.minX, this.boundingBox.minY + 4, this.boundingBox.minZ, this.boundingBox.maxX, this.boundingBox.maxY, this.boundingBox.maxZ, 0, false);
134                return true;
135            }
136        }
137    }