aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0956-Properly-Cancel-Usable-Items.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/server/0956-Properly-Cancel-Usable-Items.patch')
-rw-r--r--patches/server/0956-Properly-Cancel-Usable-Items.patch63
1 files changed, 63 insertions, 0 deletions
diff --git a/patches/server/0956-Properly-Cancel-Usable-Items.patch b/patches/server/0956-Properly-Cancel-Usable-Items.patch
new file mode 100644
index 0000000000..ac735f5582
--- /dev/null
+++ b/patches/server/0956-Properly-Cancel-Usable-Items.patch
@@ -0,0 +1,63 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Owen1212055 <[email protected]>
+Date: Tue, 23 May 2023 22:33:36 -0400
+Subject: [PATCH] Properly Cancel Usable Items
+
+This fixes the bug causing cancelling PlayerInteractEvent to cause items to continue to be used despite being cancelled on the server.
+
+For example, items being consumed but never finishing, shields being put up, etc.
+The underlying issue of this is that the client modifies their synced data values, and so we have to (forcibly) resend
+them in order for the client to reset their using item state.
+
+diff --git a/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java b/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java
+index 4b1af7bba3ce10a1247bb61535456510e18da2d9..76cef8f2861af8fcb88b4dad294a8853dd3f3e01 100644
+--- a/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java
++++ b/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java
+@@ -562,6 +562,7 @@ public class ServerPlayerGameMode {
+ }
+ // Paper end - extend Player Interact cancellation
+ player.getBukkitEntity().updateInventory(); // SPIGOT-2867
++ this.player.resyncUsingItem(this.player); // Paper - Resend player's using item status
+ enuminteractionresult = (event.useItemInHand() != Event.Result.ALLOW) ? InteractionResult.SUCCESS : InteractionResult.PASS;
+ } else if (this.gameModeForPlayer == GameType.SPECTATOR) {
+ MenuProvider itileinventory = iblockdata.getMenuProvider(world, blockposition);
+@@ -605,6 +606,11 @@ public class ServerPlayerGameMode {
+
+ return enuminteractionresult1;
+ }
++ // Paper start - Cancel only if cancelled + if the interact result is different from default response
++ else if (this.interactResult && this.interactResult != cancelledItem) {
++ this.player.resyncUsingItem(this.player);
++ }
++ // Paper end
+ }
+ return enuminteractionresult;
+ // CraftBukkit end
+diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+index ba257447048b9322defaecfd7424579f287ff483..bb74c271acc02d4f750daeb05bc05b1d6f61ffeb 100644
+--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
++++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+@@ -1923,6 +1923,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
+ }
+
+ if (cancelled) {
++ this.player.resyncUsingItem(this.player); // Paper - Resend player's using item status
+ this.player.getBukkitEntity().updateInventory(); // SPIGOT-2524
+ return;
+ }
+diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java
+index 371f6d2539eac7161a86bb64763b4ee228eccbdf..6d4d46163ffcffa98f400c2656703eb5c4818f40 100644
+--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
++++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
+@@ -3811,6 +3811,11 @@ public abstract class LivingEntity extends Entity implements Attackable {
+ return ((Byte) this.entityData.get(LivingEntity.DATA_LIVING_ENTITY_FLAGS) & 2) > 0 ? InteractionHand.OFF_HAND : InteractionHand.MAIN_HAND;
+ }
+
++ // Paper start
++ public void resyncUsingItem(ServerPlayer serverPlayer) {
++ this.getEntityData().resendPossiblyDesyncedDataValues(java.util.List.of(DATA_LIVING_ENTITY_FLAGS), serverPlayer);
++ }
++ // Paper end
+ private void updatingUsingItem() {
+ if (this.isUsingItem()) {
+ if (ItemStack.isSameItem(this.getItemInHand(this.getUsedItemHand()), this.useItem)) {