001package net.minecraft.world.gen.structure; 002 003import java.util.Iterator; 004import java.util.LinkedList; 005import java.util.Random; 006import net.minecraft.world.World; 007 008public 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 iterator = this.components.iterator(); 030 031 while (iterator.hasNext()) 032 { 033 StructureComponent structurecomponent = (StructureComponent)iterator.next(); 034 035 if (structurecomponent.getBoundingBox().intersectsWith(par3StructureBoundingBox) && !structurecomponent.addComponentParts(par1World, par2Random, par3StructureBoundingBox)) 036 { 037 iterator.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 iterator = this.components.iterator(); 049 050 while (iterator.hasNext()) 051 { 052 StructureComponent structurecomponent = (StructureComponent)iterator.next(); 053 this.boundingBox.expandTo(structurecomponent.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 j = 63 - par3; 063 int k = this.boundingBox.getYSize() + 1; 064 065 if (k < j) 066 { 067 k += par2Random.nextInt(j - k); 068 } 069 070 int l = k - this.boundingBox.maxY; 071 this.boundingBox.offset(0, l, 0); 072 Iterator iterator = this.components.iterator(); 073 074 while (iterator.hasNext()) 075 { 076 StructureComponent structurecomponent = (StructureComponent)iterator.next(); 077 structurecomponent.getBoundingBox().offset(0, l, 0); 078 } 079 } 080 081 protected void setRandomHeight(World par1World, Random par2Random, int par3, int par4) 082 { 083 int k = par4 - par3 + 1 - this.boundingBox.getYSize(); 084 boolean flag = true; 085 int l; 086 087 if (k > 1) 088 { 089 l = par3 + par2Random.nextInt(k); 090 } 091 else 092 { 093 l = par3; 094 } 095 096 int i1 = l - this.boundingBox.minY; 097 this.boundingBox.offset(0, i1, 0); 098 Iterator iterator = this.components.iterator(); 099 100 while (iterator.hasNext()) 101 { 102 StructureComponent structurecomponent = (StructureComponent)iterator.next(); 103 structurecomponent.getBoundingBox().offset(0, i1, 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}