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 }