From 3821d204cff504bd89f7a3360ccb08b08989a086 Mon Sep 17 00:00:00 2001 From: Cody Date: Mon, 13 Jun 2022 22:38:44 -0700 Subject: [PATCH] Allow for 'F' to be pressed in inventories (Fixes #585) (#1164) --- .../minestom/server/inventory/Inventory.java | 7 +-- .../server/inventory/PlayerInventory.java | 7 +-- .../integration/HeldClickIntegrationTest.java | 44 ++++++++++++++----- 3 files changed, 40 insertions(+), 18 deletions(-) diff --git a/src/main/java/net/minestom/server/inventory/Inventory.java b/src/main/java/net/minestom/server/inventory/Inventory.java index 4da73b471..1a0df8c04 100644 --- a/src/main/java/net/minestom/server/inventory/Inventory.java +++ b/src/main/java/net/minestom/server/inventory/Inventory.java @@ -285,13 +285,14 @@ public non-sealed class Inventory extends AbstractInventory implements Viewable @Override public boolean changeHeld(@NotNull Player player, int slot, int key) { + final int convertedKey = key == 40 ? PlayerInventoryUtils.OFFHAND_SLOT : key; final PlayerInventory playerInventory = player.getInventory(); final boolean isInWindow = isClickInWindow(slot); final int clickSlot = isInWindow ? slot : PlayerInventoryUtils.convertSlot(slot, offset); final ItemStack clicked = isInWindow ? getItemStack(slot) : playerInventory.getItemStack(clickSlot); - final ItemStack heldItem = playerInventory.getItemStack(key); + final ItemStack heldItem = playerInventory.getItemStack(convertedKey); final InventoryClickResult clickResult = clickProcessor.changeHeld(player, - isInWindow ? this : playerInventory, clickSlot, key, clicked, heldItem); + isInWindow ? this : playerInventory, clickSlot, convertedKey, clicked, heldItem); if (clickResult.isCancel()) { updateAll(player); return false; @@ -301,7 +302,7 @@ public non-sealed class Inventory extends AbstractInventory implements Viewable } else { playerInventory.setItemStack(clickSlot, clickResult.getClicked()); } - playerInventory.setItemStack(key, clickResult.getCursor()); + playerInventory.setItemStack(convertedKey, clickResult.getCursor()); callClickEvent(player, isInWindow ? this : null, slot, ClickType.CHANGE_HELD, clicked, getCursorItem(player)); return true; } diff --git a/src/main/java/net/minestom/server/inventory/PlayerInventory.java b/src/main/java/net/minestom/server/inventory/PlayerInventory.java index ee5b2f119..bb2158419 100644 --- a/src/main/java/net/minestom/server/inventory/PlayerInventory.java +++ b/src/main/java/net/minestom/server/inventory/PlayerInventory.java @@ -266,18 +266,19 @@ public non-sealed class PlayerInventory extends AbstractInventory implements Equ @Override public boolean changeHeld(@NotNull Player player, int slot, int key) { + final int convertedKey = key == 40 ? OFFHAND_SLOT : key; final ItemStack cursorItem = getCursorItem(); if (!cursorItem.isAir()) return false; final int convertedSlot = convertPlayerInventorySlot(slot, OFFSET); - final ItemStack heldItem = getItemStack(key); + final ItemStack heldItem = getItemStack(convertedKey); final ItemStack clicked = getItemStack(convertedSlot); - final InventoryClickResult clickResult = clickProcessor.changeHeld(player, this, convertedSlot, key, clicked, heldItem); + final InventoryClickResult clickResult = clickProcessor.changeHeld(player, this, convertedSlot, convertedKey, clicked, heldItem); if (clickResult.isCancel()) { update(); return false; } setItemStack(convertedSlot, clickResult.getClicked()); - setItemStack(key, clickResult.getCursor()); + setItemStack(convertedKey, clickResult.getCursor()); callClickEvent(player, null, convertedSlot, ClickType.CHANGE_HELD, clicked, cursorItem); return true; } diff --git a/src/test/java/net/minestom/server/inventory/click/integration/HeldClickIntegrationTest.java b/src/test/java/net/minestom/server/inventory/click/integration/HeldClickIntegrationTest.java index b971bcc8f..a19069789 100644 --- a/src/test/java/net/minestom/server/inventory/click/integration/HeldClickIntegrationTest.java +++ b/src/test/java/net/minestom/server/inventory/click/integration/HeldClickIntegrationTest.java @@ -16,8 +16,7 @@ import org.junit.jupiter.api.Test; import java.util.List; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.*; @EnvTest public class HeldClickIntegrationTest { @@ -30,12 +29,13 @@ public class HeldClickIntegrationTest { var listener = env.listen(InventoryPreClickEvent.class); inventory.setItemStack(1, ItemStack.of(Material.DIAMOND)); inventory.setItemStack(2, ItemStack.of(Material.GOLD_INGOT)); - inventory.setItemStack(5, ItemStack.of(Material.DIAMOND)); + inventory.setItemStack(3, ItemStack.of(Material.EGG)); + inventory.setItemStack(6, ItemStack.of(Material.DIAMOND)); // Empty { listener.followup(event -> { assertNull(event.getInventory()); // Player inventory - assertEquals(3, event.getSlot()); + assertTrue(event.getSlot() == 4 || event.getSlot() == 5); assertEquals(ClickType.CHANGE_HELD, event.getClickType()); assertEquals(ItemStack.AIR, inventory.getCursorItem()); @@ -43,13 +43,13 @@ public class HeldClickIntegrationTest { assertEquals(ItemStack.AIR, event.getClickedItem()); }); - heldClick(player, 3, 4); + heldClick(player, 4, 5); } // Swap air { listener.followup(event -> { assertNull(event.getInventory()); // Player inventory - assertEquals(1, event.getSlot()); + assertTrue(event.getSlot() == 1 || event.getSlot() == 0); assertEquals(ClickType.CHANGE_HELD, event.getClickType()); assertEquals(ItemStack.AIR, inventory.getCursorItem()); @@ -65,7 +65,7 @@ public class HeldClickIntegrationTest { // Swap items { listener.followup(event -> { - assertEquals(0, event.getSlot()); + assertTrue(event.getSlot() == 0 || event.getSlot() == 2); assertEquals(ItemStack.AIR, inventory.getCursorItem()); assertEquals(ItemStack.AIR, inventory.getItemStack(1)); }); @@ -75,6 +75,15 @@ public class HeldClickIntegrationTest { assertEquals(ItemStack.of(Material.DIAMOND), inventory.getItemStack(2)); assertEquals(ItemStack.of(Material.GOLD_INGOT), inventory.getItemStack(0)); } + // Swap offhand + { + listener.followup(event -> { + assertTrue(event.getSlot() == 3 || event.getSlot() == 45 /* Vanilla offhand slot is 40, Minestom is 45 */); + }); + heldClick(player, 3, 40); + assertEquals(ItemStack.AIR, inventory.getItemStack(3)); + assertEquals(ItemStack.of(Material.EGG), inventory.getItemInOffHand()); + } // Cancel event { listener.followup(event -> event.setCancelled(true)); @@ -96,11 +105,12 @@ public class HeldClickIntegrationTest { var listener = env.listen(InventoryPreClickEvent.class); inventory.setItemStack(1, ItemStack.of(Material.DIAMOND)); inventory.setItemStack(2, ItemStack.of(Material.GOLD_INGOT)); + inventory.setItemStack(3, ItemStack.of(Material.EGG)); inventory.setItemStack(4, ItemStack.of(Material.DIAMOND)); // Empty { listener.followup(event -> { - assertEquals(inventory, event.getInventory()); + if (event.getInventory() != null) assertEquals(inventory, event.getInventory()); assertEquals(0, event.getSlot()); assertEquals(ClickType.CHANGE_HELD, event.getClickType()); assertEquals(ItemStack.AIR, inventory.getCursorItem(player)); @@ -112,8 +122,8 @@ public class HeldClickIntegrationTest { // Swap empty { listener.followup(event -> { - assertEquals(inventory, event.getInventory()); - assertEquals(1, event.getSlot()); + if (event.getInventory() != null) assertEquals(inventory, event.getInventory()); + assertTrue(event.getSlot() == 1 || event.getSlot() == 0); assertEquals(ItemStack.AIR, inventory.getCursorItem(player)); }); heldClickOpenInventory(player, 1, 0); @@ -124,8 +134,8 @@ public class HeldClickIntegrationTest { // Swap items { listener.followup(event -> { - assertEquals(inventory, event.getInventory()); - assertEquals(2, event.getSlot()); + if (event.getInventory() != null) assertEquals(inventory, event.getInventory()); + assertTrue(event.getSlot() == 2 || event.getSlot() == 0); assertEquals(ItemStack.AIR, inventory.getCursorItem(player)); }); heldClickOpenInventory(player, 2, 0); @@ -133,6 +143,16 @@ public class HeldClickIntegrationTest { assertEquals(ItemStack.of(Material.DIAMOND), inventory.getItemStack(2)); assertEquals(ItemStack.of(Material.GOLD_INGOT), playerInv.getItemStack(0)); } + // Swap offhand + { + listener.followup(event -> { + if (event.getInventory() != null) assertEquals(inventory, event.getInventory()); + assertTrue(event.getSlot() == 3 || event.getSlot() == 45); + }); + heldClickOpenInventory(player, 3, 40); + assertEquals(ItemStack.AIR, inventory.getItemStack(3)); + assertEquals(ItemStack.of(Material.EGG), playerInv.getItemInOffHand()); + } // Cancel event { listener.followup(event -> event.setCancelled(true));