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))); + } + } +}