diff --git a/src/main/java/net/minestom/server/inventory/Inventory.java b/src/main/java/net/minestom/server/inventory/Inventory.java index 6f60e6019..9390ce1ba 100644 --- a/src/main/java/net/minestom/server/inventory/Inventory.java +++ b/src/main/java/net/minestom/server/inventory/Inventory.java @@ -304,11 +304,13 @@ public class Inventory implements InventoryModifier, InventoryClickHandler, View if (!isViewer(player)) return; - SetSlotPacket setSlotPacket = new SetSlotPacket(); - setSlotPacket.windowId = -1; - setSlotPacket.slot = -1; - setSlotPacket.itemStack = cursorItem; - player.getPlayerConnection().sendPacket(setSlotPacket); + final ItemStack currentCursorItem = cursorPlayersItem.get(player); + final boolean similar = currentCursorItem != null && currentCursorItem.isSimilar(cursorItem); + + if (!similar) { + final SetSlotPacket setSlotPacket = SetSlotPacket.createCursorPacket(cursorItem); + player.getPlayerConnection().sendPacket(setSlotPacket); + } this.cursorPlayersItem.put(player, cursorItem); } diff --git a/src/main/java/net/minestom/server/inventory/PlayerInventory.java b/src/main/java/net/minestom/server/inventory/PlayerInventory.java index 7395c0578..c414cc3a1 100644 --- a/src/main/java/net/minestom/server/inventory/PlayerInventory.java +++ b/src/main/java/net/minestom/server/inventory/PlayerInventory.java @@ -221,7 +221,8 @@ public class PlayerInventory implements InventoryModifier, InventoryClickHandler * @param slot the slot to refresh */ public void refreshSlot(short slot) { - sendSlotRefresh((short) convertToPacketSlot(slot), getItemStack(slot)); + final int packetSlot = convertToPacketSlot(slot); + sendSlotRefresh((short) packetSlot, getItemStack(slot)); } /** @@ -240,12 +241,13 @@ public class PlayerInventory implements InventoryModifier, InventoryClickHandler * @param cursorItem the new cursor item */ public void setCursorItem(@NotNull ItemStack cursorItem) { + final boolean similar = this.cursorItem.isSimilar(cursorItem); this.cursorItem = cursorItem; - SetSlotPacket setSlotPacket = new SetSlotPacket(); - setSlotPacket.windowId = -1; - setSlotPacket.slot = -1; - setSlotPacket.itemStack = cursorItem; - player.getPlayerConnection().sendPacket(setSlotPacket); + + if (!similar) { + final SetSlotPacket setSlotPacket = SetSlotPacket.createCursorPacket(cursorItem); + player.getPlayerConnection().sendPacket(setSlotPacket); + } } /** @@ -340,7 +342,7 @@ public class PlayerInventory implements InventoryModifier, InventoryClickHandler */ protected void sendSlotRefresh(short slot, ItemStack itemStack) { SetSlotPacket setSlotPacket = new SetSlotPacket(); - setSlotPacket.windowId = (byte) (MathUtils.isBetween(slot, 35, INVENTORY_SIZE) ? 0 : -2); + setSlotPacket.windowId = 0; setSlotPacket.slot = slot; setSlotPacket.itemStack = itemStack; player.getPlayerConnection().sendPacket(setSlotPacket); diff --git a/src/main/java/net/minestom/server/listener/WindowListener.java b/src/main/java/net/minestom/server/listener/WindowListener.java index dd58b9aea..dd65f33af 100644 --- a/src/main/java/net/minestom/server/listener/WindowListener.java +++ b/src/main/java/net/minestom/server/listener/WindowListener.java @@ -4,12 +4,9 @@ import net.minestom.server.entity.Player; import net.minestom.server.event.inventory.InventoryCloseEvent; import net.minestom.server.inventory.Inventory; import net.minestom.server.inventory.InventoryClickHandler; -import net.minestom.server.inventory.PlayerInventory; -import net.minestom.server.item.ItemStack; import net.minestom.server.network.packet.client.play.ClientClickWindowPacket; import net.minestom.server.network.packet.client.play.ClientCloseWindow; import net.minestom.server.network.packet.client.play.ClientWindowConfirmationPacket; -import net.minestom.server.network.packet.server.play.SetSlotPacket; import net.minestom.server.network.packet.server.play.WindowConfirmationPacket; public class WindowListener { @@ -80,8 +77,6 @@ public class WindowListener { break; } - refreshCursorItem(player, inventory); - WindowConfirmationPacket windowConfirmationPacket = new WindowConfirmationPacket(); windowConfirmationPacket.windowId = windowId; windowConfirmationPacket.actionNumber = actionNumber; @@ -90,33 +85,6 @@ public class WindowListener { player.getPlayerConnection().sendPacket(windowConfirmationPacket); } - /** - * @param player the player to refresh the cursor item - * @param inventory the player open inventory, null if not any (could be player inventory) - */ - private static void refreshCursorItem(Player player, Inventory inventory) { - PlayerInventory playerInventory = player.getInventory(); - - ItemStack cursorItem; - if (inventory != null) { - cursorItem = inventory.getCursorItem(player); - } else { - cursorItem = playerInventory.getCursorItem(); - } - - // Error occurred while retrieving the cursor item, stop here - if (cursorItem == null) { - return; - } - - SetSlotPacket setSlotPacket = new SetSlotPacket(); - setSlotPacket.windowId = -1; - setSlotPacket.slot = -1; - setSlotPacket.itemStack = cursorItem; - - player.getPlayerConnection().sendPacket(setSlotPacket); - } - public static void closeWindowListener(ClientCloseWindow packet, Player player) { // if windowId == 0 then it is player's inventory, meaning that they hadn't been any open inventory packet InventoryCloseEvent inventoryCloseEvent = new InventoryCloseEvent(player, player.getOpenInventory()); diff --git a/src/main/java/net/minestom/server/network/packet/server/play/SetSlotPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/SetSlotPacket.java index aef5e4947..71148bd7d 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/SetSlotPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/SetSlotPacket.java @@ -23,4 +23,19 @@ public class SetSlotPacket implements ServerPacket { public int getId() { return ServerPacketIdentifier.SET_SLOT; } + + /** + * Returns a {@link SetSlotPacket} used to change a player cursor item. + * + * @param cursorItem the cursor item + * @return a set slot packet to change a player cursor item + */ + @NotNull + public static SetSlotPacket createCursorPacket(@NotNull ItemStack cursorItem) { + SetSlotPacket setSlotPacket = new SetSlotPacket(); + setSlotPacket.windowId = -1; + setSlotPacket.slot = -1; + setSlotPacket.itemStack = cursorItem; + return setSlotPacket; + } }