diff --git a/core/src/main/java/com/seibel/distanthorizons/core/pos/DhBlockPos.java b/core/src/main/java/com/seibel/distanthorizons/core/pos/DhBlockPos.java index 9b22cbb08..7e8bca433 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/pos/DhBlockPos.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/pos/DhBlockPos.java @@ -27,24 +27,6 @@ import java.util.Objects; public class DhBlockPos { - public static final boolean DO_CHECKS = false; - - // 26 bits wide as that just encompasses the maximum possible value - // of +- 30,000,000 blocks in each direction. Yes this packing method - // is how Minecraft packs it. - - // NOTE: Remember to ALWAYS check that DHBlockPos packing is EXACTLY - // the same as Minecraft's!!!! - public static final int PACKED_X_LENGTH = 26; - public static final int PACKED_Z_LENGTH = 26; - public static final int PACKED_Y_LENGTH = 12; - public static final long PACKED_X_MASK = (1L << PACKED_X_LENGTH) - 1L; - public static final long PACKED_Y_MASK = (1L << PACKED_Y_LENGTH) - 1L; - public static final long PACKED_Z_MASK = (1L << PACKED_Z_LENGTH) - 1L; - public static final int PACKED_Y_OFFSET = 0; - public static final int PACKED_Z_OFFSET = PACKED_Y_LENGTH; - public static final int PACKED_X_OFFSET = PACKED_Y_LENGTH + PACKED_Z_LENGTH; - /** Useful for methods that need a position passed in but won't actually be used */ public static final DhBlockPos ZERO = new DhBlockPos(0, 0, 0); @@ -55,69 +37,26 @@ public class DhBlockPos + //==============// + // constructors // + //==============// + public DhBlockPos(int x, int y, int z) { this.x = x; this.y = y; this.z = z; } - public DhBlockPos() - { - this(0, 0, 0); - } - public DhBlockPos(DhBlockPos pos) - { - this(pos.x, pos.y, pos.z); - } + public DhBlockPos() { this(0, 0, 0); } + public DhBlockPos(DhBlockPos pos) { this(pos.x, pos.y, pos.z); } - public DhBlockPos(DhBlockPos2D pos, int y) - { - this(pos.x, y, pos.z); - } + public DhBlockPos(DhBlockPos2D pos, int y) { this(pos.x, y, pos.z); } - public static long asLong(int x, int y, int z) - { - if (DO_CHECKS) - { - if ((x & ~PACKED_X_MASK) != 0) - { - throw new IllegalArgumentException("x is out of range: " + x); - } - if ((y & ~PACKED_Y_MASK) != 0) - { - throw new IllegalArgumentException("y is out of range: " + y); - } - if ((z & ~PACKED_Z_MASK) != 0) - { - throw new IllegalArgumentException("z is out of range: " + z); - } - } - return ((long) x & PACKED_X_MASK) << PACKED_X_OFFSET | - ((long) y & PACKED_Y_MASK) << PACKED_Y_OFFSET | - ((long) z & PACKED_Z_MASK) << PACKED_Z_OFFSET; - } - public static int getX(long packed) - { // X is at the top - return (int) (packed << (64 - PACKED_X_OFFSET - PACKED_X_LENGTH) >> (64 - PACKED_X_LENGTH)); - } - public static int getY(long packed) - { // Y is at the bottom - return (int) (packed << (64 - PACKED_Y_OFFSET - PACKED_Y_LENGTH) >> (64 - PACKED_Y_LENGTH)); - } - public static int getZ(long packed) - { // Z is at the middle - return (int) (packed << (64 - PACKED_Z_OFFSET - PACKED_Z_LENGTH) >> (64 - PACKED_Z_LENGTH)); - } - public DhBlockPos(long packed) - { - this(getX(packed), getY(packed), getZ(packed)); - } - public long asLong() - { - return asLong(x, y, z); - } + //========// + // offset // + //========// /** creates a new {@link DhBlockPos} with the given offset from the current pos. */ public DhBlockPos offset(EDhDirection direction) { return this.mutateOffset(direction, null); } @@ -145,6 +84,12 @@ public class DhBlockPos } } + + + //==========// + // mutators // + //==========// + /** Returns a new {@link DhBlockPos} limited to a value between 0 and 15 (inclusive) */ public DhBlockPos createChunkRelativePos() { return this.mutateOrCreateChunkRelativePos(null); } /** Limits the input {@link DhBlockPos} to a value between 0 and 15 (inclusive) */ @@ -182,6 +127,12 @@ public class DhBlockPos } } + + + //==========// + // distance // + //==========// + /** * Can be used to quickly determine the rough distance between two points
* or determine the taxi cab (manhattan) distance between two points.

@@ -190,46 +141,35 @@ public class DhBlockPos * where you can only drive along each street, instead of directly to the other point. */ public int getManhattanDistance(DhBlockPos otherPos) - { - return Math.abs(this.x - otherPos.x) + Math.abs(this.y - otherPos.y) + Math.abs(this.z - otherPos.z); - } + { return Math.abs(this.x - otherPos.x) + Math.abs(this.y - otherPos.y) + Math.abs(this.z - otherPos.z); } + + + + //================// + // base overrides // + //================// @Override - public boolean equals(Object o) + public boolean equals(Object obj) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - DhBlockPos that = (DhBlockPos) o; - return x == that.x && y == that.y && z == that.z; - } - - @Override - public int hashCode() - { - return Objects.hash(x, y, z); - } - @Override - public String toString() - { - return "DHBlockPos[" + - "" + x + - ", " + y + - ", " + z + - ']'; - } - - public static void _DebugCheckPacker(int x, int y, int z, long expected) - { - long packed = asLong(x, y, z); - if (packed != expected) + if (this == obj) { - throw new IllegalArgumentException("Packed values don't match: " + packed + " != " + expected); + return true; } - DhBlockPos pos = new DhBlockPos(packed); - if (pos.x != x || pos.y != y || pos.z != z) + else if (obj == null || this.getClass() != obj.getClass()) { - throw new IllegalArgumentException("Values after decode don't match: " + pos + " != " + x + ", " + y + ", " + z); + return false; + } + else + { + DhBlockPos that = (DhBlockPos) obj; + return this.x == that.x && this.y == that.y && this.z == that.z; } } + @Override + public int hashCode() { return Objects.hash(this.x, this.y, this.z); } + @Override + public String toString() { return "DHBlockPos["+this.x+", "+this.y+", "+this.z+"]"; } + }