From 098a12961dd8e10ab50c257dfa35ad5cae2ed789 Mon Sep 17 00:00:00 2001 From: TheMode Date: Sat, 24 Apr 2021 19:00:30 +0200 Subject: [PATCH 01/10] Fix ghost item when cancelling inventory click --- .../java/net/minestom/server/listener/WindowListener.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/net/minestom/server/listener/WindowListener.java b/src/main/java/net/minestom/server/listener/WindowListener.java index db6881ca9..8d22afa24 100644 --- a/src/main/java/net/minestom/server/listener/WindowListener.java +++ b/src/main/java/net/minestom/server/listener/WindowListener.java @@ -88,6 +88,14 @@ public class WindowListener { // Prevent the player from picking a ghost item in cursor refreshCursorItem(player, inventory); + // Prevent ghost item when the click is cancelled + if (!successful) { + player.getInventory().update(); + if (inventory != null) { + inventory.update(player); + } + } + WindowConfirmationPacket windowConfirmationPacket = new WindowConfirmationPacket(); windowConfirmationPacket.windowId = windowId; windowConfirmationPacket.actionNumber = actionNumber; From b662e331f006649e729d63a20dcf38a280ab75a8 Mon Sep 17 00:00:00 2001 From: TheMode Date: Sat, 24 Apr 2021 19:08:02 +0200 Subject: [PATCH 02/10] Fix shift clicks not being cancelled --- .../inventory/click/InventoryClickProcessor.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/minestom/server/inventory/click/InventoryClickProcessor.java b/src/main/java/net/minestom/server/inventory/click/InventoryClickProcessor.java index 80ce319e2..f5c835010 100644 --- a/src/main/java/net/minestom/server/inventory/click/InventoryClickProcessor.java +++ b/src/main/java/net/minestom/server/inventory/click/InventoryClickProcessor.java @@ -186,7 +186,7 @@ public class InventoryClickProcessor { return null; var pair = TransactionType.ADD.process(targetInventory, clicked, (index, itemStack) -> { - InventoryClickResult result = startCondition(inventory, player, index, ClickType.SHIFT_CLICK, itemStack, cursor); + InventoryClickResult result = startCondition(targetInventory, player, index, ClickType.SHIFT_CLICK, itemStack, cursor); return !result.isCancel(); }); @@ -209,7 +209,7 @@ public class InventoryClickProcessor { var pair = TransactionType.ADD.process(targetInventory, clicked, (index, itemStack) -> { if (index == slot) // Prevent item lose/duplication return false; - InventoryClickResult result = startCondition(null, player, index, ClickType.SHIFT_CLICK, itemStack, cursor); + InventoryClickResult result = startCondition(targetInventory, player, index, ClickType.SHIFT_CLICK, itemStack, cursor); return !result.isCancel(); }, start, end, step); @@ -547,6 +547,13 @@ public class InventoryClickProcessor { return startCondition(clickResult, inventory, player, slot, clickType); } + @NotNull + private InventoryClickResult startCondition(@Nullable AbstractInventory inventory, @NotNull Player player, int slot, + @NotNull ClickType clickType, @NotNull ItemStack clicked, @NotNull ItemStack cursor) { + return startCondition(inventory instanceof Inventory ? (Inventory) inventory : null, + player, slot, clickType, clicked, cursor); + } + private void callClickEvent(@NotNull Player player, @Nullable Inventory inventory, int slot, @NotNull ClickType clickType, @NotNull ItemStack clicked, @NotNull ItemStack cursor) { InventoryClickEvent inventoryClickEvent = new InventoryClickEvent(inventory, player, slot, clickType, clicked, cursor); From 4eaa15477ba38bfb34380377205fb375a3754a22 Mon Sep 17 00:00:00 2001 From: TheMode Date: Sat, 24 Apr 2021 19:14:19 +0200 Subject: [PATCH 03/10] Potentially fix cursor ghost item when opening a new inventory --- .../java/net/minestom/server/entity/Player.java | 6 +++--- .../net/minestom/server/inventory/Inventory.java | 15 ++++++++------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/main/java/net/minestom/server/entity/Player.java b/src/main/java/net/minestom/server/entity/Player.java index b9818c1cc..f2b0c45a9 100644 --- a/src/main/java/net/minestom/server/entity/Player.java +++ b/src/main/java/net/minestom/server/entity/Player.java @@ -1928,9 +1928,9 @@ public class Player extends LivingEntity implements CommandSender, Localizable, InventoryOpenEvent inventoryOpenEvent = new InventoryOpenEvent(inventory, this); callCancellableEvent(InventoryOpenEvent.class, inventoryOpenEvent, () -> { - - if (getOpenInventory() != null) { - getOpenInventory().removeViewer(this); + Inventory openInventory = getOpenInventory(); + if (openInventory != null) { + openInventory.removeViewer(this); } Inventory newInventory = inventoryOpenEvent.getInventory(); diff --git a/src/main/java/net/minestom/server/inventory/Inventory.java b/src/main/java/net/minestom/server/inventory/Inventory.java index c61aeb7c9..728209009 100644 --- a/src/main/java/net/minestom/server/inventory/Inventory.java +++ b/src/main/java/net/minestom/server/inventory/Inventory.java @@ -174,7 +174,7 @@ public class Inventory extends AbstractInventory implements Viewable { @Override public boolean removeViewer(@NotNull Player player) { final boolean result = this.viewers.remove(player); - this.cursorPlayersItem.remove(player); + setCursorItem(player, ItemStack.AIR); this.clickProcessor.clearCache(player); return result; } @@ -198,18 +198,19 @@ public class Inventory extends AbstractInventory implements Viewable { * @param cursorItem the new player cursor item */ public void setCursorItem(@NotNull Player player, @NotNull ItemStack cursorItem) { - if (!isViewer(player)) - return; - - final ItemStack currentCursorItem = cursorPlayersItem.get(player); - final boolean similar = currentCursorItem != null && currentCursorItem.isSimilar(cursorItem); + final ItemStack currentCursorItem = cursorPlayersItem.getOrDefault(player, ItemStack.AIR); + final boolean similar = currentCursorItem.isSimilar(cursorItem); if (!similar) { final SetSlotPacket setSlotPacket = SetSlotPacket.createCursorPacket(cursorItem); player.getPlayerConnection().sendPacket(setSlotPacket); } - this.cursorPlayersItem.put(player, cursorItem); + if (!cursorItem.isAir()) { + this.cursorPlayersItem.put(player, cursorItem); + } else { + this.cursorPlayersItem.remove(player); + } } /** From db619243da5a925d862b1919dafed14fa92c0993 Mon Sep 17 00:00:00 2001 From: TheMode Date: Sat, 24 Apr 2021 19:25:26 +0200 Subject: [PATCH 04/10] Ensure that the opened inventory is the same before refreshing the cursor item --- .../java/net/minestom/server/listener/WindowListener.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/minestom/server/listener/WindowListener.java b/src/main/java/net/minestom/server/listener/WindowListener.java index 8d22afa24..eb9b942ed 100644 --- a/src/main/java/net/minestom/server/listener/WindowListener.java +++ b/src/main/java/net/minestom/server/listener/WindowListener.java @@ -12,6 +12,8 @@ import net.minestom.server.network.packet.client.play.ClientWindowConfirmationPa import net.minestom.server.network.packet.server.play.SetSlotPacket; import net.minestom.server.network.packet.server.play.WindowConfirmationPacket; +import java.util.Objects; + public class WindowListener { public static void clickWindowListener(ClientClickWindowPacket packet, Player player) { @@ -86,7 +88,9 @@ public class WindowListener { } // Prevent the player from picking a ghost item in cursor - refreshCursorItem(player, inventory); + if (Objects.equals(player.getOpenInventory(), inventory)) { + refreshCursorItem(player, inventory); + } // Prevent ghost item when the click is cancelled if (!successful) { From b0afadf0933a62499ddb7f901dc70a9bb5330133 Mon Sep 17 00:00:00 2001 From: TheMode Date: Sun, 25 Apr 2021 10:42:05 +0200 Subject: [PATCH 05/10] Override Argument#toString for all subclasses --- .../command/builder/arguments/ArgumentBoolean.java | 4 ++++ .../command/builder/arguments/ArgumentCommand.java | 5 +++++ .../command/builder/arguments/ArgumentLiteral.java | 5 +++++ .../command/builder/arguments/ArgumentString.java | 5 +++++ .../builder/arguments/ArgumentStringArray.java | 5 +++++ .../command/builder/arguments/ArgumentWord.java | 5 +++++ .../builder/arguments/minecraft/ArgumentColor.java | 5 +++++ .../arguments/minecraft/ArgumentComponent.java | 5 +++++ .../arguments/minecraft/ArgumentEntity.java | 14 ++++++++++++++ .../arguments/minecraft/ArgumentFloatRange.java | 5 +++++ .../arguments/minecraft/ArgumentIntRange.java | 5 +++++ .../arguments/minecraft/ArgumentItemStack.java | 5 +++++ .../minecraft/ArgumentNbtCompoundTag.java | 5 +++++ .../arguments/minecraft/ArgumentNbtTag.java | 5 +++++ .../minecraft/ArgumentResourceLocation.java | 5 +++++ .../builder/arguments/minecraft/ArgumentTime.java | 5 +++++ .../builder/arguments/minecraft/ArgumentUUID.java | 5 +++++ .../minecraft/registry/ArgumentBlockState.java | 5 +++++ .../minecraft/registry/ArgumentEnchantment.java | 5 +++++ .../minecraft/registry/ArgumentEntityType.java | 5 +++++ .../minecraft/registry/ArgumentParticle.java | 5 +++++ .../minecraft/registry/ArgumentPotionEffect.java | 5 +++++ .../builder/arguments/number/ArgumentDouble.java | 4 ++++ .../builder/arguments/number/ArgumentFloat.java | 4 ++++ .../builder/arguments/number/ArgumentInteger.java | 4 ++++ .../relative/ArgumentRelativeBlockPosition.java | 5 +++++ .../arguments/relative/ArgumentRelativeVec2.java | 4 ++++ .../arguments/relative/ArgumentRelativeVec3.java | 5 +++++ 28 files changed, 144 insertions(+) diff --git a/src/main/java/net/minestom/server/command/builder/arguments/ArgumentBoolean.java b/src/main/java/net/minestom/server/command/builder/arguments/ArgumentBoolean.java index e227352fe..9a76b99ae 100644 --- a/src/main/java/net/minestom/server/command/builder/arguments/ArgumentBoolean.java +++ b/src/main/java/net/minestom/server/command/builder/arguments/ArgumentBoolean.java @@ -37,4 +37,8 @@ public class ArgumentBoolean extends Argument { nodeMaker.addNodes(new DeclareCommandsPacket.Node[]{argumentNode}); } + @Override + public String toString() { + return String.format("Boolean<%s>", getId()); + } } diff --git a/src/main/java/net/minestom/server/command/builder/arguments/ArgumentCommand.java b/src/main/java/net/minestom/server/command/builder/arguments/ArgumentCommand.java index c2d90c5ae..d6179499a 100644 --- a/src/main/java/net/minestom/server/command/builder/arguments/ArgumentCommand.java +++ b/src/main/java/net/minestom/server/command/builder/arguments/ArgumentCommand.java @@ -74,4 +74,9 @@ public class ArgumentCommand extends Argument { this.shortcut = shortcut; return this; } + + @Override + public String toString() { + return String.format("Command<%s>", getId()); + } } diff --git a/src/main/java/net/minestom/server/command/builder/arguments/ArgumentLiteral.java b/src/main/java/net/minestom/server/command/builder/arguments/ArgumentLiteral.java index cc65aab21..558e38509 100644 --- a/src/main/java/net/minestom/server/command/builder/arguments/ArgumentLiteral.java +++ b/src/main/java/net/minestom/server/command/builder/arguments/ArgumentLiteral.java @@ -31,4 +31,9 @@ public class ArgumentLiteral extends Argument { nodeMaker.addNodes(new DeclareCommandsPacket.Node[]{literalNode}); } + + @Override + public String toString() { + return String.format("Literal<%s>", getId()); + } } diff --git a/src/main/java/net/minestom/server/command/builder/arguments/ArgumentString.java b/src/main/java/net/minestom/server/command/builder/arguments/ArgumentString.java index 337a33544..0bca51aa8 100644 --- a/src/main/java/net/minestom/server/command/builder/arguments/ArgumentString.java +++ b/src/main/java/net/minestom/server/command/builder/arguments/ArgumentString.java @@ -77,4 +77,9 @@ public class ArgumentString extends Argument { return StringEscapeUtils.unescapeJava(input); } + + @Override + public String toString() { + return String.format("String<%s>", getId()); + } } diff --git a/src/main/java/net/minestom/server/command/builder/arguments/ArgumentStringArray.java b/src/main/java/net/minestom/server/command/builder/arguments/ArgumentStringArray.java index c6fb090bb..e56781dbc 100644 --- a/src/main/java/net/minestom/server/command/builder/arguments/ArgumentStringArray.java +++ b/src/main/java/net/minestom/server/command/builder/arguments/ArgumentStringArray.java @@ -36,4 +36,9 @@ public class ArgumentStringArray extends Argument { nodeMaker.addNodes(new DeclareCommandsPacket.Node[]{argumentNode}); } + + @Override + public String toString() { + return String.format("StringArray<%s>", getId()); + } } diff --git a/src/main/java/net/minestom/server/command/builder/arguments/ArgumentWord.java b/src/main/java/net/minestom/server/command/builder/arguments/ArgumentWord.java index 7426a41ce..5f2deb5b3 100644 --- a/src/main/java/net/minestom/server/command/builder/arguments/ArgumentWord.java +++ b/src/main/java/net/minestom/server/command/builder/arguments/ArgumentWord.java @@ -116,4 +116,9 @@ public class ArgumentWord extends Argument { public String[] getRestrictions() { return restrictions; } + + @Override + public String toString() { + return String.format("Word<%s>", getId()); + } } diff --git a/src/main/java/net/minestom/server/command/builder/arguments/minecraft/ArgumentColor.java b/src/main/java/net/minestom/server/command/builder/arguments/minecraft/ArgumentColor.java index 6e6f804c2..dfe6e805f 100644 --- a/src/main/java/net/minestom/server/command/builder/arguments/minecraft/ArgumentColor.java +++ b/src/main/java/net/minestom/server/command/builder/arguments/minecraft/ArgumentColor.java @@ -47,4 +47,9 @@ public class ArgumentColor extends Argument