3
0
Mirror von https://github.com/PaperMC/Paper.git synchronisiert 2024-12-15 11:00:06 +01:00
Paper/Spigot-API-Patches/0139-Allow-Blocks-to-be-accessed-via-a-long-key.patch
Shane Freeder ac66acab27
Updated Upstream (Bukkit/CraftBukkit/Spigot)
Upstream has released updates that appears to apply and compile correctly.
This update has not been tested by PaperMC and as with ANY update, please do your own testing

Bukkit Changes:
78568d11 Tweak Block.getTemperature to return actual block temperature
9ad459ca SPIGOT-2151: Add support for getting simple bounding box of a block
ad28b19f Add BlockData#getAsString(boolean) to hide unspecified states

CraftBukkit Changes:
1b982fd6 Tweak Block.getTemperature to return actual block temperature
f55c8191 SPIGOT-2151: Add support for getting simple bounding box of a block
4b843638 Add BlockData#getAsString(boolean) to hide unspecified states

Spigot Changes:
573cdf2c BUILDTOOLS-425: Disable commit.gpgSign in applyPatches.sh
667bdd6b Deprecate Spigot version of Entity.isInvulnerable
2018-12-21 16:09:17 +00:00

134 Zeilen
4.3 KiB
Diff

From 6c57e466396348da4e30c996c0d1f3b8555d5ea2 Mon Sep 17 00:00:00 2001
From: Spottedleaf <Spottedleaf@users.noreply.github.com>
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 8dcb15fb..7e1ee875 100644
--- a/src/main/java/org/bukkit/Location.java
+++ b/src/main/java/org/bukkit/Location.java
@@ -10,7 +10,6 @@ import org.bukkit.util.Vector;
// 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;
@@ -558,6 +557,18 @@ 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()
+ */
+ public long toBlockKey() {
+ return ((long)getBlockX() & 0x7FFFFFF) | (((long)getBlockZ() & 0x7FFFFFF) << 27) | ((long)getBlockY() << 54);
+ }
+ // 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 6635285f..071a8490 100644
--- a/src/main/java/org/bukkit/World.java
+++ b/src/main/java/org/bukkit/World.java
@@ -75,6 +75,37 @@ public interface World extends PluginMessageRecipient, Metadatable {
*/
public Block getBlockAt(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 Location#toBlockKey()
+ * @see Block#getBlockKey()
+ */
+ public default Block getBlockAtKey(long key) {
+ int x = (int) ((key << 37) >> 37);
+ int y = (int) (key >>> 54);
+ int z = (int) ((key << 10) >> 37);
+ 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 Location#toBlockKey()
+ * @see Block#getBlockKey()
+ */
+ public default Location getLocationAtKey(long key) {
+ int x = (int) ((key << 37) >> 37);
+ int y = (int) (key >>> 54);
+ int z = (int) ((key << 10) >> 37);
+ return new Location(this, x, y, z);
+ }
+ // Paper end
+
/**
* Gets the y coordinate of the lowest block at this position such that the
* block and all blocks above it are transparent for lighting purposes.
diff --git a/src/main/java/org/bukkit/block/Block.java b/src/main/java/org/bukkit/block/Block.java
index e3337d05..1f97e3d3 100644
--- a/src/main/java/org/bukkit/block/Block.java
+++ b/src/main/java/org/bukkit/block/Block.java
@@ -143,6 +143,33 @@ public interface Block extends Metadatable {
*/
int getZ();
+ // Paper Start
+
+ /**
+ * Returns this block's coordinates packed into a long value
+ * <p>
+ * The return value can be computed as follows:
+ * <br>
+ * {@code long value = ((long)getX() & 0x7FFFFFF) | (((long)getZ() & 0x7FFFFFF) << 27) | ((long)getY() << 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 default long getBlockKey() {
+ return ((long)getX() & 0x7FFFFFF) | (((long)getZ() & 0x7FFFFFF) << 27) | ((long)getY() << 54);
+ }
+ // Paper End
+
/**
* Gets the Location of the block
*
--
2.20.1