From 9f45a9f1b4e54c0d0af5a12e64731ce05d8b935a Mon Sep 17 00:00:00 2001 From: GoldenStack Date: Sat, 20 Apr 2024 20:48:54 -0500 Subject: [PATCH] Fix middle click drop handling --- .../net/minestom/server/inventory/click/Click.java | 13 ++++++++----- .../inventory/click/ClickPreprocessorTest.java | 2 +- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/main/java/net/minestom/server/inventory/click/Click.java b/src/main/java/net/minestom/server/inventory/click/Click.java index 8c166ceed..ca900c8fd 100644 --- a/src/main/java/net/minestom/server/inventory/click/Click.java +++ b/src/main/java/net/minestom/server/inventory/click/Click.java @@ -107,7 +107,7 @@ public final class Click { public @Nullable Click.Info processClick(@NotNull ClientClickWindowPacket packet, boolean isCreative, @Nullable Integer containerSize) { final byte button = packet.button(); final boolean requireCreative = switch (packet.clickType()) { - case CLONE -> true; + case CLONE -> packet.slot() != -999; // Permit middle click dropping case QUICK_CRAFT -> button == 8 || button == 9 || button == 10; default -> false; }; @@ -115,10 +115,13 @@ public final class Click { final int slot = packet.slot() == -999 ? -999 : containerSize == null ? PlayerInventoryUtils.protocolToMinestom(packet.slot()) : packet.slot(); final int maxSize = containerSize != null ? containerSize + PlayerInventoryUtils.INNER_SIZE : PlayerInventoryUtils.INVENTORY_SIZE; - if (packet.clickType() == ClientClickWindowPacket.ClickType.PICKUP && slot == -999) { - if (button == 0) return new Info.LeftDropCursor(); - if (button == 1) return new Info.RightDropCursor(); - if (button == 2) return new Info.MiddleDropCursor(); + if (slot == -999) { + if (packet.clickType() == ClientClickWindowPacket.ClickType.PICKUP) { + if (button == 0) return new Info.LeftDropCursor(); + if (button == 1) return new Info.RightDropCursor(); + } else if (packet.clickType() == ClientClickWindowPacket.ClickType.CLONE) { // Why Mojang, why? + if (button == 2) return new Info.MiddleDropCursor(); + } } final boolean valid = slot >= 0 && slot < maxSize; if (!valid) return null; diff --git a/src/test/java/net/minestom/server/inventory/click/ClickPreprocessorTest.java b/src/test/java/net/minestom/server/inventory/click/ClickPreprocessorTest.java index d90d2c3e8..bdd246ece 100644 --- a/src/test/java/net/minestom/server/inventory/click/ClickPreprocessorTest.java +++ b/src/test/java/net/minestom/server/inventory/click/ClickPreprocessorTest.java @@ -13,7 +13,7 @@ public class ClickPreprocessorTest { public void testPickupType() { assertProcessed(new Click.Info.LeftDropCursor(), clickPacket(PICKUP, 1, 0, -999)); assertProcessed(new Click.Info.RightDropCursor(), clickPacket(PICKUP, 1, 1, -999)); - assertProcessed(new Click.Info.MiddleDropCursor(), clickPacket(PICKUP, 1, 2, -999)); + assertProcessed(new Click.Info.MiddleDropCursor(), clickPacket(CLONE, 1, 2, -999)); assertProcessed(new Click.Info.Left(0), clickPacket(PICKUP, 1, 0, 0)); assertProcessed(new Click.Info.Left(SIZE), clickPacket(PICKUP, 1, 0, 5));