Fix ghost cursor item when canceling an inventory click

This commit is contained in:
themode 2020-12-15 05:52:35 +01:00
parent bf10f0d3f7
commit 9b9dab56eb

View File

@ -4,9 +4,12 @@ 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 {
@ -82,6 +85,11 @@ public class WindowListener {
break;
}
// Prevent the player from picking a ghost item in cursor
if (!successful) {
refreshCursorItem(player, inventory);
}
WindowConfirmationPacket windowConfirmationPacket = new WindowConfirmationPacket();
windowConfirmationPacket.windowId = windowId;
windowConfirmationPacket.actionNumber = actionNumber;
@ -106,4 +114,28 @@ public class WindowListener {
// Empty
}
/**
* @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;
}
final SetSlotPacket setSlotPacket = SetSlotPacket.createCursorPacket(cursorItem);
player.getPlayerConnection().sendPacket(setSlotPacket);
}
}