Merge pull request #3884 from jstnf/acro-fix

Check if a player has Absorption when calculating Acrobatics XP gain
This commit is contained in:
Robert A. C 2019-04-17 15:04:28 -07:00 committed by GitHub
commit 9b08f9bc44
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 23 additions and 5 deletions

View File

@ -77,7 +77,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;
}

View File

@ -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