001 package net.minecraft.world.gen.structure;
002
003 public class StructureBoundingBox
004 {
005 /** The first x coordinate of a bounding box. */
006 public int minX;
007
008 /** The first y coordinate of a bounding box. */
009 public int minY;
010
011 /** The first z coordinate of a bounding box. */
012 public int minZ;
013
014 /** The second x coordinate of a bounding box. */
015 public int maxX;
016
017 /** The second y coordinate of a bounding box. */
018 public int maxY;
019
020 /** The second z coordinate of a bounding box. */
021 public int maxZ;
022
023 public StructureBoundingBox() {}
024
025 /**
026 * returns a new StructureBoundingBox with MAX values
027 */
028 public static StructureBoundingBox getNewBoundingBox()
029 {
030 return new StructureBoundingBox(Integer.MAX_VALUE, Integer.MAX_VALUE, Integer.MAX_VALUE, Integer.MIN_VALUE, Integer.MIN_VALUE, Integer.MIN_VALUE);
031 }
032
033 /**
034 * used to project a possible new component Bounding Box - to check if it would cut anything already spawned
035 */
036 public static StructureBoundingBox getComponentToAddBoundingBox(int par0, int par1, int par2, int par3, int par4, int par5, int par6, int par7, int par8, int par9)
037 {
038 switch (par9)
039 {
040 case 0:
041 return new StructureBoundingBox(par0 + par3, par1 + par4, par2 + par5, par0 + par6 - 1 + par3, par1 + par7 - 1 + par4, par2 + par8 - 1 + par5);
042 case 1:
043 return new StructureBoundingBox(par0 - par8 + 1 + par5, par1 + par4, par2 + par3, par0 + par5, par1 + par7 - 1 + par4, par2 + par6 - 1 + par3);
044 case 2:
045 return new StructureBoundingBox(par0 + par3, par1 + par4, par2 - par8 + 1 + par5, par0 + par6 - 1 + par3, par1 + par7 - 1 + par4, par2 + par5);
046 case 3:
047 return new StructureBoundingBox(par0 + par5, par1 + par4, par2 + par3, par0 + par8 - 1 + par5, par1 + par7 - 1 + par4, par2 + par6 - 1 + par3);
048 default:
049 return new StructureBoundingBox(par0 + par3, par1 + par4, par2 + par5, par0 + par6 - 1 + par3, par1 + par7 - 1 + par4, par2 + par8 - 1 + par5);
050 }
051 }
052
053 public StructureBoundingBox(StructureBoundingBox par1StructureBoundingBox)
054 {
055 this.minX = par1StructureBoundingBox.minX;
056 this.minY = par1StructureBoundingBox.minY;
057 this.minZ = par1StructureBoundingBox.minZ;
058 this.maxX = par1StructureBoundingBox.maxX;
059 this.maxY = par1StructureBoundingBox.maxY;
060 this.maxZ = par1StructureBoundingBox.maxZ;
061 }
062
063 public StructureBoundingBox(int par1, int par2, int par3, int par4, int par5, int par6)
064 {
065 this.minX = par1;
066 this.minY = par2;
067 this.minZ = par3;
068 this.maxX = par4;
069 this.maxY = par5;
070 this.maxZ = par6;
071 }
072
073 public StructureBoundingBox(int par1, int par2, int par3, int par4)
074 {
075 this.minX = par1;
076 this.minZ = par2;
077 this.maxX = par3;
078 this.maxZ = par4;
079 this.minY = 1;
080 this.maxY = 512;
081 }
082
083 /**
084 * Returns whether the given bounding box intersects with this one. Args: structureboundingbox
085 */
086 public boolean intersectsWith(StructureBoundingBox par1StructureBoundingBox)
087 {
088 return this.maxX >= par1StructureBoundingBox.minX && this.minX <= par1StructureBoundingBox.maxX && this.maxZ >= par1StructureBoundingBox.minZ && this.minZ <= par1StructureBoundingBox.maxZ && this.maxY >= par1StructureBoundingBox.minY && this.minY <= par1StructureBoundingBox.maxY;
089 }
090
091 /**
092 * Discover if a coordinate is inside the bounding box area.
093 */
094 public boolean intersectsWith(int par1, int par2, int par3, int par4)
095 {
096 return this.maxX >= par1 && this.minX <= par3 && this.maxZ >= par2 && this.minZ <= par4;
097 }
098
099 /**
100 * Expands a bounding box's dimensions to include the supplied bounding box.
101 */
102 public void expandTo(StructureBoundingBox par1StructureBoundingBox)
103 {
104 this.minX = Math.min(this.minX, par1StructureBoundingBox.minX);
105 this.minY = Math.min(this.minY, par1StructureBoundingBox.minY);
106 this.minZ = Math.min(this.minZ, par1StructureBoundingBox.minZ);
107 this.maxX = Math.max(this.maxX, par1StructureBoundingBox.maxX);
108 this.maxY = Math.max(this.maxY, par1StructureBoundingBox.maxY);
109 this.maxZ = Math.max(this.maxZ, par1StructureBoundingBox.maxZ);
110 }
111
112 /**
113 * Offsets the current bounding box by the specified coordinates. Args: x, y, z
114 */
115 public void offset(int par1, int par2, int par3)
116 {
117 this.minX += par1;
118 this.minY += par2;
119 this.minZ += par3;
120 this.maxX += par1;
121 this.maxY += par2;
122 this.maxZ += par3;
123 }
124
125 /**
126 * Returns true if block is inside bounding box
127 */
128 public boolean isVecInside(int par1, int par2, int par3)
129 {
130 return par1 >= this.minX && par1 <= this.maxX && par3 >= this.minZ && par3 <= this.maxZ && par2 >= this.minY && par2 <= this.maxY;
131 }
132
133 /**
134 * Returns width of a bounding box
135 */
136 public int getXSize()
137 {
138 return this.maxX - this.minX + 1;
139 }
140
141 /**
142 * Returns height of a bounding box
143 */
144 public int getYSize()
145 {
146 return this.maxY - this.minY + 1;
147 }
148
149 /**
150 * Returns length of a bounding box
151 */
152 public int getZSize()
153 {
154 return this.maxZ - this.minZ + 1;
155 }
156
157 public int getCenterX()
158 {
159 return this.minX + (this.maxX - this.minX + 1) / 2;
160 }
161
162 public int getCenterY()
163 {
164 return this.minY + (this.maxY - this.minY + 1) / 2;
165 }
166
167 public int getCenterZ()
168 {
169 return this.minZ + (this.maxZ - this.minZ + 1) / 2;
170 }
171
172 public String toString()
173 {
174 return "(" + this.minX + ", " + this.minY + ", " + this.minZ + "; " + this.maxX + ", " + this.maxY + ", " + this.maxZ + ")";
175 }
176 }