From 2597e370e26b2fbec5dfe2d4214e4cfe2c5935a8 Mon Sep 17 00:00:00 2001 From: Bjarne Koll Date: Fri, 1 Nov 2024 15:57:23 +0100 Subject: [PATCH] Correct update cursor (#11554) 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. --- patches/server/Correct-update-cursor.patch | 42 ++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 patches/server/Correct-update-cursor.patch diff --git a/patches/server/Correct-update-cursor.patch b/patches/server/Correct-update-cursor.patch new file mode 100644 index 0000000000..2deb04671e --- /dev/null +++ b/patches/server/Correct-update-cursor.patch @@ -0,0 +1,42 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Bjarne Koll +Date: Fri, 1 Nov 2024 14:58:57 +0100 +Subject: [PATCH] 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. + +diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 +--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java ++++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +@@ -0,0 +0,0 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl + case PLACE_SOME: + case PLACE_ONE: + 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())); // 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())); + break; + // Modified clicked only +@@ -0,0 +0,0 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl + case DROP_ALL_CURSOR: + case DROP_ONE_CURSOR: + 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())); // Paper - correctly set cursor + break; + // Nothing + case NOTHING: +@@ -0,0 +0,0 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl + // Reset the slot + 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(-1, this.player.inventoryMenu.incrementStateId(), -1, ItemStack.EMPTY)); ++ this.player.connection.send(new net.minecraft.network.protocol.game.ClientboundSetCursorItemPacket(ItemStack.EMPTY)); // Paper - correctly set cursor + } + return; + }