Correct update cursor

Spigot uses a no longer valid ClientboundContainerSetSlotPacket with the
slot -1, which would update the carried stack in versions <=1.21.1 but
now leads to an IOOB.
1.21.2 instead introduced the ClientboundSetCursorItemPacket, which this
patch uses instead.
This commit is contained in:
Bjarne Koll 2024-11-01 14:58:57 +01:00
parent b620df8e20
commit 66e1ce8504

View file

@ -2369,7 +2369,7 @@
+ case PLACE_SOME: + case PLACE_SOME:
+ case PLACE_ONE: + case PLACE_ONE:
+ case SWAP_WITH_CURSOR: + case SWAP_WITH_CURSOR:
+ this.player.connection.send(new ClientboundContainerSetSlotPacket(-1, -1, this.player.inventoryMenu.incrementStateId(), this.player.containerMenu.getCarried())); + this.player.connection.send(new net.minecraft.network.protocol.game.ClientboundSetCursorItemPacket(this.player.containerMenu.getCarried().copy())); // Paper - correctly set cursor
+ this.player.connection.send(new ClientboundContainerSetSlotPacket(this.player.containerMenu.containerId, this.player.inventoryMenu.incrementStateId(), packet.getSlotNum(), this.player.containerMenu.getSlot(packet.getSlotNum()).getItem())); + this.player.connection.send(new ClientboundContainerSetSlotPacket(this.player.containerMenu.containerId, this.player.inventoryMenu.incrementStateId(), packet.getSlotNum(), this.player.containerMenu.getSlot(packet.getSlotNum()).getItem()));
+ break; + break;
+ // Modified clicked only + // Modified clicked only
@ -2381,7 +2381,7 @@
+ case DROP_ALL_CURSOR: + case DROP_ALL_CURSOR:
+ case DROP_ONE_CURSOR: + case DROP_ONE_CURSOR:
+ case CLONE_STACK: + case CLONE_STACK:
+ this.player.connection.send(new ClientboundContainerSetSlotPacket(-1, -1, this.player.inventoryMenu.incrementStateId(), this.player.containerMenu.getCarried())); + this.player.connection.send(new net.minecraft.network.protocol.game.ClientboundSetCursorItemPacket(this.player.containerMenu.getCarried().copy())); // Paper - correctly set cursor
+ break; + break;
+ // Nothing + // Nothing
+ case NOTHING: + case NOTHING:
@ -2502,7 +2502,7 @@
+ // Reset the slot + // Reset the slot
+ if (packet.slotNum() >= 0) { + if (packet.slotNum() >= 0) {
+ this.player.connection.send(new ClientboundContainerSetSlotPacket(this.player.inventoryMenu.containerId, this.player.inventoryMenu.incrementStateId(), packet.slotNum(), this.player.inventoryMenu.getSlot(packet.slotNum()).getItem())); + this.player.connection.send(new ClientboundContainerSetSlotPacket(this.player.inventoryMenu.containerId, this.player.inventoryMenu.incrementStateId(), packet.slotNum(), this.player.inventoryMenu.getSlot(packet.slotNum()).getItem()));
+ this.player.connection.send(new ClientboundContainerSetSlotPacket(-1, this.player.inventoryMenu.incrementStateId(), -1, ItemStack.EMPTY)); + this.player.connection.send(new net.minecraft.network.protocol.game.ClientboundSetCursorItemPacket(ItemStack.EMPTY.copy())); // Paper - correctly set cursor
+ } + }
+ return; + return;
+ } + }