From d648e7565385e0b7abeefc3a1a6452c32c87e089 Mon Sep 17 00:00:00 2001 From: Bjarne Koll Date: Tue, 10 Jan 2023 21:06:42 +0100 Subject: [PATCH] Correctly shrink items during EntityResurrectEvent The EntityResurrectEvent logic is supposed to locate a totem of undying in any of the interaction slots of the player inventory and then, if the called EntityResurrectEvent is not cancelled, shrink that item by 1, usually reducing it to zero. For this, the logic iterates over the items in the interaction slots and breaks out the loop if a totem of undying was found. However, even if no totem of undying was found, the iteration item stack variable remains as a refernce to the last interaction slot probed. Plugins uncancelling a EntityResurrectEvent, which is published pre-cancelled to listeners if no totem of undying could be found, would hence cause the server logic to shrink completely unrelated items found in, at the writing of this patch, the players off hand slot. This patch corrects this behaviour by only shrinking the item if a totem of undying was found and the event was called uncancelled. --- .../sources/net/minecraft/world/entity/LivingEntity.java.patch | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/paper-server/patches/sources/net/minecraft/world/entity/LivingEntity.java.patch b/paper-server/patches/sources/net/minecraft/world/entity/LivingEntity.java.patch index c70d0f009b..8cb7a503ab 100644 --- a/paper-server/patches/sources/net/minecraft/world/entity/LivingEntity.java.patch +++ b/paper-server/patches/sources/net/minecraft/world/entity/LivingEntity.java.patch @@ -771,7 +771,7 @@ + this.level().getCraftServer().getPluginManager().callEvent(event); + + if (!event.isCancelled()) { -+ if (!itemstack1.isEmpty()) { ++ if (!itemstack1.isEmpty() && itemstack != null) { // Paper - only reduce item if actual totem was found + itemstack1.shrink(1); + } + if (itemstack != null && this instanceof ServerPlayer) {