diff --git a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java index ec872a03b..c1cc7ab7c 100644 --- a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java @@ -33,7 +33,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.skills.SkillManagerStore; -import com.gmail.nossr50.skills.acrobatics.Acrobatics; import com.gmail.nossr50.skills.archery.Archery; import com.gmail.nossr50.skills.fishing.Fishing; import com.gmail.nossr50.skills.herbalism.Herbalism; @@ -179,7 +178,7 @@ public class EntityListener implements Listener { switch (cause) { case FALL: - if (Acrobatics.canRoll(player)) { + if (SkillManagerStore.getInstance().getAcrobaticsManager(player.getName()).canRoll()) { event.setDamage(SkillManagerStore.getInstance().getAcrobaticsManager(player.getName()).rollCheck(event.getDamage())); if (event.getDamage() == 0) { 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 4238748e1..36ba599ca 100644 --- a/src/main/java/com/gmail/nossr50/skills/acrobatics/Acrobatics.java +++ b/src/main/java/com/gmail/nossr50/skills/acrobatics/Acrobatics.java @@ -1,17 +1,7 @@ package com.gmail.nossr50.skills.acrobatics; -import org.bukkit.Material; -import org.bukkit.entity.Entity; -import org.bukkit.entity.LightningStrike; -import org.bukkit.entity.Player; - import com.gmail.nossr50.config.AdvancedConfig; import com.gmail.nossr50.config.Config; -import com.gmail.nossr50.skills.utilities.PerksUtils; -import com.gmail.nossr50.skills.utilities.SkillType; -import com.gmail.nossr50.util.Misc; -import com.gmail.nossr50.util.Permissions; -import com.gmail.nossr50.util.Users; public final class Acrobatics { public static double dodgeMaxChance = AdvancedConfig.getInstance().getDodgeChanceMax(); @@ -36,27 +26,6 @@ public final class Acrobatics { private Acrobatics() {}; - public static boolean canRoll(Player player) { - return (player.getItemInHand().getType() != Material.ENDER_PEARL) && !(afkLevelingDisabled && player.isInsideVehicle()) && Permissions.roll(player); - } - - public static boolean canDodge(Player player, Entity damager) { - if (Permissions.dodge(player)) { - if (damager instanceof Player && SkillType.ACROBATICS.getPVPEnabled()) { - return true; - } - else if (!(damager instanceof Player) && SkillType.ACROBATICS.getPVEEnabled() && !(damager instanceof LightningStrike && Acrobatics.dodgeLightningDisabled)) { - return true; - } - } - - return false; - } - - protected static boolean isFatal(Player player, int damage) { - return player.getHealth() - damage < 1; - } - protected static int calculateModifiedDodgeDamage(int damage, int damageModifier) { return Math.max(damage / damageModifier, 1); } @@ -64,10 +33,4 @@ public final class Acrobatics { protected static int calculateModifiedRollDamage(int damage, int damageThreshold) { return Math.max(damage - damageThreshold, 0); } - - protected static boolean isSuccessfulRoll(Player player, double maxChance, int maxLevel, int successModifier) { - double successChance = (maxChance / maxLevel) * Math.min(Users.getPlayer(player).getProfile().getSkillLevel(SkillType.ACROBATICS), maxLevel) * successModifier; - - return successChance > Misc.getRandom().nextInt(PerksUtils.handleLuckyPerks(player, SkillType.ACROBATICS)); - } } \ No newline at end of file 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 7afe50e6d..1c5fb4ffb 100644 --- a/src/main/java/com/gmail/nossr50/skills/acrobatics/AcrobaticsManager.java +++ b/src/main/java/com/gmail/nossr50/skills/acrobatics/AcrobaticsManager.java @@ -1,5 +1,8 @@ package com.gmail.nossr50.skills.acrobatics; +import org.bukkit.Material; +import org.bukkit.entity.Entity; +import org.bukkit.entity.LightningStrike; import org.bukkit.entity.Player; import com.gmail.nossr50.datatypes.McMMOPlayer; @@ -17,6 +20,25 @@ public class AcrobaticsManager extends SkillManager { super(mcMMOPlayer, SkillType.ACROBATICS); } + public boolean canRoll() { + Player player = getPlayer(); + + return (player.getItemInHand().getType() != Material.ENDER_PEARL) && !(Acrobatics.afkLevelingDisabled && player.isInsideVehicle()) && Permissions.roll(player); + } + + public boolean canDodge(Entity damager) { + if (Permissions.dodge(getPlayer())) { + if (damager instanceof Player && SkillType.ACROBATICS.getPVPEnabled()) { + return true; + } + else if (!(damager instanceof Player) && SkillType.ACROBATICS.getPVEEnabled() && !(damager instanceof LightningStrike && Acrobatics.dodgeLightningDisabled)) { + return true; + } + } + + return false; + } + /** * Handle the damage reduction and XP gain from the Dodge ability * @@ -27,7 +49,7 @@ public class AcrobaticsManager extends SkillManager { int modifiedDamage = Acrobatics.calculateModifiedDodgeDamage(damage, Acrobatics.dodgeDamageModifier); Player player = getPlayer(); - if (!Acrobatics.isFatal(player, modifiedDamage) && SkillTools.activationSuccessful(player, skill, Acrobatics.dodgeMaxChance, Acrobatics.dodgeMaxBonusLevel)) { + if (!isFatal(modifiedDamage) && SkillTools.activationSuccessful(player, skill, Acrobatics.dodgeMaxChance, Acrobatics.dodgeMaxBonusLevel)) { ParticleEffectUtils.playDodgeEffect(player); PlayerProfile playerProfile = getProfile(); @@ -62,32 +84,46 @@ public class AcrobaticsManager extends SkillManager { int modifiedDamage = Acrobatics.calculateModifiedRollDamage(damage, Acrobatics.rollThreshold); - if (!Acrobatics.isFatal(player, modifiedDamage) && Acrobatics.isSuccessfulRoll(player, Acrobatics.rollMaxChance, Acrobatics.rollMaxBonusLevel, 1)) { + if (!isFatal(modifiedDamage) && isSuccessfulRoll(Acrobatics.rollMaxChance, Acrobatics.rollMaxBonusLevel, 1)) { player.sendMessage(LocaleLoader.getString("Acrobatics.Roll.Text")); applyXpGain(damage * Acrobatics.rollXpModifier); return modifiedDamage; } - else if (!Acrobatics.isFatal(player, damage)) { + else if (!isFatal(damage)) { applyXpGain(damage * Acrobatics.fallXpModifier); } 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 roll was successful, the original event damage otherwise + */ private int gracefulRollCheck(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)) { + if (!isFatal(modifiedDamage) && isSuccessfulRoll(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)) { + else if (!isFatal(damage)) { applyXpGain(damage * Acrobatics.fallXpModifier); } return damage; } + + private boolean isSuccessfulRoll(double maxChance, int maxLevel, int successModifier) { + return ((maxChance / maxLevel) * Math.min(getSkillLevel(), maxLevel) * successModifier) > Misc.getRandom().nextInt(activationChance); + } + + private boolean isFatal(int damage) { + return getPlayer().getHealth() - damage < 1; + } } diff --git a/src/main/java/com/gmail/nossr50/skills/archery/Archery.java b/src/main/java/com/gmail/nossr50/skills/archery/Archery.java index 7ebc022cc..797d68ea7 100644 --- a/src/main/java/com/gmail/nossr50/skills/archery/Archery.java +++ b/src/main/java/com/gmail/nossr50/skills/archery/Archery.java @@ -5,16 +5,11 @@ import java.util.Iterator; import java.util.List; import org.bukkit.Material; -import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.LivingEntity; -import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import com.gmail.nossr50.config.AdvancedConfig; -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.Permissions; public class Archery { private static List trackedEntities = new ArrayList(); @@ -32,18 +27,6 @@ public class Archery { public static double distanceXpModifer = 0.025; - public static boolean canDaze(Player player, LivingEntity target) { - return target instanceof Player && Permissions.daze(player); - } - - public static boolean canSkillShot(Player player) { - return SkillTools.unlockLevelReached(player, SkillType.ARCHERY, skillShotIncreaseLevel) && Permissions.bonusDamage(player, SkillType.ARCHERY); - } - - public static boolean canTrackArrows(Player player) { - return !(player.getItemInHand().containsEnchantment(Enchantment.ARROW_INFINITE)) && Permissions.arrowRetrieval(player); - } - protected static void incrementTrackerValue(LivingEntity livingEntity) { for (TrackedEntity trackedEntity : trackedEntities) { if (trackedEntity.getLivingEntity().getEntityId() == livingEntity.getEntityId()) { diff --git a/src/main/java/com/gmail/nossr50/skills/archery/ArcheryManager.java b/src/main/java/com/gmail/nossr50/skills/archery/ArcheryManager.java index 38820c456..dc2016988 100644 --- a/src/main/java/com/gmail/nossr50/skills/archery/ArcheryManager.java +++ b/src/main/java/com/gmail/nossr50/skills/archery/ArcheryManager.java @@ -1,6 +1,7 @@ package com.gmail.nossr50.skills.archery; import org.bukkit.Location; +import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.potion.PotionEffect; @@ -12,6 +13,7 @@ import com.gmail.nossr50.skills.SkillManager; 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.Permissions; import com.gmail.nossr50.util.Users; public class ArcheryManager extends SkillManager { @@ -19,6 +21,22 @@ public class ArcheryManager extends SkillManager { super(mcMMOPlayer, SkillType.ARCHERY); } + public boolean canDaze(LivingEntity target) { + return target instanceof Player && Permissions.daze(getPlayer()); + } + + public boolean canSkillShot() { + Player player = getPlayer(); + + return SkillTools.unlockLevelReached(player, skill, Archery.skillShotIncreaseLevel) && Permissions.bonusDamage(player, skill); + } + + public boolean canTrackArrows() { + Player player = getPlayer(); + + return !(player.getItemInHand().containsEnchantment(Enchantment.ARROW_INFINITE)) && Permissions.arrowRetrieval(player); + } + /** * Calculate bonus XP awarded for Archery when hitting a far-away target. * diff --git a/src/main/java/com/gmail/nossr50/skills/utilities/CombatTools.java b/src/main/java/com/gmail/nossr50/skills/utilities/CombatTools.java index 7d1199fd2..1e0671b9b 100644 --- a/src/main/java/com/gmail/nossr50/skills/utilities/CombatTools.java +++ b/src/main/java/com/gmail/nossr50/skills/utilities/CombatTools.java @@ -28,8 +28,6 @@ import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.mods.ModChecks; import com.gmail.nossr50.party.PartyManager; import com.gmail.nossr50.skills.SkillManagerStore; -import com.gmail.nossr50.skills.acrobatics.Acrobatics; -import com.gmail.nossr50.skills.archery.Archery; import com.gmail.nossr50.skills.runnables.BleedTimer; import com.gmail.nossr50.skills.runnables.CombatXpGiver; import com.gmail.nossr50.skills.swords.Swords; @@ -252,7 +250,7 @@ public final class CombatTools { ItemStack heldItem = player.getItemInHand(); - if (Acrobatics.canDodge(player, damager)) { + if (SkillManagerStore.getInstance().getAcrobaticsManager(player.getName()).canDodge(damager)) { event.setDamage(SkillManagerStore.getInstance().getAcrobaticsManager(player.getName()).dodgeCheck(event.getDamage())); } @@ -284,7 +282,7 @@ public final class CombatTools { if (Permissions.skillEnabled(shooter, SkillType.ARCHERY)) { String playerName = shooter.getName(); - if (Archery.canSkillShot(shooter)) { + if (SkillManagerStore.getInstance().getArcheryManager(playerName).canSkillShot()) { event.setDamage(SkillManagerStore.getInstance().getArcheryManager(playerName).skillShotCheck(event.getDamage())); } @@ -292,11 +290,11 @@ public final class CombatTools { SkillManagerStore.getInstance().getUnarmedManager(((Player) target).getName()).deflectCheck(event); } - if (Archery.canDaze(shooter, target)) { + if (SkillManagerStore.getInstance().getArcheryManager(playerName).canDaze(target)) { event.setDamage(SkillManagerStore.getInstance().getArcheryManager(playerName).dazeCheck((Player) target, event.getDamage())); } - if (Archery.canTrackArrows(shooter)) { + if (SkillManagerStore.getInstance().getArcheryManager(playerName).canTrackArrows()) { SkillManagerStore.getInstance().getArcheryManager(playerName).trackArrows(target); }