41 Zeilen
2.2 KiB
Diff
41 Zeilen
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 4e6b1c263904c9871b2c15c3c9cbdc4a1fa4a285..d1a5424ff3b289f1c82449ef6d88eb52665df41b 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.
|
|
*/
|