ac66acab27
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 temperaturef55c8191
SPIGOT-2151: Add support for getting simple bounding box of a block4b843638
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
134 Zeilen
4.3 KiB
Diff
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
|
|
|