001    package net.minecraft.world.gen.structure;
002    
003    import java.util.Iterator;
004    import java.util.LinkedList;
005    import java.util.Random;
006    import net.minecraft.world.World;
007    
008    public abstract class StructureStart
009    {
010        /** List of all StructureComponents that are part of this structure */
011        protected LinkedList components = new LinkedList();
012        protected StructureBoundingBox boundingBox;
013    
014        public StructureBoundingBox getBoundingBox()
015        {
016            return this.boundingBox;
017        }
018    
019        public LinkedList getComponents()
020        {
021            return this.components;
022        }
023    
024        /**
025         * Keeps iterating Structure Pieces and spawning them until the checks tell it to stop
026         */
027        public void generateStructure(World par1World, Random par2Random, StructureBoundingBox par3StructureBoundingBox)
028        {
029            Iterator var4 = this.components.iterator();
030    
031            while (var4.hasNext())
032            {
033                StructureComponent var5 = (StructureComponent)var4.next();
034    
035                if (var5.getBoundingBox().intersectsWith(par3StructureBoundingBox) && !var5.addComponentParts(par1World, par2Random, par3StructureBoundingBox))
036                {
037                    var4.remove();
038                }
039            }
040        }
041    
042        /**
043         * Calculates total bounding box based on components' bounding boxes and saves it to boundingBox
044         */
045        protected void updateBoundingBox()
046        {
047            this.boundingBox = StructureBoundingBox.getNewBoundingBox();
048            Iterator var1 = this.components.iterator();
049    
050            while (var1.hasNext())
051            {
052                StructureComponent var2 = (StructureComponent)var1.next();
053                this.boundingBox.expandTo(var2.getBoundingBox());
054            }
055        }
056    
057        /**
058         * offsets the structure Bounding Boxes up to a certain height, typically 63 - 10
059         */
060        protected void markAvailableHeight(World par1World, Random par2Random, int par3)
061        {
062            int var4 = 63 - par3;
063            int var5 = this.boundingBox.getYSize() + 1;
064    
065            if (var5 < var4)
066            {
067                var5 += par2Random.nextInt(var4 - var5);
068            }
069    
070            int var6 = var5 - this.boundingBox.maxY;
071            this.boundingBox.offset(0, var6, 0);
072            Iterator var7 = this.components.iterator();
073    
074            while (var7.hasNext())
075            {
076                StructureComponent var8 = (StructureComponent)var7.next();
077                var8.getBoundingBox().offset(0, var6, 0);
078            }
079        }
080    
081        protected void setRandomHeight(World par1World, Random par2Random, int par3, int par4)
082        {
083            int var5 = par4 - par3 + 1 - this.boundingBox.getYSize();
084            boolean var6 = true;
085            int var10;
086    
087            if (var5 > 1)
088            {
089                var10 = par3 + par2Random.nextInt(var5);
090            }
091            else
092            {
093                var10 = par3;
094            }
095    
096            int var7 = var10 - this.boundingBox.minY;
097            this.boundingBox.offset(0, var7, 0);
098            Iterator var8 = this.components.iterator();
099    
100            while (var8.hasNext())
101            {
102                StructureComponent var9 = (StructureComponent)var8.next();
103                var9.getBoundingBox().offset(0, var7, 0);
104            }
105        }
106    
107        /**
108         * currently only defined for Villages, returns true if Village has more than 2 non-road components
109         */
110        public boolean isSizeableStructure()
111        {
112            return true;
113        }
114    }