From 16f29bd54aaa72704a72e278724833456ebc96bd Mon Sep 17 00:00:00 2001
From: Owen1212055 <23108066+Owen1212055@users.noreply.github.com>
Date: Thu, 13 Jul 2023 15:48:46 -0400
Subject: [PATCH] Fix missing item interaction cancelling case (#9427)

Properly cancels brushes now
---
 .../server/Properly-Cancel-Usable-Items.patch | 24 +++++++++++++++++++
 1 file changed, 24 insertions(+)

diff --git a/patches/server/Properly-Cancel-Usable-Items.patch b/patches/server/Properly-Cancel-Usable-Items.patch
index 9a8e5e1a8e..669c75a828 100644
--- a/patches/server/Properly-Cancel-Usable-Items.patch
+++ b/patches/server/Properly-Cancel-Usable-Items.patch
@@ -9,6 +9,30 @@ 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 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java
++++ b/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java
+@@ -0,0 +0,0 @@ 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);
+@@ -0,0 +0,0 @@ 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 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java