mirror of https://github.com/Minestom/Minestom.git
Fix incorrect slot updating (#2007)
* Fix slot sending * Test fixed slot sending * Also send offhand slots
This commit is contained in:
parent
a5e0641444
commit
009ba773ed
|
@ -166,7 +166,12 @@ public non-sealed class PlayerInventory extends AbstractInventory implements Equ
|
|||
* @param itemStack the item stack in the slot
|
||||
*/
|
||||
protected void sendSlotRefresh(short slot, ItemStack itemStack) {
|
||||
this.player.sendPacket(new SetSlotPacket((byte) 0, 0, slot, itemStack));
|
||||
var openInventory = player.getOpenInventory();
|
||||
if (openInventory != null && slot >= OFFSET && slot < OFFSET + INNER_INVENTORY_SIZE) {
|
||||
this.player.sendPacket(new SetSlotPacket(openInventory.getWindowId(), 0, (short) (slot + openInventory.getSize() - OFFSET), itemStack));
|
||||
} else if (openInventory == null || slot == OFFHAND_SLOT) {
|
||||
this.player.sendPacket(new SetSlotPacket((byte) 0, 0, slot, itemStack));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package net.minestom.server.inventory;
|
||||
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.minestom.server.utils.inventory.PlayerInventoryUtils;
|
||||
import net.minestom.testing.Env;
|
||||
import net.minestom.testing.EnvTest;
|
||||
import net.minestom.server.coordinate.Pos;
|
||||
|
@ -145,4 +146,47 @@ public class InventoryIntegrationTest {
|
|||
assertSame(secondInventory, player.getOpenInventory());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testInnerInventorySlotSending(Env env) {
|
||||
// Inner inventory changes are sent along with the open inventory
|
||||
// Otherwise, they are sent separately
|
||||
|
||||
var instance = env.createFlatInstance();
|
||||
var connection = env.createConnection();
|
||||
var player = connection.connect(instance, new Pos(0, 42, 0)).join();
|
||||
assertEquals(instance, player.getInstance());
|
||||
|
||||
Inventory inventory = new Inventory(InventoryType.CHEST_6_ROW, Component.empty());
|
||||
player.openInventory(inventory);
|
||||
assertEquals(inventory, player.getOpenInventory());
|
||||
|
||||
// Ensure that slots not in the inner inventory are sent separately
|
||||
var packetTracker = connection.trackIncoming(SetSlotPacket.class);
|
||||
player.getInventory().setItemStack(PlayerInventoryUtils.OFFHAND_SLOT, MAGIC_STACK);
|
||||
packetTracker.assertSingle(slot -> {
|
||||
System.out.println(slot);
|
||||
assertEquals((byte) 0, slot.windowId());
|
||||
assertEquals(PlayerInventoryUtils.OFFHAND_SLOT, slot.slot());
|
||||
assertEquals(MAGIC_STACK, slot.itemStack());
|
||||
});
|
||||
|
||||
// Ensure that inner inventory slots are sent as the opened inventory
|
||||
packetTracker = connection.trackIncoming(SetSlotPacket.class);
|
||||
player.getInventory().setItemStack(0, MAGIC_STACK); // Test with first inner inventory slot
|
||||
packetTracker.assertSingle(slot -> {
|
||||
assertEquals(inventory.getWindowId(), slot.windowId());
|
||||
System.out.println(slot.slot());
|
||||
assertEquals(PlayerInventoryUtils.convertToPacketSlot(0) - PlayerInventoryUtils.OFFSET + inventory.getSize(), slot.slot());
|
||||
assertEquals(MAGIC_STACK, slot.itemStack());
|
||||
});
|
||||
|
||||
packetTracker = connection.trackIncoming(SetSlotPacket.class);
|
||||
player.getInventory().setItemStack(35, MAGIC_STACK); // Test with last inner inventory slot
|
||||
packetTracker.assertSingle(slot -> {
|
||||
assertEquals(inventory.getWindowId(), slot.windowId());
|
||||
assertEquals(PlayerInventoryUtils.convertToPacketSlot(35) - PlayerInventoryUtils.OFFSET + inventory.getSize(), slot.slot());
|
||||
assertEquals(MAGIC_STACK, slot.itemStack());
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue