mirror of
https://github.com/PaperMC/Paper.git
synced 2024-12-23 15:00:30 +01:00
d0dcd7d251
Fixes incorrect spigot handling of the invulnerability damage reduction applied when an already invulnerable entity is damaged with a larger damage amount than the initial damage. Vanilla still damages entities even if invulnerable if the damage to be applied is larger than the previous damage taken. In that case, vanilla applies the difference between the previous damage taken and the proposed damage. Spigot's damage modifier API takes over the computation of damage reducing effects, however spigot invokes this handling with the initial damage before computing the difference to the previous damage amount. This leads to the reduction values to generally be larger than expected, as they are computed on the not-yet-reduced value. Spigot applies these reductions after calling the EntityDamageEvent and *then* subtracts the previous damage point, leading to the final damage amount being smaller than expected. This patch cannot simply call the EntityDamageEvent with the reduced damage, as that would lead to EntityDamageEvent#getDamage() returning the already reduced damage, which breaks its method contract. Instead, this patch makes use of the DamageModifier API, implementing the last-damage-reduction as a DamageModifier.
40 lines
2.2 KiB
Diff
40 lines
2.2 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Bjarne Koll <git@lynxplay.dev>
|
|
Date: Mon, 11 Nov 2024 21:35:22 +0100
|
|
Subject: [PATCH] Fix incorrect invulnerability damage reduction
|
|
|
|
Fixes incorrect spigot handling of the invulnerability damage
|
|
reduction applied when an already invulnerable entity is damaged with a
|
|
larger damage amount than the initial damage.
|
|
Vanilla still damages entities even if invulnerable if the damage to be
|
|
applied is larger than the previous damage taken. In that case, vanilla
|
|
applies the difference between the previous damage taken and the
|
|
proposed damage.
|
|
|
|
Spigot's damage modifier API takes over the computation of damage
|
|
reducing effects, however spigot invokes this handling with the initial
|
|
damage before computing the difference to the previous damage amount.
|
|
This leads to the reduction values to generally be larger than expected,
|
|
as they are computed on the not-yet-reduced value.
|
|
Spigot applies these reductions after calling the EntityDamageEvent and
|
|
*then* subtracts the previous damage point, leading to the final damage
|
|
amount being smaller than expected.
|
|
|
|
This patch cannot simply call the EntityDamageEvent with the reduced
|
|
damage, as that would lead to EntityDamageEvent#getDamage() returning
|
|
the already reduced damage, which breaks its method contract.
|
|
Instead, this patch makes use of the DamageModifier API, implementing
|
|
the last-damage-reduction as a DamageModifier.
|
|
|
|
diff --git a/src/main/java/org/bukkit/event/entity/EntityDamageEvent.java b/src/main/java/org/bukkit/event/entity/EntityDamageEvent.java
|
|
index ef5b2a0f18c1c126db0b0c4a4d2a57483680665a..73aa5dc079ecb1c38c55ae1916b12edf81b723f5 100644
|
|
--- a/src/main/java/org/bukkit/event/entity/EntityDamageEvent.java
|
|
+++ b/src/main/java/org/bukkit/event/entity/EntityDamageEvent.java
|
|
@@ -247,6 +247,7 @@ public class EntityDamageEvent extends EntityEvent implements Cancellable {
|
|
* raw {@link EntityDamageEvent#getDamage()}.
|
|
*/
|
|
BASE,
|
|
+ INVULNERABILITY_REDUCTION, // Paper - fix invulnerability reduction in EntityDamageEvent - needs to be right under BASE as its the first reduction all others are based on
|
|
/**
|
|
* This represents the damage increased by freezing status.
|
|
*/
|