From c2a92b967d99bc7ff60e7b8e0d27ce5e4c78f9d8 Mon Sep 17 00:00:00 2001
From: Ryan Barlow <7389646+ryanbarlow97@users.noreply.github.com>
Date: Tue, 22 Sep 2026 23:27:05 +0000
Subject: [PATCH] build: compile against Paper API 1.21.10
---
pom.xml | 14 +++++--
.../archaeo/museum/MuseumListener.java | 24 ++++++++++-
.../archaeo/museum/MuseumListenerTest.java | 40 +++++++++++++++++++
3 files changed, 73 insertions(+), 5 deletions(-)
create mode 100644 src/test/java/net/tfminecraft/archaeo/museum/MuseumListenerTest.java
diff --git a/pom.xml b/pom.xml
index 6c38e40..4806063 100644
--- a/pom.xml
+++ b/pom.xml
@@ -18,15 +18,21 @@
- spigot-repo
- https://hub.spigotmc.org/nexus/content/repositories/snapshots/
+ papermc
+ https://repo.papermc.io/repository/maven-public/
- org.spigotmc
- spigot-api
+ junit
+ junit
+ 4.13.2
+ test
+
+
+ io.papermc.paper
+ paper-api
1.21.10-R0.1-SNAPSHOT
provided
diff --git a/src/main/java/net/tfminecraft/archaeo/museum/MuseumListener.java b/src/main/java/net/tfminecraft/archaeo/museum/MuseumListener.java
index c562c20..2bfa713 100644
--- a/src/main/java/net/tfminecraft/archaeo/museum/MuseumListener.java
+++ b/src/main/java/net/tfminecraft/archaeo/museum/MuseumListener.java
@@ -9,6 +9,7 @@
import net.tfminecraft.archaeo.site.SiteRepository;
import org.bukkit.Material;
import org.bukkit.block.Block;
+import org.bukkit.block.BlockFace;
import org.bukkit.block.BlockState;
import org.bukkit.block.Lectern;
import org.bukkit.block.Shelf;
@@ -200,7 +201,7 @@ private static List displayedOnBlock(BlockState state, Vector click)
}
return stacks;
}
- int slot = shelf.getSlot(click);
+ int slot = shelfSlot(((org.bukkit.block.data.type.Shelf) shelf.getBlockData()).getFacing(), click);
if (slot >= 0) {
stacks.add(shelf.getInventory().getItem(slot));
}
@@ -209,6 +210,27 @@ private static List displayedOnBlock(BlockState state, Vector click)
return stacks;
}
+ // Paper 1.21.10 has no Shelf#getSlot. Match vanilla's three equal columns,
+ // ordered left to right when looking at the shelf's front.
+ static int shelfSlot(BlockFace facing, Vector click) {
+ if (click == null || !(click.getX() >= 0 && click.getX() <= 1
+ && click.getY() >= 0 && click.getY() <= 1
+ && click.getZ() >= 0 && click.getZ() <= 1)) {
+ return -1;
+ }
+ float horizontal = (float) switch (facing) {
+ case NORTH -> 1 - click.getX();
+ case SOUTH -> click.getX();
+ case WEST -> click.getZ();
+ case EAST -> 1 - click.getZ();
+ default -> -1;
+ };
+ if (horizontal < 0) {
+ return -1;
+ }
+ return Math.min(2, (int) Math.floor(horizontal * 16.0f / (16.0f / 3)));
+ }
+
/**
* @param entity frame, display, armor stand, or furniture root
* @return stacks that entity is showing
diff --git a/src/test/java/net/tfminecraft/archaeo/museum/MuseumListenerTest.java b/src/test/java/net/tfminecraft/archaeo/museum/MuseumListenerTest.java
new file mode 100644
index 0000000..fd61bc5
--- /dev/null
+++ b/src/test/java/net/tfminecraft/archaeo/museum/MuseumListenerTest.java
@@ -0,0 +1,40 @@
+package net.tfminecraft.archaeo.museum;
+
+import org.bukkit.block.BlockFace;
+import org.bukkit.util.Vector;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class MuseumListenerTest {
+ @Test
+ public void selectsAllThreeSlotsFromEachFacing() {
+ for (int slot = 0; slot < 3; slot++) {
+ double horizontal = (slot + 0.5) / 3;
+ assertEquals(slot, MuseumListener.shelfSlot(BlockFace.NORTH, new Vector(1 - horizontal, 0.5, 0)));
+ assertEquals(slot, MuseumListener.shelfSlot(BlockFace.SOUTH, new Vector(horizontal, 0.5, 1)));
+ assertEquals(slot, MuseumListener.shelfSlot(BlockFace.WEST, new Vector(0, 0.5, horizontal)));
+ assertEquals(slot, MuseumListener.shelfSlot(BlockFace.EAST, new Vector(1, 0.5, 1 - horizontal)));
+ }
+ }
+
+ @Test
+ public void keepsEdgesInsideTheInventoryAndSplitsAtThirds() {
+ double[] positions = {0, 1.0 / 3 - 0.001, 1.0 / 3, 2.0 / 3 - 0.001, 2.0 / 3, 1};
+ int[] slots = {0, 0, 1, 1, 2, 2};
+ for (int i = 0; i < positions.length; i++) {
+ assertEquals(slots[i], MuseumListener.shelfSlot(BlockFace.SOUTH, new Vector(positions[i], 0, 1)));
+ }
+ }
+
+ @Test
+ public void rejectsPositionsOutsideTheBlock() {
+ assertEquals(-1, MuseumListener.shelfSlot(BlockFace.SOUTH, null));
+ assertEquals(-1, MuseumListener.shelfSlot(BlockFace.UP, new Vector(0.5, 0.5, 0.5)));
+ for (double invalid : new double[] {-0.01, 1.01, Double.NaN, Double.POSITIVE_INFINITY}) {
+ assertEquals(-1, MuseumListener.shelfSlot(BlockFace.SOUTH, new Vector(invalid, 0.5, 0.5)));
+ assertEquals(-1, MuseumListener.shelfSlot(BlockFace.SOUTH, new Vector(0.5, invalid, 0.5)));
+ assertEquals(-1, MuseumListener.shelfSlot(BlockFace.SOUTH, new Vector(0.5, 0.5, invalid)));
+ }
+ }
+}