diff --git a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java index c8c9799b2..f3cfda655 100644 --- a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java @@ -180,7 +180,7 @@ public class EntityListener implements Listener { switch (cause) { case FALL: if (Acrobatics.canRoll(player)) { - event.setDamage(Acrobatics.processRoll(player, event.getDamage())); + event.setDamage(SkillManagerStore.getInstance().getAcrobaticsManager(player.getName()).processRoll(event.getDamage())); if (event.getDamage() == 0) { event.setCancelled(true); 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 97c6059eb..392ff59d1 100644 --- a/src/main/java/com/gmail/nossr50/skills/acrobatics/Acrobatics.java +++ b/src/main/java/com/gmail/nossr50/skills/acrobatics/Acrobatics.java @@ -54,42 +54,6 @@ public final class Acrobatics { return false; } - public static int processRoll(Player player, int damage) { - if (player.isSneaking() && Permissions.gracefulRoll(player)) { - return processGracefulRoll(player, damage); - } - - int modifiedDamage = calculateModifiedRollDamage(damage, rollThreshold); - - if (!isFatal(player, modifiedDamage) && isSuccessfulRoll(player, rollMaxChance, rollMaxBonusLevel, 1)) { - player.sendMessage(LocaleLoader.getString("Acrobatics.Roll.Text")); - applyXpGain(player, damage, rollXpModifier); - - return modifiedDamage; - } - else if (!isFatal(player, damage)) { - applyXpGain(player, damage, fallXpModifier); - } - - return damage; - } - - private static int processGracefulRoll(Player player, int damage) { - int modifiedDamage = calculateModifiedRollDamage(damage, gracefulRollThreshold); - - if (!isFatal(player, modifiedDamage) && isSuccessfulRoll(player, gracefulRollMaxChance, gracefulRollMaxBonusLevel, gracefulRollSuccessModifier)) { - player.sendMessage(LocaleLoader.getString("Acrobatics.Ability.Proc")); - applyXpGain(player, damage, rollXpModifier); - - return modifiedDamage; - } - else if (!isFatal(player, damage)) { - applyXpGain(player, damage, fallXpModifier); - } - - return damage; - } - protected static boolean isFatal(Player player, int damage) { return player.getHealth() - damage < 1; } diff --git a/src/main/java/com/gmail/nossr50/skills/acrobatics/AcrobaticsEventHandler.java b/src/main/java/com/gmail/nossr50/skills/acrobatics/AcrobaticsEventHandler.java deleted file mode 100644 index 740782d10..000000000 --- a/src/main/java/com/gmail/nossr50/skills/acrobatics/AcrobaticsEventHandler.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.gmail.nossr50.skills.acrobatics; - -import org.bukkit.entity.Player; -import org.bukkit.event.entity.EntityDamageEvent; - -public abstract class AcrobaticsEventHandler { - protected AcrobaticsManager manager; - - protected EntityDamageEvent event; - protected int damage; - protected int skillModifier; - protected int modifiedDamage; - - protected AcrobaticsEventHandler(AcrobaticsManager manager, EntityDamageEvent event) { - this.manager = manager; - this.event = event; - this.damage = event.getDamage(); - } - - /** - * Calculate the skill modifier applied for this event. - */ - protected abstract void calculateSkillModifier(); - - /** - * Calculate the modified damage for this event. - */ - protected abstract void calculateModifiedDamage(); - - /** - * Modify the damage dealt by this event. - */ - protected abstract void modifyEventDamage(); - - /** - * Send the ability message for this event. - */ - protected abstract void sendAbilityMessage(); - - /** - * Process Xp gain from this event. - */ - protected abstract void processXpGain(int xp); - - /** - * Check to ensure you're not gaining XP after you die. - * - * @param damage The damage to be dealt - * @return true if the damage is fatal, false otherwise - */ - protected boolean isFatal(int damage) { - Player player = manager.getMcMMOPlayer().getPlayer(); - - if (player.getHealth() - damage < 1) { - return true; - } - - return false; - } -} 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 396d9ceb0..d8d3b058d 100644 --- a/src/main/java/com/gmail/nossr50/skills/acrobatics/AcrobaticsManager.java +++ b/src/main/java/com/gmail/nossr50/skills/acrobatics/AcrobaticsManager.java @@ -10,6 +10,7 @@ import com.gmail.nossr50.skills.utilities.SkillTools; import com.gmail.nossr50.skills.utilities.SkillType; import com.gmail.nossr50.util.Misc; import com.gmail.nossr50.util.ParticleEffectUtils; +import com.gmail.nossr50.util.Permissions; public class AcrobaticsManager extends SkillManager { public AcrobaticsManager (McMMOPlayer mcMMOPlayer) { @@ -17,9 +18,10 @@ public class AcrobaticsManager extends SkillManager { } /** - * Check for dodge damage reduction. + * Handle the damage reduction and XP gain from the Dodge ability * - * @param event The event to check + * @param damage The amount of damage initially dealt by the event + * @return the modified event damage if the dodge was successful, the original event damage otherwise */ public int dodgeCheck(int damage) { int modifiedDamage = Acrobatics.calculateModifiedDodgeDamage(damage, Acrobatics.dodgeDamageModifier); @@ -44,4 +46,48 @@ public class AcrobaticsManager extends SkillManager { return damage; } + + /** + * Handle the damage reduction and XP gain from the Roll ability + * + * @param damage The amount of damage initially dealt by the event + * @return the modified event damage if the roll was successful, the original event damage otherwise + */ + public int processRoll(int damage) { + Player player = getPlayer(); + + if (player.isSneaking() && Permissions.gracefulRoll(player)) { + return processGracefulRoll(player, damage); + } + + int modifiedDamage = Acrobatics.calculateModifiedRollDamage(damage, Acrobatics.rollThreshold); + + if (!Acrobatics.isFatal(player, modifiedDamage) && Acrobatics.isSuccessfulRoll(player, Acrobatics.rollMaxChance, Acrobatics.rollMaxBonusLevel, 1)) { + player.sendMessage(LocaleLoader.getString("Acrobatics.Roll.Text")); + applyXpGain(damage * Acrobatics.rollXpModifier); + + return modifiedDamage; + } + else if (!Acrobatics.isFatal(player, damage)) { + applyXpGain(damage * Acrobatics.fallXpModifier); + } + + return damage; + } + + private int processGracefulRoll(Player player, int damage) { + int modifiedDamage = Acrobatics.calculateModifiedRollDamage(damage, Acrobatics.gracefulRollThreshold); + + if (!Acrobatics.isFatal(player, modifiedDamage) && Acrobatics.isSuccessfulRoll(player, Acrobatics.gracefulRollMaxChance, Acrobatics.gracefulRollMaxBonusLevel, Acrobatics.gracefulRollSuccessModifier)) { + player.sendMessage(LocaleLoader.getString("Acrobatics.Ability.Proc")); + applyXpGain(damage * Acrobatics.rollXpModifier); + + return modifiedDamage; + } + else if (!Acrobatics.isFatal(player, damage)) { + applyXpGain(damage * Acrobatics.fallXpModifier); + } + + return damage; + } } diff --git a/src/main/java/com/gmail/nossr50/skills/acrobatics/DodgeEventHandler.java b/src/main/java/com/gmail/nossr50/skills/acrobatics/DodgeEventHandler.java deleted file mode 100644 index 02428739b..000000000 --- a/src/main/java/com/gmail/nossr50/skills/acrobatics/DodgeEventHandler.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.gmail.nossr50.skills.acrobatics; - -import org.bukkit.entity.Player; -import org.bukkit.event.entity.EntityDamageEvent; - -import com.gmail.nossr50.datatypes.McMMOPlayer; -import com.gmail.nossr50.locale.LocaleLoader; -import com.gmail.nossr50.skills.utilities.SkillTools; -import com.gmail.nossr50.skills.utilities.SkillType; -import com.gmail.nossr50.util.Misc; -import com.gmail.nossr50.util.ParticleEffectUtils; - -public class DodgeEventHandler extends AcrobaticsEventHandler { - protected DodgeEventHandler(AcrobaticsManager manager, EntityDamageEvent event) { - super(manager, event); - - calculateSkillModifier(); - calculateModifiedDamage(); - } - - @Override - protected void calculateSkillModifier() { - this.skillModifier = SkillTools.skillCheck(manager.getSkillLevel(), Acrobatics.dodgeMaxBonusLevel); - } - - @Override - protected void calculateModifiedDamage() { - int modifiedDamage = damage / 2; - - if (modifiedDamage <= 0) { - modifiedDamage = 1; - } - - this.modifiedDamage = modifiedDamage; - } - - @Override - protected void modifyEventDamage() { - event.setDamage(modifiedDamage); - } - - @Override - protected void sendAbilityMessage() { - McMMOPlayer mcMMOPlayer = manager.getMcMMOPlayer(); - Player dodgingPlayer = mcMMOPlayer.getPlayer(); - - ParticleEffectUtils.playDodgeEffect(dodgingPlayer); - - if (mcMMOPlayer.getProfile().useChatNotifications()) { - dodgingPlayer.sendMessage(LocaleLoader.getString("Acrobatics.Combat.Proc")); - } - } - - @Override - protected void processXpGain(int xp) { - McMMOPlayer mcMMOPlayer = manager.getMcMMOPlayer(); - - if (System.currentTimeMillis() >= mcMMOPlayer.getProfile().getRespawnATS() + Misc.PLAYER_RESPAWN_COOLDOWN_SECONDS) { - manager.getMcMMOPlayer().beginXpGain(SkillType.ACROBATICS, xp); - } - } -}