From 9300b8714a08a9971b2c96beacab242c3505c9e8 Mon Sep 17 00:00:00 2001 From: Bjarne Koll Date: Mon, 8 Jul 2024 21:20:18 +0200 Subject: [PATCH] Properly apply damage tick after absorption (#11043) The logic in place to prevent players from processing a damage tick/knockback/etc when hit with 0 damage incorrectly used the damage events final damage value, which is reduced by absorption. Instead, use the event's "raw damage", e.g. the amount passed to hurt, in order to determine if the damage tick should be skipped. This still allows plugins to change the damage to a non-zero value and properly damage ticks the player in such a case, but correctly processes the damage tick in cases where the original damage is non zero but the actual damage is. --- ...o-vanilla-handling-of-LivingEntity-actuallyH.patch | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/patches/server/Revert-to-vanilla-handling-of-LivingEntity-actuallyH.patch b/patches/server/Revert-to-vanilla-handling-of-LivingEntity-actuallyH.patch index 2009404712..c3aa0a7162 100644 --- a/patches/server/Revert-to-vanilla-handling-of-LivingEntity-actuallyH.patch +++ b/patches/server/Revert-to-vanilla-handling-of-LivingEntity-actuallyH.patch @@ -9,15 +9,10 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java @@ -0,0 +0,0 @@ public abstract class LivingEntity extends Entity implements Attackable { - } - - // CraftBukkit start -- if (!this.actuallyHurt(source, (float) event.getFinalDamage() - this.lastHurt, event)) { -+ final float actualDamage = (float) event.getFinalDamage() - this.lastHurt; // Paper - revert to vanilla damage - move out for diff on change -+ if (!this.actuallyHurt(source, actualDamage, event)) { // Paper - revert to vanilla damage - move out for diff on change + if (!this.actuallyHurt(source, (float) event.getFinalDamage() - this.lastHurt, event)) { return false; } -+ if (this instanceof ServerPlayer && actualDamage == 0.0F) return false; // Paper - revert to vanilla damage - players are not affected by damage that is 0. ++ if (this instanceof ServerPlayer && event.getDamage() == 0) return false; // Paper - revert to vanilla damage - players are not affected by damage that is 0 - use raw damage here, as it is just the original amount but post plugin changes to it. // CraftBukkit end this.lastHurt = amount; flag1 = false; @@ -25,7 +20,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 if (!this.actuallyHurt(source, (float) event.getFinalDamage(), event)) { return false; } -+ if (this instanceof ServerPlayer && event.getFinalDamage() == 0.0F) return false; // Paper - revert to vanilla damage - players are not affected by damage that is 0. ++ if (this instanceof ServerPlayer && event.getDamage() == 0) return false; // Paper - revert to vanilla damage - players are not affected by damage that is 0 - use raw damage here, as it is just the original amount but post plugin changes to it. this.lastHurt = amount; this.invulnerableTime = this.invulnerableDuration; // CraftBukkit - restore use of maxNoDamageTicks // this.actuallyHurt(damagesource, f);