package codechicken.lib.vec; import codechicken.lib.math.MathHelper; import codechicken.lib.util.Copyable; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.BlockPos; public class BlockCoord implements Comparable<BlockCoord>, Copyable<BlockCoord> { public static final BlockCoord[] sideOffsets = new BlockCoord[] { new BlockCoord(0, -1, 0), new BlockCoord(0, 1, 0), new BlockCoord(0, 0, -1), new BlockCoord(0, 0, 1), new BlockCoord(-1, 0, 0), new BlockCoord(1, 0, 0) }; public int x; public int y; public int z; public BlockCoord(int x, int y, int z) { this.x = x; this.y = y; this.z = z; } public BlockCoord(BlockPos pos) { this(pos.getX(), pos.getY(), pos.getZ()); } public BlockCoord(Vector3 v) { this(MathHelper.floor_double(v.x), MathHelper.floor_double(v.y), MathHelper.floor_double(v.z)); } public BlockCoord(TileEntity tile) { this(tile.getPos()); } public BlockCoord(int[] ia) { this(ia[0], ia[1], ia[2]); } public BlockCoord() { } /** * @param ia int[]{y, z, x} */ public static BlockCoord fromAxes(int[] ia) { return new BlockCoord(ia[2], ia[0], ia[1]); } @Override public boolean equals(Object obj) { if (!(obj instanceof BlockCoord)) { return false; } BlockCoord o2 = (BlockCoord) obj; return x == o2.x && y == o2.y && z == o2.z; } @Override public int hashCode() { return (x ^ z) * 31 + y; } public int compareTo(BlockCoord o) { if (x != o.x) { return x < o.x ? 1 : -1; } if (y != o.y) { return y < o.y ? 1 : -1; } if (z != o.z) { return z < o.z ? 1 : -1; } return 0; } public Vector3 toVector3Centered() { return new Vector3(x + 0.5, y + 0.5, z + 0.5); } public BlockCoord multiply(int i) { x *= i; y *= i; z *= i; return this; } public double mag() { return Math.sqrt(x * x + y * y + z * z); } public int mag2() { return x * x + y * y + z * z; } public boolean isZero() { return x == 0 && y == 0 && z == 0; } public boolean isAxial() { return x == 0 ? (y == 0 || z == 0) : (y == 0 && z == 0); } public BlockCoord add(BlockCoord coord2) { x += coord2.x; y += coord2.y; z += coord2.z; return this; } public BlockCoord add(int i, int j, int k) { x += i; y += j; z += k; return this; } public BlockCoord sub(BlockCoord coord2) { x -= coord2.x; y -= coord2.y; z -= coord2.z; return this; } public BlockCoord sub(int i, int j, int k) { x -= i; y -= j; z -= k; return this; } public BlockCoord offset(int side) { return offset(side, 1); } public BlockCoord offset(int side, int amount) { BlockCoord offset = sideOffsets[side]; x += offset.x * amount; y += offset.y * amount; z += offset.z * amount; return this; } public BlockCoord inset(int side) { return inset(side, 1); } public BlockCoord inset(int side, int amount) { return offset(side, -amount); } public int getSide(int side) { switch (side) { case 0: case 1: return y; case 2: case 3: return z; case 4: case 5: return x; } throw new IndexOutOfBoundsException("Switch Falloff"); } public BlockCoord setSide(int s, int v) { switch (s) { case 0: case 1: y = v; break; case 2: case 3: z = v; break; case 4: case 5: x = v; break; default: throw new IndexOutOfBoundsException("Switch Falloff"); } return this; } public int[] intArray() { return new int[] { x, y, z }; } public BlockPos pos() { return new BlockPos(x, y, z); } public BlockCoord copy() { return new BlockCoord(x, y, z); } public BlockCoord set(int i, int j, int k) { x = i; y = j; z = k; return this; } public BlockCoord set(BlockCoord coord) { return set(coord.x, coord.y, coord.z); } public BlockCoord set(BlockPos pos) { return set(pos.getX(), pos.getY(), pos.getZ()); } public BlockCoord set(int[] ia) { return set(ia[0], ia[1], ia[2]); } public BlockCoord set(TileEntity tile) { return set(tile.getPos()); } public int toSide() { if (!isAxial()) { return -1; } if (y < 0) { return 0; } if (y > 0) { return 1; } if (z < 0) { return 2; } if (z > 0) { return 3; } if (x < 0) { return 4; } if (x > 0) { return 5; } return -1; } public int absSum() { return (x < 0 ? -x : x) + (y < 0 ? -y : y) + (z < 0 ? -z : z); } public String toString() { return "(" + x + ", " + y + ", " + z + ")"; } }