2023-06-19 00:33:15 +02:00
|
|
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
|
|
From: Owen1212055 <23108066+Owen1212055@users.noreply.github.com>
|
|
|
|
Date: Tue, 23 May 2023 22:33:36 -0400
|
2024-01-15 12:38:39 +01:00
|
|
|
Subject: [PATCH] Properly cancel usable items
|
2023-06-19 00:33:15 +02:00
|
|
|
|
|
|
|
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.
|
|
|
|
|
2023-07-13 21:48:46 +02:00
|
|
|
diff --git a/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java b/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java
|
2024-01-18 18:52:00 +01:00
|
|
|
index a4058e8ce468ef515236813b034f1a08d5d9589f..0357e190f6cc0724223ed705b19651d865bf853b 100644
|
2023-07-13 21:48:46 +02:00
|
|
|
--- a/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java
|
|
|
|
+++ b/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java
|
2023-12-03 04:41:35 +01:00
|
|
|
@@ -557,6 +557,7 @@ public class ServerPlayerGameMode {
|
2023-07-13 21:48:46 +02:00
|
|
|
}
|
|
|
|
// Paper end - extend Player Interact cancellation
|
|
|
|
player.getBukkitEntity().updateInventory(); // SPIGOT-2867
|
2024-01-15 12:38:39 +01:00
|
|
|
+ this.player.resyncUsingItem(this.player); // Paper - Properly cancel usable items
|
2023-07-13 21:48:46 +02:00
|
|
|
enuminteractionresult = (event.useItemInHand() != Event.Result.ALLOW) ? InteractionResult.SUCCESS : InteractionResult.PASS;
|
|
|
|
} else if (this.gameModeForPlayer == GameType.SPECTATOR) {
|
|
|
|
MenuProvider itileinventory = iblockdata.getMenuProvider(world, blockposition);
|
2023-12-03 04:41:35 +01:00
|
|
|
@@ -600,6 +601,11 @@ public class ServerPlayerGameMode {
|
2023-07-13 21:48:46 +02:00
|
|
|
|
|
|
|
return enuminteractionresult1;
|
|
|
|
}
|
2024-01-15 12:38:39 +01:00
|
|
|
+ // Paper start - Properly cancel usable items; Cancel only if cancelled + if the interact result is different from default response
|
2023-07-13 21:48:46 +02:00
|
|
|
+ else if (this.interactResult && this.interactResult != cancelledItem) {
|
|
|
|
+ this.player.resyncUsingItem(this.player);
|
|
|
|
+ }
|
2024-01-15 12:38:39 +01:00
|
|
|
+ // Paper end - Properly cancel usable items
|
2023-07-13 21:48:46 +02:00
|
|
|
}
|
|
|
|
return enuminteractionresult;
|
|
|
|
// CraftBukkit end
|
2023-06-19 00:33:15 +02:00
|
|
|
diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
2024-01-18 22:00:40 +01:00
|
|
|
index 294dd52de7b0b19b19bbef9bb6ec6b5b2845cdeb..ac41dc96a4aee7b0bb71cbf71d3109ff05a66eff 100644
|
2023-06-19 00:33:15 +02:00
|
|
|
--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
|
|
|
+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
2023-12-28 21:47:57 +01:00
|
|
|
@@ -1955,6 +1955,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
|
2023-06-19 00:33:15 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
if (cancelled) {
|
2024-01-15 12:38:39 +01:00
|
|
|
+ this.player.resyncUsingItem(this.player); // Paper - Properly cancel usable items
|
2023-06-19 00:33:15 +02:00
|
|
|
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
|
2024-01-19 12:30:04 +01:00
|
|
|
index 0a274d7ca72c75c9a36e8e688f22097c4abd8ba2..03caab6d49f74402c5c6c932e3a85e72a6edf3bc 100644
|
2023-06-19 00:33:15 +02:00
|
|
|
--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
|
|
|
+++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
2024-01-16 12:41:40 +01:00
|
|
|
@@ -3814,6 +3814,11 @@ public abstract class LivingEntity extends Entity implements Attackable {
|
2023-06-19 00:33:15 +02:00
|
|
|
return ((Byte) this.entityData.get(LivingEntity.DATA_LIVING_ENTITY_FLAGS) & 2) > 0 ? InteractionHand.OFF_HAND : InteractionHand.MAIN_HAND;
|
|
|
|
}
|
|
|
|
|
2024-01-15 12:38:39 +01:00
|
|
|
+ // Paper start - Properly cancel usable items
|
2023-06-19 00:33:15 +02:00
|
|
|
+ public void resyncUsingItem(ServerPlayer serverPlayer) {
|
|
|
|
+ this.getEntityData().resendPossiblyDesyncedDataValues(java.util.List.of(DATA_LIVING_ENTITY_FLAGS), serverPlayer);
|
|
|
|
+ }
|
2024-01-15 12:38:39 +01:00
|
|
|
+ // Paper end - Properly cancel usable items
|
2023-09-24 07:10:40 +02:00
|
|
|
private void updatingUsingItem() {
|
|
|
|
if (this.isUsingItem()) {
|
|
|
|
if (ItemStack.isSameItem(this.getItemInHand(this.getUsedItemHand()), this.useItem)) {
|