diff options
Diffstat (limited to 'patches/api/0135-Allow-Blocks-to-be-accessed-via-a-long-key.patch')
-rw-r--r-- | patches/api/0135-Allow-Blocks-to-be-accessed-via-a-long-key.patch | 184 |
1 files changed, 184 insertions, 0 deletions
diff --git a/patches/api/0135-Allow-Blocks-to-be-accessed-via-a-long-key.patch b/patches/api/0135-Allow-Blocks-to-be-accessed-via-a-long-key.patch new file mode 100644 index 0000000000..c2205057df --- /dev/null +++ b/patches/api/0135-Allow-Blocks-to-be-accessed-via-a-long-key.patch @@ -0,0 +1,184 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Spottedleaf <[email protected]> +Date: Tue, 14 Aug 2018 21:42:10 -0700 +Subject: [PATCH] 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] + +diff --git a/src/main/java/org/bukkit/Location.java b/src/main/java/org/bukkit/Location.java +index 41125de49db8eafce4be59cc110ce5be06836a47..042d69e6d4584eb6d678b8ea13a3e4bea78703b8 100644 +--- a/src/main/java/org/bukkit/Location.java ++++ b/src/main/java/org/bukkit/Location.java +@@ -15,7 +15,6 @@ import org.jetbrains.annotations.Nullable; + + // Paper start + import java.util.Collection; +-import java.util.Collections; + import java.util.function.Predicate; + import org.bukkit.entity.Entity; + import org.bukkit.entity.LivingEntity; +@@ -610,6 +609,19 @@ public class Location implements Cloneable, ConfigurationSerializable, io.paperm + blockLoc.setZ(getBlockZ()); + return blockLoc; + } ++ ++ // Paper start ++ /** ++ * @return The block key for this location's block location. ++ * @see Block#getBlockKey(int, int, int) ++ * @deprecated only encodes y block ranges from -512 to 511 and represents an already changed implementation detail ++ */ ++ @Deprecated ++ public long toBlockKey() { ++ return Block.getBlockKey(getBlockX(), getBlockY(), getBlockZ()); ++ } ++ // Paper end ++ + /** + * @return A new location where X/Y/Z are the center of the block + */ +diff --git a/src/main/java/org/bukkit/World.java b/src/main/java/org/bukkit/World.java +index 273c50b6e4f26457415779000cf09aeaffd21733..575fd50b8456beed7c5049a392fca011271a8fe4 100644 +--- a/src/main/java/org/bukkit/World.java ++++ b/src/main/java/org/bukkit/World.java +@@ -99,6 +99,41 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient + @NotNull + public Block getBlockAt(@NotNull Location location); + ++ // Paper start ++ /** ++ * Gets the {@link Block} at the given block key ++ * ++ * @param key The block key. See {@link Block#getBlockKey()} ++ * @return Block at the key ++ * @see Block#getBlockKey(int, int, int) ++ * @deprecated only encodes y block ranges from -512 to 511 and represents an already changed implementation detail ++ */ ++ @NotNull ++ @Deprecated ++ public default Block getBlockAtKey(long key) { ++ int x = Block.getBlockKeyX(key); ++ int y = Block.getBlockKeyY(key); ++ int z = Block.getBlockKeyZ(key); ++ return getBlockAt(x, y, z); ++ } ++ ++ /** ++ * Gets the {@link Location} at the given block key ++ * ++ * @param key The block key. See {@link Location#toBlockKey()} ++ * @return Location at the key ++ * @see Block#getBlockKey(int, int, int) ++ */ ++ @NotNull ++ @Deprecated ++ public default Location getLocationAtKey(long key) { ++ int x = Block.getBlockKeyX(key); ++ int y = Block.getBlockKeyY(key); ++ int z = Block.getBlockKeyZ(key); ++ return new Location(this, x, y, z); ++ } ++ // Paper end ++ + /** + * Gets the highest non-empty (impassable) block at the given coordinates. + * +diff --git a/src/main/java/org/bukkit/block/Block.java b/src/main/java/org/bukkit/block/Block.java +index f3b3606dc5881e931853fc2631aad9ca9083474d..a71001677e2b1b0b6225a7be63b8ea5ce4456862 100644 +--- a/src/main/java/org/bukkit/block/Block.java ++++ b/src/main/java/org/bukkit/block/Block.java +@@ -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 ++ 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 ++ 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 ++ 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 ++ 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 ++ public static int getBlockKeyZ(long packed) { ++ return (int) ((packed << 10) >> 37); ++ } ++ // Paper end ++ + /** + * Gets the Location of the block + * |