Allow Blocks to be accessed via a long key

The key can be retrieved via methods Location#toBlockKey() and
Block#getBlockKey()

World provides lookup for blocks by long key via method World#getBlockAtKey(long)

The formatting for the key is as follows:

10 bit y|27 bit z|27 bit x

The y value is considered unsigned while z and x are considered two's complement

Y range: [0, 1023]
X, Z range: [-67 108 864, 67 108 863]
This commit is contained in:
Spottedleaf
2018-08-14 21:42:10 -07:00
parent ffe27211fb
commit 8170ae9d64
3 changed files with 124 additions and 1 deletions

View File

@@ -156,6 +156,82 @@ public interface Block extends Metadatable, Translatable {
*/
int getZ();
// Paper start
/**
* Returns this block's coordinates packed into a long value.
* Computed via: {@code Block.getBlockKey(this.getX(), this.getY(), this.getZ())}
* @see Block#getBlockKey(int, int, int)
* @return This block's x, y, and z coordinates packed into a long value
* @deprecated see {@link #getBlockKey(int, int, int)}
*/
@Deprecated(since = "1.18.1")
public default long getBlockKey() {
return Block.getBlockKey(this.getX(), this.getY(), this.getZ());
}
/**
* Returns the specified block coordinates packed into a long value
* <p>
* The return value can be computed as follows:
* <br>
* {@code long value = ((long)x & 0x7FFFFFF) | (((long)z & 0x7FFFFFF) << 27) | ((long)y << 54);}
* </p>
*
* <p>
* And may be unpacked as follows:
* <br>
* {@code int x = (int) ((packed << 37) >> 37);}
* <br>
* {@code int y = (int) (packed >> 54);}
* <br>
* {@code int z = (int) ((packed << 10) >> 37);}
* </p>
*
* @return This block's x, y, and z coordinates packed into a long value
* @deprecated only encodes y block ranges from -512 to 511 and represents an already changed implementation detail
*/
@Deprecated(since = "1.18.1")
public static long getBlockKey(int x, int y, int z) {
return ((long)x & 0x7FFFFFF) | (((long)z & 0x7FFFFFF) << 27) | ((long)y << 54);
}
/**
* Returns the x component from the packed value.
* @param packed The packed value, as computed by {@link Block#getBlockKey(int, int, int)}
* @see Block#getBlockKey(int, int, int)
* @return The x component from the packed value.
* @deprecated see {@link #getBlockKey(int, int, int)}
*/
@Deprecated(since = "1.18.1")
public static int getBlockKeyX(long packed) {
return (int) ((packed << 37) >> 37);
}
/**
* Returns the y component from the packed value.
* @param packed The packed value, as computed by {@link Block#getBlockKey(int, int, int)}
* @see Block#getBlockKey(int, int, int)
* @return The y component from the packed value.
* @deprecated see {@link #getBlockKey(int, int, int)}
*/
@Deprecated(since = "1.18.1")
public static int getBlockKeyY(long packed) {
return (int) (packed >> 54);
}
/**
* Returns the z component from the packed value.
* @param packed The packed value, as computed by {@link Block#getBlockKey(int, int, int)}
* @see Block#getBlockKey(int, int, int)
* @return The z component from the packed value.
* @deprecated see {@link #getBlockKey(int, int, int)}
*/
@Deprecated(since = "1.18.1")
public static int getBlockKeyZ(long packed) {
return (int) ((packed << 10) >> 37);
}
// Paper end
/**
* Gets the Location of the block
*