    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    }