Revert Bukkit damage API changes

This commit is contained in:
Aikar 2014-07-08 19:31:32 -05:00 committed by Zach Brown
parent cfd51ccfb9
commit 0e9f7b049f
2 changed files with 59 additions and 24 deletions

View file

@ -1,24 +0,0 @@
From 990816b6568d211f62cdd1b7538f52c1c096c1d4 Mon Sep 17 00:00:00 2001
From: Aikar <aikar@aikar.co>
Date: Mon, 7 Jul 2014 23:26:59 -0400
Subject: [PATCH] Fix damage bug - Fixes BUKKIT-5678
If a plugin lowers the damage in EntityDamageEvent while also having damage reduction modifiers,
the entity will in turn be able to receive absorption buff on every hit, making them invincible.
diff --git a/src/main/java/org/bukkit/event/entity/EntityDamageEvent.java b/src/main/java/org/bukkit/event/entity/EntityDamageEvent.java
index 17d9548..a4b9eb2 100644
--- a/src/main/java/org/bukkit/event/entity/EntityDamageEvent.java
+++ b/src/main/java/org/bukkit/event/entity/EntityDamageEvent.java
@@ -135,7 +135,7 @@ public class EntityDamageEvent extends EntityEvent implements Cancellable {
for (DamageModifier modifier : MODIFIERS) {
damage += getDamage(modifier);
}
- return damage;
+ return Math.max(damage, 0); // Spigot
}
/**
--
1.9.1

View file

@ -0,0 +1,59 @@
From 087bba2d9d05ddab50ca8b320d726dbe2d55e14d Mon Sep 17 00:00:00 2001
From: Aikar <aikar@aikar.co>
Date: Tue, 8 Jul 2014 19:21:28 -0400
Subject: [PATCH] Revert Bukkit Damage API Behavior
This API is extremely broken and even updated plugins can not adequately restore their intended behavior with the existing API.
Until Bukkit comes up with an adequate solution, lets revert the change in behavior.
New plugins using the API will not error but will also not behave as intended, but there are likely no plugins using this new API.
diff --git a/src/main/java/net/minecraft/server/EntityLiving.java b/src/main/java/net/minecraft/server/EntityLiving.java
index 6b4cd2c..f445d7e 100644
--- a/src/main/java/net/minecraft/server/EntityLiving.java
+++ b/src/main/java/net/minecraft/server/EntityLiving.java
@@ -967,6 +967,16 @@ public abstract class EntityLiving extends Entity {
// CraftBukkit start
protected boolean d(DamageSource damagesource, float f) { // void -> boolean
if (!this.isInvulnerable()) {
+ // PaperSpigot start - moved up from below to bring back old behavior.
+ EntityDamageEvent event = CraftEventFactory.handleLivingEntityDamageEvent(this, damagesource, f, 0, 0, 0, 0, 0, 0);
+
+ if (event.isCancelled()) {
+ return false;
+ }
+
+ f = (float) event.getDamage();
+ // PaperSpigot end
+
boolean human = this instanceof EntityHuman;
float originalDamage = f;
float preDamage = f;
@@ -1006,13 +1016,18 @@ public abstract class EntityLiving extends Entity {
f = Math.max(f - this.br(), 0.0F);
float absorptionModifier = Math.max(f1 - f, 0.0F);
- EntityDamageEvent event = CraftEventFactory.handleLivingEntityDamageEvent(this, damagesource, originalDamage, -hardHatModifier, -blockingModifier, -armorModifier, -resistanceModifier, -magicModifier, -absorptionModifier);
-
- if (event.isCancelled()) {
- return false;
+ // PaperSpigot start - Moved event call up
+ event.setDamage(DamageModifier.ARMOR, -armorModifier);
+ if (damagesource == DamageSource.FALLING_BLOCK || damagesource == DamageSource.ANVIL) {
+ event.setDamage(DamageModifier.HARD_HAT, -hardHatModifier);
}
-
- f = (float) event.getFinalDamage();
+ if (human) {
+ event.setDamage(DamageModifier.BLOCKING, -blockingModifier);
+ }
+ event.setDamage(DamageModifier.RESISTANCE, -resistanceModifier);
+ event.setDamage(DamageModifier.MAGIC, -magicModifier);
+ event.setDamage(DamageModifier.ABSORPTION, -absorptionModifier);
+ // PaperSpigot end
// Apply damage to helmet
if ((damagesource == DamageSource.ANVIL || damagesource == DamageSource.FALLING_BLOCK) && this.getEquipment(4) != null) {
--
1.9.1