Correctly shrink items during EntityResurrectEvent (#8780)
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.
2023-01-19 23:09:08 +01:00
|
|
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
|
|
From: Bjarne Koll <lynxplay101@gmail.com>
|
|
|
|
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.
|
|
|
|
|
|
|
|
diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
2024-02-01 10:15:57 +01:00
|
|
|
index d6f12c3e995ff1b1d77538fd77402225c29b1c51..0bb241158cde5c3af1b28065a39c2455ef82eefe 100644
|
Correctly shrink items during EntityResurrectEvent (#8780)
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.
2023-01-19 23:09:08 +01:00
|
|
|
--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
|
|
|
+++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
2024-02-01 10:15:57 +01:00
|
|
|
@@ -1609,7 +1609,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
|
2023-06-08 10:47:19 +02:00
|
|
|
this.level().getCraftServer().getPluginManager().callEvent(event);
|
Correctly shrink items during EntityResurrectEvent (#8780)
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.
2023-01-19 23:09:08 +01:00
|
|
|
|
|
|
|
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) {
|