Acrobatics.java 4.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package com.gmail.nossr50.skills.acrobatics;
  2. import org.bukkit.Material;
  3. import org.bukkit.entity.Player;
  4. import com.gmail.nossr50.config.AdvancedConfig;
  5. import com.gmail.nossr50.config.Config;
  6. import com.gmail.nossr50.locale.LocaleLoader;
  7. import com.gmail.nossr50.skills.utilities.PerksUtils;
  8. import com.gmail.nossr50.skills.utilities.SkillType;
  9. import com.gmail.nossr50.util.Misc;
  10. import com.gmail.nossr50.util.Permissions;
  11. import com.gmail.nossr50.util.Users;
  12. public final class Acrobatics {
  13. public static double dodgeMaxChance = AdvancedConfig.getInstance().getDodgeChanceMax();
  14. public static int dodgeMaxBonusLevel = AdvancedConfig.getInstance().getDodgeMaxBonusLevel();
  15. public static int dodgeXpModifier = AdvancedConfig.getInstance().getDodgeXPModifier();
  16. public static double rollMaxChance = AdvancedConfig.getInstance().getRollChanceMax();
  17. public static int rollMaxBonusLevel = AdvancedConfig.getInstance().getRollMaxBonusLevel();
  18. public static int rollThreshold = AdvancedConfig.getInstance().getRollDamageThreshold();
  19. public static double gracefulRollMaxChance = AdvancedConfig.getInstance().getGracefulRollChanceMax();
  20. public static int gracefulRollMaxBonusLevel = AdvancedConfig.getInstance().getGracefulRollMaxBonusLevel();
  21. public static int gracefulRollThreshold = AdvancedConfig.getInstance().getGracefulRollDamageThreshold();
  22. public static int gracefulRollSuccessModifier = AdvancedConfig.getInstance().getGracefulRollSuccessModifer();
  23. public static int rollXpModifier = AdvancedConfig.getInstance().getRollXPModifier();
  24. public static int fallXpModifier = AdvancedConfig.getInstance().getFallXPModifier();
  25. public static boolean afkLevelingDisabled = Config.getInstance().getAcrobaticsAFKDisabled();
  26. public static boolean dodgeLightningDisabled = Config.getInstance().getDodgeLightningDisabled();
  27. private Acrobatics() {};
  28. public static boolean canRoll(Player player) {
  29. return (player.getItemInHand().getType() != Material.ENDER_PEARL) && !(afkLevelingDisabled && player.isInsideVehicle()) && Permissions.roll(player);
  30. }
  31. public static int processRoll(Player player, int damage) {
  32. if (player.isSneaking() && Permissions.gracefulRoll(player)) {
  33. return processGracefulRoll(player, damage);
  34. }
  35. int modifiedDamage = calculateModifiedDamage(damage, rollThreshold);
  36. if (!isFatal(player, modifiedDamage) && isSuccessfulRoll(player, rollMaxChance, rollMaxBonusLevel, 1)) {
  37. player.sendMessage(LocaleLoader.getString("Acrobatics.Roll.Text"));
  38. applyXpGain(player, damage, rollXpModifier);
  39. return modifiedDamage;
  40. }
  41. else if (!isFatal(player, damage)) {
  42. applyXpGain(player, damage, fallXpModifier);
  43. }
  44. return damage;
  45. }
  46. private static int processGracefulRoll(Player player, int damage) {
  47. int modifiedDamage = calculateModifiedDamage(damage, gracefulRollThreshold);
  48. if (!isFatal(player, modifiedDamage) && isSuccessfulRoll(player, gracefulRollMaxChance, gracefulRollMaxBonusLevel, gracefulRollSuccessModifier)) {
  49. player.sendMessage(LocaleLoader.getString("Acrobatics.Ability.Proc"));
  50. applyXpGain(player, damage, rollXpModifier);
  51. return modifiedDamage;
  52. }
  53. else if (!isFatal(player, damage)) {
  54. applyXpGain(player, damage, fallXpModifier);
  55. }
  56. return damage;
  57. }
  58. private static boolean isFatal(Player player, int damage) {
  59. return player.getHealth() - damage < 1;
  60. }
  61. private static int calculateModifiedDamage(int damage, int damageThreshold) {
  62. return Math.max(damage - damageThreshold, 0);
  63. }
  64. private static boolean isSuccessfulRoll(Player player, double maxChance, int maxLevel, int successModifier) {
  65. double successChance = (maxChance / maxLevel) * Math.min(Users.getPlayer(player).getProfile().getSkillLevel(SkillType.ACROBATICS), maxLevel) * successModifier;
  66. return successChance > Misc.getRandom().nextInt(PerksUtils.handleLuckyPerks(player, SkillType.ACROBATICS));
  67. }
  68. private static void applyXpGain(Player player, int baseXp, int multiplier) {
  69. Users.getPlayer(player).beginXpGain(SkillType.ACROBATICS, baseXp * multiplier);
  70. }
  71. }