aboutsummaryrefslogtreecommitdiffhomepage
path: root/Spigot-API-Patches-Unmapped/0137-Allow-Blocks-to-be-accessed-via-a-long-key.patch
diff options
context:
space:
mode:
Diffstat (limited to 'Spigot-API-Patches-Unmapped/0137-Allow-Blocks-to-be-accessed-via-a-long-key.patch')
-rw-r--r--Spigot-API-Patches-Unmapped/0137-Allow-Blocks-to-be-accessed-via-a-long-key.patch169
1 files changed, 169 insertions, 0 deletions
diff --git a/Spigot-API-Patches-Unmapped/0137-Allow-Blocks-to-be-accessed-via-a-long-key.patch b/Spigot-API-Patches-Unmapped/0137-Allow-Blocks-to-be-accessed-via-a-long-key.patch
new file mode 100644
index 0000000000..568d6bcd6e
--- /dev/null
+++ b/Spigot-API-Patches-Unmapped/0137-Allow-Blocks-to-be-accessed-via-a-long-key.patch
@@ -0,0 +1,169 @@
+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 369ce9ff6c8bb97a64a8e229115564412e6e7654..e700875beb76dadd55b585aca748338def286908 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;
+@@ -605,6 +604,17 @@ public class Location implements Cloneable, ConfigurationSerializable {
+ blockLoc.setZ(getBlockZ());
+ return blockLoc;
+ }
++
++ // Paper Start
++ /**
++ * @return The block key for this location's block location.
++ * @see Block#getBlockKey(int, int, int)
++ */
++ 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 3f231c28842f02f80fd3136c36fe99b41726137f..d8674c773d61517f79d0fe77276392e47fd3e1e1 100644
+--- a/src/main/java/org/bukkit/World.java
++++ b/src/main/java/org/bukkit/World.java
+@@ -90,6 +90,38 @@ public interface World extends PluginMessageRecipient, Metadatable, net.kyori.ad
+ @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)
++ */
++ @NotNull
++ 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
++ 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) coordinate 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 e89c8079625525667f496c06207da655fe43d749..d6f74dbcfeb153d4b17be2827e2989f2d8160d21 100644
+--- a/src/main/java/org/bukkit/block/Block.java
++++ b/src/main/java/org/bukkit/block/Block.java
+@@ -153,6 +153,72 @@ public interface Block extends Metadatable {
+ */
+ 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
++ */
++ 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
++ */
++ 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.
++ */
++ 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.
++ */
++ 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.
++ */
++ public static int getBlockKeyZ(long packed) {
++ return (int) ((packed << 10) >> 37);
++ }
++ // Paper End
++
+ /**
+ * Gets the Location of the block
+ *