From 3973f9ec4323455cfc6f46a918d288ec6be08ebd Mon Sep 17 00:00:00 2001 From: jstnf Date: Wed, 17 Apr 2019 13:51:42 -0700 Subject: [PATCH] Check if a player has Absorption when calculating Acrobatics XP gain --- .../skills/subskills/acrobatics/Roll.java | 4 +++- .../com/gmail/nossr50/util/EventUtils.java | 24 +++++++++++++++---- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/datatypes/skills/subskills/acrobatics/Roll.java b/src/main/java/com/gmail/nossr50/datatypes/skills/subskills/acrobatics/Roll.java index d889286ed..50471822e 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/skills/subskills/acrobatics/Roll.java +++ b/src/main/java/com/gmail/nossr50/datatypes/skills/subskills/acrobatics/Roll.java @@ -78,7 +78,9 @@ public class Roll extends AcrobaticsSubSkill { if (canRoll(player)) { entityDamageEvent.setDamage(rollCheck(player, mcMMOPlayer, entityDamageEvent.getDamage())); - if (entityDamageEvent.getFinalDamage() == 0) { + //Check getDamage() instead of getFinalDamage() + //Prevent unintended invincibility if Absorption covers all of the damage + if (entityDamageEvent.getDamage() == 0) { entityDamageEvent.setCancelled(true); return true; } diff --git a/src/main/java/com/gmail/nossr50/util/EventUtils.java b/src/main/java/com/gmail/nossr50/util/EventUtils.java index 3f8b5a5a3..a3f76847c 100644 --- a/src/main/java/com/gmail/nossr50/util/EventUtils.java +++ b/src/main/java/com/gmail/nossr50/util/EventUtils.java @@ -43,6 +43,7 @@ import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.player.PlayerFishEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.plugin.PluginManager; +import org.bukkit.potion.PotionEffectType; import java.util.HashMap; import java.util.Map; @@ -85,7 +86,7 @@ public class EventUtils { * * 1) The player is real and not an NPC * 2) The player is not in god mode - * 3) The damage dealt is above 0 + * 3) The damage dealt is above 0 (if a player has Absorption, check if damage and final damage are above 0) * 4) The player is loaded into our mcMMO user profiles * * @param entityDamageEvent @@ -94,12 +95,27 @@ public class EventUtils { public static boolean isRealPlayerDamaged(EntityDamageEvent entityDamageEvent) { //Make sure the damage is above 0 - double damage = entityDamageEvent.getFinalDamage(); + double damage = entityDamageEvent.getDamage(); + double finalDamage = entityDamageEvent.getFinalDamage(); - if (damage <= 0) { - return false; + if (entityDamageEvent.getEntity() instanceof Player) { + Player player = (Player) entityDamageEvent.getEntity(); + + //If a player has Absorption, check both damage and final damage + if (player.hasPotionEffect(PotionEffectType.ABSORPTION)) { + if (damage <= 0 && finalDamage <= 0) { + return false; + } + } + //Otherwise, do original check - only check final damage + else { + if (finalDamage <= 0) { + return false; + } + } } + Entity entity = entityDamageEvent.getEntity(); //Check to make sure the entity is not an NPC