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 }