diff --git a/src/main/java/com/gmail/nossr50/events/skills/acrobatics/McMMOPlayerDodgeEvent.java b/src/main/java/com/gmail/nossr50/events/skills/acrobatics/McMMOPlayerDodgeEvent.java index 6cebc2059..3cc1b3c7e 100644 --- a/src/main/java/com/gmail/nossr50/events/skills/acrobatics/McMMOPlayerDodgeEvent.java +++ b/src/main/java/com/gmail/nossr50/events/skills/acrobatics/McMMOPlayerDodgeEvent.java @@ -5,13 +5,11 @@ import org.bukkit.entity.Player; public class McMMOPlayerDodgeEvent extends McMMOPlayerAcrobaticsEvent { private double damageTaken; private float xpGained; - private boolean useParticles; public McMMOPlayerDodgeEvent(Player player, double damageTaken, float xpGained) { super(player); this.damageTaken = damageTaken; this.xpGained = xpGained; - useParticles = true; } public double getDamageTaken() { @@ -29,12 +27,4 @@ public class McMMOPlayerDodgeEvent extends McMMOPlayerAcrobaticsEvent { public void setXpGained(float xpGained) { this.xpGained = xpGained; } - - public boolean shouldUseParticles() { - return useParticles; - } - - public void setUseParticles(boolean useParticles) { - this.useParticles = useParticles; - } } diff --git a/src/main/java/com/gmail/nossr50/events/skills/acrobatics/McMMOPlayerRollEvent.java b/src/main/java/com/gmail/nossr50/events/skills/acrobatics/McMMOPlayerRollEvent.java new file mode 100644 index 000000000..a12341dee --- /dev/null +++ b/src/main/java/com/gmail/nossr50/events/skills/acrobatics/McMMOPlayerRollEvent.java @@ -0,0 +1,36 @@ +package com.gmail.nossr50.events.skills.acrobatics; + +import org.bukkit.entity.Player; + +public class McMMOPlayerRollEvent extends McMMOPlayerAcrobaticsEvent { + private double damageTaken; + private float xpGained; + private boolean graceful; + + public McMMOPlayerRollEvent(Player player, double damageTaken, float xpGained, boolean graceful) { + super(player); + this.damageTaken = damageTaken; + this.xpGained = xpGained; + this.graceful = graceful; + } + + public double getDamageTaken() { + return damageTaken; + } + + public void setDamageTaken(double damageTaken) { + this.damageTaken = damageTaken; + } + + public float getXpGained() { + return xpGained; + } + + public void setXpGained(float xpGained) { + this.xpGained = xpGained; + } + + public boolean isGraceful() { + return graceful; + } +} diff --git a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java index 3531ab680..bd3c96dec 100644 --- a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java @@ -40,7 +40,6 @@ import com.gmail.nossr50.events.fake.FakeEntityDamageByEntityEvent; import com.gmail.nossr50.events.fake.FakeEntityDamageEvent; import com.gmail.nossr50.party.PartyManager; import com.gmail.nossr50.runnables.skills.BleedTimerTask; -import com.gmail.nossr50.skills.acrobatics.AcrobaticsManager; import com.gmail.nossr50.skills.archery.Archery; import com.gmail.nossr50.skills.fishing.Fishing; import com.gmail.nossr50.skills.herbalism.Herbalism; @@ -236,16 +235,8 @@ public class EntityListener implements Listener { return; } - AcrobaticsManager acrobaticsManager = mcMMOPlayer.getAcrobaticsManager(); - - if (acrobaticsManager.canRoll()) { - event.setDamage(acrobaticsManager.rollCheck(event.getDamage())); - - if (event.getDamage() == 0) { - event.setCancelled(true); - return; - } - } + event.setDamage(mcMMOPlayer.getAcrobaticsManager().roll(event.getDamage())); + event.setCancelled(event.getDamage() == 0); break; case BLOCK_EXPLOSION: diff --git a/src/main/java/com/gmail/nossr50/skills/acrobatics/Acrobatics.java b/src/main/java/com/gmail/nossr50/skills/acrobatics/Acrobatics.java index 36d5c9486..e982de7aa 100644 --- a/src/main/java/com/gmail/nossr50/skills/acrobatics/Acrobatics.java +++ b/src/main/java/com/gmail/nossr50/skills/acrobatics/Acrobatics.java @@ -27,11 +27,11 @@ public final class Acrobatics { private Acrobatics() {}; - protected static double calculateModifiedDodgeDamage(double damage, double damageModifier) { - return Math.max(damage / damageModifier, 1.0); + protected static double calculateModifiedDodgeDamage(double damage) { + return Math.max(damage / dodgeDamageModifier, 1.0); } - protected static double calculateModifiedRollDamage(double damage, double damageThreshold) { - return Math.max(damage - damageThreshold, 0.0); + protected static double calculateModifiedRollDamage(double damage, boolean isGraceful) { + return Math.max(damage - (isGraceful ? gracefulRollThreshold : rollThreshold), 0.0); } } diff --git a/src/main/java/com/gmail/nossr50/skills/acrobatics/AcrobaticsManager.java b/src/main/java/com/gmail/nossr50/skills/acrobatics/AcrobaticsManager.java index e36a82105..2fa49d1d2 100644 --- a/src/main/java/com/gmail/nossr50/skills/acrobatics/AcrobaticsManager.java +++ b/src/main/java/com/gmail/nossr50/skills/acrobatics/AcrobaticsManager.java @@ -13,6 +13,7 @@ import com.gmail.nossr50.config.Config; import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.datatypes.skills.SkillType; import com.gmail.nossr50.events.skills.acrobatics.McMMOPlayerDodgeEvent; +import com.gmail.nossr50.events.skills.acrobatics.McMMOPlayerRollEvent; import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.skills.SkillManager; import com.gmail.nossr50.util.Misc; @@ -42,47 +43,28 @@ public class AcrobaticsManager extends SkillManager { * @param damage The amount of damage initially dealt by the event * @return the modified event damage if the ability was successful, the original event damage otherwise */ - public double rollCheck(double damage) { + public double roll(double damage) { + if (!canRoll()) { + return damage; + } + Player player = getPlayer(); + boolean isGraceful = player.isSneaking() && Permissions.gracefulRoll(player); + double modifiedDamage = Acrobatics.calculateModifiedRollDamage(damage, isGraceful); - if (player.isSneaking() && Permissions.gracefulRoll(player)) { - return gracefulRollCheck(damage); - } + if (!isFatal(modifiedDamage) && isSuccessfulRoll(isGraceful)) { + McMMOPlayerRollEvent event = new McMMOPlayerRollEvent(player, modifiedDamage, calculateRollXP(damage, true), isGraceful); + mcMMO.p.getServer().getPluginManager().callEvent(event); - double modifiedDamage = Acrobatics.calculateModifiedRollDamage(damage, Acrobatics.rollThreshold); + if (event.isCancelled()) { + return damage; + } - if (!isFatal(modifiedDamage) && isSuccessfulRoll(Acrobatics.rollMaxChance, Acrobatics.rollMaxBonusLevel)) { - player.sendMessage(LocaleLoader.getString("Acrobatics.Roll.Text")); - applyXpGain(calculateRollXP(damage, true)); - - return modifiedDamage; - } - else if (!isFatal(damage)) { - applyXpGain(calculateRollXP(damage, false)); - } - - lastFallLocation = player.getLocation(); - - return damage; - } - - /** - * Handle the damage reduction and XP gain from the Graceful Roll ability - * - * @param damage The amount of damage initially dealt by the event - * @return the modified event damage if the ability was successful, the original event damage otherwise - */ - private double gracefulRollCheck(double damage) { - double modifiedDamage = Acrobatics.calculateModifiedRollDamage(damage, Acrobatics.gracefulRollThreshold); - - if (!isFatal(modifiedDamage) && isSuccessfulRoll(Acrobatics.gracefulRollMaxChance, Acrobatics.gracefulRollMaxBonusLevel)) { - getPlayer().sendMessage(LocaleLoader.getString("Acrobatics.Ability.Proc")); - applyXpGain(calculateRollXP(damage, true)); - - return modifiedDamage; + return event.getDamageTaken(); } else if (!isFatal(damage)) { applyXpGain(calculateRollXP(damage, false)); + lastFallLocation = player.getLocation(); } return damage; @@ -115,25 +97,6 @@ public class AcrobaticsManager extends SkillManager { return fallTries > Config.getInstance().getAcrobaticsAFKMaxTries(); } - private boolean isSuccessfulRoll(double maxChance, int maxLevel) { - return (maxChance / maxLevel) * Math.min(getSkillLevel(), maxLevel) > Misc.getRandom().nextInt(activationChance); - } - - private boolean isFatal(double damage) { - return getPlayer().getHealth() - damage < 1; - } - - private float calculateRollXP(double damage, boolean isRoll) { - ItemStack boots = getPlayer().getInventory().getBoots(); - float xp = (float) (damage * (isRoll ? Acrobatics.rollXpModifier : Acrobatics.fallXpModifier)); - - if (boots != null && boots.containsEnchantment(Enchantment.PROTECTION_FALL)) { - xp *= Acrobatics.featherFallXPModifier; - } - - return xp; - } - /** * Handle the damage reduction and XP gain from the Dodge ability * @@ -142,7 +105,7 @@ public class AcrobaticsManager extends SkillManager { * @return the modified event damage if the ability was successful, the original event damage otherwise */ public double dodge(Entity damager, double damage) { - double modifiedDamage = Acrobatics.calculateModifiedDodgeDamage(damage, Acrobatics.dodgeDamageModifier); + double modifiedDamage = Acrobatics.calculateModifiedDodgeDamage(damage); if (!canDodge(damager, modifiedDamage)) { return damage; @@ -157,20 +120,38 @@ public class AcrobaticsManager extends SkillManager { return damage; } - if (event.shouldUseParticles()) { - ParticleEffectUtils.playDodgeEffect(player); - } + ParticleEffectUtils.playDodgeEffect(player); if (mcMMOPlayer.useChatNotifications()) { player.sendMessage(LocaleLoader.getString("Acrobatics.Combat.Proc")); } - // Why do we check respawn cooldown here? - // No, seriously, why? if (SkillUtils.cooldownExpired(mcMMOPlayer.getRespawnATS(), Misc.PLAYER_RESPAWN_COOLDOWN_SECONDS)) { applyXpGain(event.getXpGained()); } return event.getDamageTaken(); } + + private boolean isSuccessfulRoll(boolean isGraceful) { + double maxChance = isGraceful ? Acrobatics.gracefulRollMaxChance : Acrobatics.rollMaxChance; + int maxLevel = isGraceful ? Acrobatics.gracefulRollMaxBonusLevel : Acrobatics.rollMaxBonusLevel; + + return (maxChance / maxLevel) * Math.min(getSkillLevel(), maxLevel) > Misc.getRandom().nextInt(activationChance); + } + + private float calculateRollXP(double damage, boolean isRoll) { + ItemStack boots = getPlayer().getInventory().getBoots(); + float xp = (float) (damage * (isRoll ? Acrobatics.rollXpModifier : Acrobatics.fallXpModifier)); + + if (boots != null && boots.containsEnchantment(Enchantment.PROTECTION_FALL)) { + xp *= Acrobatics.featherFallXPModifier; + } + + return xp; + } + + private boolean isFatal(double damage) { + return getPlayer().getHealth() - damage < 1; + } }