mirror of
https://github.com/Minestom/Minestom.git
synced 2024-12-26 19:18:12 +01:00
Fix SetSlotPacket
This commit is contained in:
parent
0658d1659c
commit
e1a886aa3a
@ -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;
|
||||
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);
|
||||
}
|
||||
|
@ -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,13 +241,14 @@ 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;
|
||||
|
||||
if (!similar) {
|
||||
final SetSlotPacket setSlotPacket = SetSlotPacket.createCursorPacket(cursorItem);
|
||||
player.getPlayerConnection().sendPacket(setSlotPacket);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Inserts an item safely (synchronized) in the appropriate slot.
|
||||
@ -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);
|
||||
|
@ -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());
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user