mirror of
https://github.com/PaperMC/Paper.git
synced 2024-12-23 15:00:30 +01:00
41 lines
2.2 KiB
Diff
41 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.
|
||
|
*/
|