From 973bb479498a5d7a475e986faee151d7521ef725 Mon Sep 17 00:00:00 2001 From: Newwind Date: Sat, 31 Aug 2024 19:29:50 +0100 Subject: [PATCH] Fix horse armor desync (#11341) --- ...ory-desync.patch => Fix-slot-desync.patch} | 25 +++++++++++++++- ...oversized-item-data-in-equipment-and.patch | 6 ++-- ...nventory-when-cancelling-PlayerInter.patch | 29 ------------------- 3 files changed, 27 insertions(+), 33 deletions(-) rename patches/server/{Fix-inventory-desync.patch => Fix-slot-desync.patch} (80%) delete mode 100644 patches/server/Refresh-player-inventory-when-cancelling-PlayerInter.patch diff --git a/patches/server/Fix-inventory-desync.patch b/patches/server/Fix-slot-desync.patch similarity index 80% rename from patches/server/Fix-inventory-desync.patch rename to patches/server/Fix-slot-desync.patch index ee846d6e4c..5b4bba36d0 100644 --- a/patches/server/Fix-inventory-desync.patch +++ b/patches/server/Fix-slot-desync.patch @@ -1,8 +1,13 @@ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jake Potrebic Date: Wed, 23 Aug 2023 13:22:09 -0700 -Subject: [PATCH] Fix inventory desync +Subject: [PATCH] Fix slot desync +General patch fixing slot desyncs between the server and client that +result from cancelled events/paper introduced logic. + +Co-authored-by: Minecrell +Co-authored-by: Newwind diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 @@ -16,6 +21,24 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 public void resendItemInHands() { this.containerMenu.findSlot(this.getInventory(), this.getInventory().selected).ifPresent(s -> { this.containerSynchronizer.sendSlotChange(this.containerMenu, s, this.getMainHandItem()); +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 + // Refresh the current entity metadata + entity.refreshEntityData(ServerGamePacketListenerImpl.this.player); + // SPIGOT-7136 - Allays +- if (entity instanceof Allay) { ++ if (entity instanceof Allay || entity instanceof net.minecraft.world.entity.animal.horse.AbstractHorse) { // Paper - Fix horse armor desync + ServerGamePacketListenerImpl.this.send(new ClientboundSetEquipmentPacket(entity.getId(), Arrays.stream(net.minecraft.world.entity.EquipmentSlot.values()).map((slot) -> Pair.of(slot, ((LivingEntity) entity).getItemBySlot(slot).copy())).collect(Collectors.toList()))); +- ServerGamePacketListenerImpl.this.player.containerMenu.sendAllDataToRemote(); + } ++ ++ ServerGamePacketListenerImpl.this.player.containerMenu.sendAllDataToRemote(); // Paper - fix slot desync - always refresh player inventory + } + + if (event.isCancelled()) { diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java diff --git a/patches/server/Prevent-sending-oversized-item-data-in-equipment-and.patch b/patches/server/Prevent-sending-oversized-item-data-in-equipment-and.patch index 63db36b61d..b5de289018 100644 --- a/patches/server/Prevent-sending-oversized-item-data-in-equipment-and.patch +++ b/patches/server/Prevent-sending-oversized-item-data-in-equipment-and.patch @@ -215,12 +215,12 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 @@ -0,0 +0,0 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl entity.refreshEntityData(ServerGamePacketListenerImpl.this.player); // SPIGOT-7136 - Allays - if (entity instanceof Allay) { + if (entity instanceof Allay || entity instanceof net.minecraft.world.entity.animal.horse.AbstractHorse) { // Paper - Fix horse armor desync - ServerGamePacketListenerImpl.this.send(new ClientboundSetEquipmentPacket(entity.getId(), Arrays.stream(net.minecraft.world.entity.EquipmentSlot.values()).map((slot) -> Pair.of(slot, ((LivingEntity) entity).getItemBySlot(slot).copy())).collect(Collectors.toList()))); + ServerGamePacketListenerImpl.this.send(new ClientboundSetEquipmentPacket(entity.getId(), Arrays.stream(net.minecraft.world.entity.EquipmentSlot.values()).map((slot) -> Pair.of(slot, ((LivingEntity) entity).getItemBySlot(slot).copy())).collect(Collectors.toList()), true)); // Paper - sanitize - ServerGamePacketListenerImpl.this.player.containerMenu.sendAllDataToRemote(); } - } + + ServerGamePacketListenerImpl.this.player.containerMenu.sendAllDataToRemote(); // Paper - fix slot desync - always refresh player inventory diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java diff --git a/patches/server/Refresh-player-inventory-when-cancelling-PlayerInter.patch b/patches/server/Refresh-player-inventory-when-cancelling-PlayerInter.patch deleted file mode 100644 index 0b94670889..0000000000 --- a/patches/server/Refresh-player-inventory-when-cancelling-PlayerInter.patch +++ /dev/null @@ -1,29 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Minecrell -Date: Fri, 13 Jul 2018 14:54:43 +0200 -Subject: [PATCH] Refresh player inventory when cancelling - PlayerInteractEntityEvent - -When interacting with entities with an item, the client will assume -the interaction is successful, and update the held item on the -client. However, if the interaction is cancelled on the server side, -the client will still mistakenly remove/replace the item in hand. - -Examples for this are milking cows with a bucket or dyeing sheep. -The bucket is replaced with milk and the dye removed from inventory. - -Refresh the player inventory when PlayerInteractEntityEvent is -cancelled to avoid this problem. - -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 - } - - if (event.isCancelled()) { -+ ServerGamePacketListenerImpl.this.player.containerMenu.sendAllDataToRemote(); // Paper - Refresh player inventory - return; - } - // CraftBukkit end