summaryrefslogtreecommitdiffhomepage
path: root/patches
diff options
context:
space:
mode:
authorBjarne Koll <[email protected]>2024-11-19 11:54:58 +0100
committerGitHub <[email protected]>2024-11-19 11:54:58 +0100
commitd0dcd7d2511e60f08ba7de6a5b67124febfe84d0 (patch)
tree9cf6c44653b13a0b5081338944181ee5b48ba2db /patches
parent57eab3e3122fbbb4ce6d31880a35cb64ef4281f5 (diff)
downloadPaper-d0dcd7d2511e60f08ba7de6a5b67124febfe84d0.tar.gz
Paper-d0dcd7d2511e60f08ba7de6a5b67124febfe84d0.zip
Fix incorrect invulnerability damage reduction (#11599)
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.
Diffstat (limited to 'patches')
-rw-r--r--patches/api/0112-Expand-Explosions-API.patch2
-rw-r--r--patches/api/0472-Introduce-registry-entry-and-builders.patch2
-rw-r--r--patches/api/0497-Fix-incorrect-invulnerability-damage-reduction.patch40
-rw-r--r--patches/server/0202-Expand-Explosions-API.patch2
-rw-r--r--patches/server/0607-Fix-setPatternColor-on-tropical-fish-bucket-meta.patch2
-rw-r--r--patches/server/0781-Correctly-shrink-items-during-EntityResurrectEvent.patch2
-rw-r--r--patches/server/0835-Only-erase-allay-memory-on-non-item-targets.patch2
-rw-r--r--patches/server/0965-Adopt-MaterialRerouting.patch2
-rw-r--r--patches/server/0969-Configurable-damage-tick-when-blocking-with-shield.patch2
-rw-r--r--patches/server/0985-Remove-streams-from-hot-code.patch2
-rw-r--r--patches/server/0993-Add-registry-entry-and-builders.patch2
-rw-r--r--patches/server/1000-Only-call-EntityDamageEvents-before-actuallyHurt.patch2
-rw-r--r--patches/server/1023-Remove-wall-time-unused-skip-tick-protection.patch2
-rw-r--r--patches/server/1059-Correct-update-cursor.patch2
-rw-r--r--patches/server/1066-Fix-incorrect-invulnerability-damage-reduction.patch115
15 files changed, 168 insertions, 13 deletions
diff --git a/patches/api/0112-Expand-Explosions-API.patch b/patches/api/0112-Expand-Explosions-API.patch
index 42f8422bee..bc6d875f8f 100644
--- a/patches/api/0112-Expand-Explosions-API.patch
+++ b/patches/api/0112-Expand-Explosions-API.patch
@@ -6,7 +6,7 @@ Subject: [PATCH] Expand Explosions API
Add Entity as a Source capability, and add more API choices, and on Location.
Co-authored-by: Esoteric Enderman <[email protected]>
-Co-authored-by: Bjarne Koll <[email protected]>
+Co-authored-by: Bjarne Koll <[email protected]>
diff --git a/src/main/java/org/bukkit/Location.java b/src/main/java/org/bukkit/Location.java
index df88bc77a3fa2506adf17eddc6300ac65774df6f..fe2e0939df61b1f59d12adf3f760f1d619bb3de3 100644
diff --git a/patches/api/0472-Introduce-registry-entry-and-builders.patch b/patches/api/0472-Introduce-registry-entry-and-builders.patch
index 56e6efc80a..0a25fd735e 100644
--- a/patches/api/0472-Introduce-registry-entry-and-builders.patch
+++ b/patches/api/0472-Introduce-registry-entry-and-builders.patch
@@ -1,5 +1,5 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Bjarne Koll <[email protected]>
+From: Bjarne Koll <[email protected]>
Date: Thu, 13 Jun 2024 22:35:05 +0200
Subject: [PATCH] Introduce registry entry and builders
diff --git a/patches/api/0497-Fix-incorrect-invulnerability-damage-reduction.patch b/patches/api/0497-Fix-incorrect-invulnerability-damage-reduction.patch
new file mode 100644
index 0000000000..63a5ca94e0
--- /dev/null
+++ b/patches/api/0497-Fix-incorrect-invulnerability-damage-reduction.patch
@@ -0,0 +1,40 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Bjarne Koll <[email protected]>
+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.
+ */
diff --git a/patches/server/0202-Expand-Explosions-API.patch b/patches/server/0202-Expand-Explosions-API.patch
index 1dd84c44a5..7bf62df21c 100644
--- a/patches/server/0202-Expand-Explosions-API.patch
+++ b/patches/server/0202-Expand-Explosions-API.patch
@@ -6,7 +6,7 @@ Subject: [PATCH] Expand Explosions API
Add Entity as a Source capability, and add more API choices, and on Location.
Co-authored-by: Esoteric Enderman <[email protected]>
-Co-authored-by: Bjarne Koll <[email protected]>
+Co-authored-by: Bjarne Koll <[email protected]>
diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
index 03161ef12960cab3b9c81c190dd808a9c5c476e1..f0fc08bcc2988277b6a5e3107e6fc5c89bb67b93 100644
diff --git a/patches/server/0607-Fix-setPatternColor-on-tropical-fish-bucket-meta.patch b/patches/server/0607-Fix-setPatternColor-on-tropical-fish-bucket-meta.patch
index c313451894..f5c3a81df3 100644
--- a/patches/server/0607-Fix-setPatternColor-on-tropical-fish-bucket-meta.patch
+++ b/patches/server/0607-Fix-setPatternColor-on-tropical-fish-bucket-meta.patch
@@ -1,5 +1,5 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Bjarne Koll <[email protected]>
+From: Bjarne Koll <[email protected]>
Date: Sat, 6 Nov 2021 23:15:20 +0100
Subject: [PATCH] Fix setPatternColor on tropical fish bucket meta
diff --git a/patches/server/0781-Correctly-shrink-items-during-EntityResurrectEvent.patch b/patches/server/0781-Correctly-shrink-items-during-EntityResurrectEvent.patch
index 58fdf1c475..d2f07ac306 100644
--- a/patches/server/0781-Correctly-shrink-items-during-EntityResurrectEvent.patch
+++ b/patches/server/0781-Correctly-shrink-items-during-EntityResurrectEvent.patch
@@ -1,5 +1,5 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Bjarne Koll <[email protected]>
+From: Bjarne Koll <[email protected]>
Date: Tue, 10 Jan 2023 21:06:42 +0100
Subject: [PATCH] Correctly shrink items during EntityResurrectEvent
diff --git a/patches/server/0835-Only-erase-allay-memory-on-non-item-targets.patch b/patches/server/0835-Only-erase-allay-memory-on-non-item-targets.patch
index b26cfd040b..581af491b6 100644
--- a/patches/server/0835-Only-erase-allay-memory-on-non-item-targets.patch
+++ b/patches/server/0835-Only-erase-allay-memory-on-non-item-targets.patch
@@ -1,5 +1,5 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Bjarne Koll <[email protected]>
+From: Bjarne Koll <[email protected]>
Date: Fri, 4 Aug 2023 15:53:36 +0200
Subject: [PATCH] Only erase allay memory on non-item targets
diff --git a/patches/server/0965-Adopt-MaterialRerouting.patch b/patches/server/0965-Adopt-MaterialRerouting.patch
index 648057e1dd..e66973fb9d 100644
--- a/patches/server/0965-Adopt-MaterialRerouting.patch
+++ b/patches/server/0965-Adopt-MaterialRerouting.patch
@@ -1,5 +1,5 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Bjarne Koll <[email protected]>
+From: Bjarne Koll <[email protected]>
Date: Thu, 13 Jun 2024 11:02:36 +0200
Subject: [PATCH] Adopt MaterialRerouting
diff --git a/patches/server/0969-Configurable-damage-tick-when-blocking-with-shield.patch b/patches/server/0969-Configurable-damage-tick-when-blocking-with-shield.patch
index 7946c9fb9e..0c5196e832 100644
--- a/patches/server/0969-Configurable-damage-tick-when-blocking-with-shield.patch
+++ b/patches/server/0969-Configurable-damage-tick-when-blocking-with-shield.patch
@@ -1,5 +1,5 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Bjarne Koll <[email protected]>
+From: Bjarne Koll <[email protected]>
Date: Thu, 13 Jun 2024 17:16:01 +0200
Subject: [PATCH] Configurable damage tick when blocking with shield
diff --git a/patches/server/0985-Remove-streams-from-hot-code.patch b/patches/server/0985-Remove-streams-from-hot-code.patch
index bab16c74ad..f1585163e2 100644
--- a/patches/server/0985-Remove-streams-from-hot-code.patch
+++ b/patches/server/0985-Remove-streams-from-hot-code.patch
@@ -5,7 +5,7 @@ Subject: [PATCH] Remove streams from hot code
Feature patch
-Co-authored-by: Bjarne Koll <[email protected]>
+Co-authored-by: Bjarne Koll <[email protected]>
Co-authored-by: Spottedleaf <[email protected]>
diff --git a/src/main/java/net/minecraft/world/entity/ai/behavior/GateBehavior.java b/src/main/java/net/minecraft/world/entity/ai/behavior/GateBehavior.java
diff --git a/patches/server/0993-Add-registry-entry-and-builders.patch b/patches/server/0993-Add-registry-entry-and-builders.patch
index be3eccb69a..37f4a6a8c0 100644
--- a/patches/server/0993-Add-registry-entry-and-builders.patch
+++ b/patches/server/0993-Add-registry-entry-and-builders.patch
@@ -1,5 +1,5 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Bjarne Koll <[email protected]>
+From: Bjarne Koll <[email protected]>
Date: Thu, 13 Jun 2024 23:45:32 +0200
Subject: [PATCH] Add registry entry and builders
diff --git a/patches/server/1000-Only-call-EntityDamageEvents-before-actuallyHurt.patch b/patches/server/1000-Only-call-EntityDamageEvents-before-actuallyHurt.patch
index 80cac108bc..b607b89045 100644
--- a/patches/server/1000-Only-call-EntityDamageEvents-before-actuallyHurt.patch
+++ b/patches/server/1000-Only-call-EntityDamageEvents-before-actuallyHurt.patch
@@ -1,5 +1,5 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Bjarne Koll <[email protected]>
+From: Bjarne Koll <[email protected]>
Date: Mon, 8 Jul 2024 22:01:08 +0200
Subject: [PATCH] Only call EntityDamageEvents before actuallyHurt
diff --git a/patches/server/1023-Remove-wall-time-unused-skip-tick-protection.patch b/patches/server/1023-Remove-wall-time-unused-skip-tick-protection.patch
index deaf422ec7..c25e6680dc 100644
--- a/patches/server/1023-Remove-wall-time-unused-skip-tick-protection.patch
+++ b/patches/server/1023-Remove-wall-time-unused-skip-tick-protection.patch
@@ -1,5 +1,5 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Bjarne Koll <[email protected]>
+From: Bjarne Koll <[email protected]>
Date: Mon, 16 Sep 2024 23:07:29 +0200
Subject: [PATCH] Remove wall-time / unused skip tick protection
diff --git a/patches/server/1059-Correct-update-cursor.patch b/patches/server/1059-Correct-update-cursor.patch
index 9d4e655ebb..77c0c52550 100644
--- a/patches/server/1059-Correct-update-cursor.patch
+++ b/patches/server/1059-Correct-update-cursor.patch
@@ -1,5 +1,5 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Bjarne Koll <[email protected]>
+From: Bjarne Koll <[email protected]>
Date: Fri, 1 Nov 2024 14:58:57 +0100
Subject: [PATCH] Correct update cursor
diff --git a/patches/server/1066-Fix-incorrect-invulnerability-damage-reduction.patch b/patches/server/1066-Fix-incorrect-invulnerability-damage-reduction.patch
new file mode 100644
index 0000000000..3b3dd3d144
--- /dev/null
+++ b/patches/server/1066-Fix-incorrect-invulnerability-damage-reduction.patch
@@ -0,0 +1,115 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Bjarne Koll <[email protected]>
+Date: Mon, 11 Nov 2024 21:35:27 +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/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java
+index 6a3a8f0466998409a01223bc0c16d92b96e50118..51f913a495e7fda7e0e72439c6d7cc9607bd4af8 100644
+--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
++++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
+@@ -1505,12 +1505,12 @@ public abstract class LivingEntity extends Entity implements Attackable {
+ }
+
+ // Paper start - only call damage event when actuallyHurt will be called - move call logic down
+- event = this.handleEntityDamage(source, amount);
++ event = this.handleEntityDamage(source, amount, this.lastHurt); // Paper - fix invulnerability reduction in EntityDamageEvent - pass lastDamage reduction
+ amount = computeAmountFromEntityDamageEvent(event);
+ // Paper end - only call damage event when actuallyHurt will be called - move call logic down
+
+ // CraftBukkit start
+- if (!this.actuallyHurt(world, source, (float) event.getFinalDamage() - this.lastHurt, event)) {
++ if (!this.actuallyHurt(world, source, (float) event.getFinalDamage(), event)) { // Paper - fix invulnerability reduction in EntityDamageEvent - no longer subtract lastHurt, that is part of the damage event calc now
+ return false;
+ }
+ if (this instanceof ServerPlayer && event.getDamage() == 0 && originalAmount == 0) return false; // Paper - revert to vanilla damage - players are not affected by damage that is 0 - skip damage if the vanilla damage is 0 and was not modified by plugins in the event.
+@@ -1519,7 +1519,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
+ flag1 = false;
+ } else {
+ // Paper start - only call damage event when actuallyHurt will be called - move call logic down
+- event = this.handleEntityDamage(source, amount);
++ event = this.handleEntityDamage(source, amount, 0); // Paper - fix invulnerability reduction in EntityDamageEvent - pass lastDamage reduction (none in this branch)
+ amount = computeAmountFromEntityDamageEvent(event);
+ // Paper end - only call damage event when actuallyHurt will be called - move call logic down
+ // CraftBukkit start
+@@ -2322,8 +2322,19 @@ public abstract class LivingEntity extends Entity implements Attackable {
+ }
+
+ // CraftBukkit start
+- private EntityDamageEvent handleEntityDamage(final DamageSource damagesource, float f) {
++ private EntityDamageEvent handleEntityDamage(final DamageSource damagesource, float f, final float invulnerabilityRelatedLastDamage) { // Paper - fix invulnerability reduction in EntityDamageEvent
+ float originalDamage = f;
++ // Paper start - fix invulnerability reduction in EntityDamageEvent
++ final com.google.common.base.Function<Double, Double> invulnerabilityReductionEquation = d -> {
++ if (invulnerabilityRelatedLastDamage == 0) return 0D; // no last damage, no reduction
++ // last damage existed, this means the reduction *technically* is (new damage - last damage).
++ // If the event damage was changed to something less than invul damage, hard lock it at 0.
++ if (d < invulnerabilityRelatedLastDamage) return 0D;
++ return (double) -invulnerabilityRelatedLastDamage;
++ };
++ final float originalInvulnerabilityReduction = invulnerabilityReductionEquation.apply((double) f).floatValue();
++ f += originalInvulnerabilityReduction;
++ // Paper end - fix invulnerability reduction in EntityDamageEvent
+
+ com.google.common.base.Function<Double, Double> freezing = new com.google.common.base.Function<Double, Double>() {
+ @Override
+@@ -2400,7 +2411,12 @@ public abstract class LivingEntity extends Entity implements Attackable {
+ };
+ float absorptionModifier = absorption.apply((double) f).floatValue();
+
+- return CraftEventFactory.handleLivingEntityDamageEvent(this, damagesource, originalDamage, freezingModifier, hardHatModifier, blockingModifier, armorModifier, resistanceModifier, magicModifier, absorptionModifier, freezing, hardHat, blocking, armor, resistance, magic, absorption);
++ // Paper start - fix invulnerability reduction in EntityDamageEvent
++ return CraftEventFactory.handleLivingEntityDamageEvent(this, damagesource, originalDamage, freezingModifier, hardHatModifier, blockingModifier, armorModifier, resistanceModifier, magicModifier, absorptionModifier, freezing, hardHat, blocking, armor, resistance, magic, absorption, (damageModifierDoubleMap, damageModifierFunctionMap) -> {
++ damageModifierFunctionMap.put(DamageModifier.INVULNERABILITY_REDUCTION, invulnerabilityReductionEquation);
++ damageModifierDoubleMap.put(DamageModifier.INVULNERABILITY_REDUCTION, (double) originalInvulnerabilityReduction);
++ });
++ // Paper end - fix invulnerability reduction in EntityDamageEvent
+ }
+
+ protected boolean actuallyHurt(ServerLevel worldserver, final DamageSource damagesource, float f, final EntityDamageEvent event) { // void -> boolean, add final
+diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
+index deba03eb37012c638e08e20cd1c98e9db190c790..e37aaf77f94b97b736cc20ef070cefdff0400188 100644
+--- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
++++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
+@@ -1218,6 +1218,11 @@ public class CraftEventFactory {
+ private static final Function<? super Double, Double> ZERO = Functions.constant(-0.0);
+
+ public static EntityDamageEvent handleLivingEntityDamageEvent(Entity damagee, DamageSource source, double rawDamage, double freezingModifier, double hardHatModifier, double blockingModifier, double armorModifier, double resistanceModifier, double magicModifier, double absorptionModifier, Function<Double, Double> freezing, Function<Double, Double> hardHat, Function<Double, Double> blocking, Function<Double, Double> armor, Function<Double, Double> resistance, Function<Double, Double> magic, Function<Double, Double> absorption) {
++ // Paper start - fix invulnerability reduction in EntityDamageEvent
++ return handleLivingEntityDamageEvent(damagee, source, rawDamage, freezingModifier, hardHatModifier, blockingModifier, armorModifier, resistanceModifier, magicModifier, absorptionModifier, freezing, hardHat, blocking, armor, resistance, magic, absorption, null);
++ }
++ public static EntityDamageEvent handleLivingEntityDamageEvent(Entity damagee, DamageSource source, double rawDamage, double freezingModifier, double hardHatModifier, double blockingModifier, double armorModifier, double resistanceModifier, double magicModifier, double absorptionModifier, Function<Double, Double> freezing, Function<Double, Double> hardHat, Function<Double, Double> blocking, Function<Double, Double> armor, Function<Double, Double> resistance, Function<Double, Double> magic, Function<Double, Double> absorption, java.util.function.BiConsumer<Map<DamageModifier, Double>, Map<DamageModifier, Function<? super Double, Double>>> callback) {
++ // Paper end - fix invulnerability reduction in EntityDamageEvent
+ Map<DamageModifier, Double> modifiers = new EnumMap<>(DamageModifier.class);
+ Map<DamageModifier, Function<? super Double, Double>> modifierFunctions = new EnumMap<>(DamageModifier.class);
+ modifiers.put(DamageModifier.BASE, rawDamage);
+@@ -1242,6 +1247,7 @@ public class CraftEventFactory {
+ modifierFunctions.put(DamageModifier.MAGIC, magic);
+ modifiers.put(DamageModifier.ABSORPTION, absorptionModifier);
+ modifierFunctions.put(DamageModifier.ABSORPTION, absorption);
++ if (callback != null) callback.accept(modifiers, modifierFunctions); // Paper - fix invulnerability reduction in EntityDamageEvent
+ return CraftEventFactory.handleEntityDamageEvent(damagee, source, modifiers, modifierFunctions);
+ }
+