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 }