mirror of
https://github.com/PaperMC/Paper.git
synced 2024-12-28 15:30:19 +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.
73 lines
3.8 KiB
Diff
73 lines
3.8 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Bjarne Koll <git@lynxplay.dev>
|
|
Date: Mon, 8 Jul 2024 22:01:08 +0200
|
|
Subject: [PATCH] Only call EntityDamageEvents before actuallyHurt
|
|
|
|
The recent upstream update moved around the event logic for
|
|
EntiyDamageEvent and its derivatives.
|
|
However, the event was called on every call to #hurt as it was moved out
|
|
of actuallyHurt.
|
|
|
|
This patch moves the invocation directly before the #actuallyHurt calls,
|
|
respective invulnerable timings.
|
|
|
|
diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
|
index 5616391f02f8599f5786a6d8e740a0ed9290627f..cfef1bff0080ffc662e3a4428116f7d4dc71eab2 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
|
@@ -1489,12 +1489,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
|
|
}
|
|
|
|
// CraftBukkit start
|
|
- EntityDamageEvent event = this.handleEntityDamage(source, amount);
|
|
- amount = 0;
|
|
- amount += (float) event.getDamage(DamageModifier.BASE);
|
|
- amount += (float) event.getDamage(DamageModifier.BLOCKING);
|
|
- amount += (float) event.getDamage(DamageModifier.FREEZING);
|
|
- amount += (float) event.getDamage(DamageModifier.HARD_HAT);
|
|
+ EntityDamageEvent event; // Paper - move this into the actual invuln check....
|
|
// CraftBukkit end
|
|
|
|
this.walkAnimation.setSpeed(1.5F);
|
|
@@ -1509,6 +1504,11 @@ public abstract class LivingEntity extends Entity implements Attackable {
|
|
return false;
|
|
}
|
|
|
|
+ // Paper start - only call damage event when actuallyHurt will be called - move call logic down
|
|
+ event = this.handleEntityDamage(source, amount);
|
|
+ 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)) {
|
|
return false;
|
|
@@ -1518,6 +1518,10 @@ public abstract class LivingEntity extends Entity implements Attackable {
|
|
this.lastHurt = amount;
|
|
flag1 = false;
|
|
} else {
|
|
+ // Paper start - only call damage event when actuallyHurt will be called - move call logic down
|
|
+ event = this.handleEntityDamage(source, amount);
|
|
+ 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(), event)) {
|
|
return false;
|
|
@@ -1653,6 +1657,18 @@ public abstract class LivingEntity extends Entity implements Attackable {
|
|
}
|
|
}
|
|
|
|
+ // Paper start - only call damage event when actuallyHurt will be called - move out amount computation logic
|
|
+ private float computeAmountFromEntityDamageEvent(final EntityDamageEvent event) {
|
|
+ // Taken from hurt()'s craftbukkit diff.
|
|
+ float amount = 0;
|
|
+ amount += (float) event.getDamage(DamageModifier.BASE);
|
|
+ amount += (float) event.getDamage(DamageModifier.BLOCKING);
|
|
+ amount += (float) event.getDamage(DamageModifier.FREEZING);
|
|
+ amount += (float) event.getDamage(DamageModifier.HARD_HAT);
|
|
+ return amount;
|
|
+ }
|
|
+ // Paper end - only call damage event when actuallyHurt will be called - move out amount computation logic
|
|
+
|
|
protected void blockUsingShield(LivingEntity attacker) {
|
|
attacker.blockedByShield(this);
|
|
}
|