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