AcrobaticsManager.java 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. package com.gmail.nossr50.skills.acrobatics;
  2. import com.gmail.nossr50.config.experience.ExperienceConfig;
  3. import com.gmail.nossr50.datatypes.experience.XPGainReason;
  4. import com.gmail.nossr50.datatypes.interactions.NotificationType;
  5. import com.gmail.nossr50.datatypes.player.McMMOPlayer;
  6. import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
  7. import com.gmail.nossr50.datatypes.skills.SubSkillType;
  8. import com.gmail.nossr50.mcMMO;
  9. import com.gmail.nossr50.skills.SkillManager;
  10. import com.gmail.nossr50.util.Misc;
  11. import com.gmail.nossr50.util.Permissions;
  12. import com.gmail.nossr50.util.player.NotificationManager;
  13. import com.gmail.nossr50.util.random.RandomChanceUtil;
  14. import com.gmail.nossr50.util.skills.ParticleEffectUtils;
  15. import com.gmail.nossr50.util.skills.RankUtils;
  16. import com.gmail.nossr50.util.skills.SkillActivationType;
  17. import com.gmail.nossr50.util.skills.SkillUtils;
  18. import org.bukkit.entity.Entity;
  19. import org.bukkit.entity.LightningStrike;
  20. import org.bukkit.entity.Player;
  21. public class AcrobaticsManager extends SkillManager {
  22. public AcrobaticsManager(McMMOPlayer mcMMOPlayer) {
  23. super(mcMMOPlayer, PrimarySkillType.ACROBATICS);
  24. rollXPInterval = (1000 * mcMMO.getConfigManager().getConfigExploitPrevention().getConfigSectionExploitAcrobatics().getRollXPGainCooldownSeconds());
  25. }
  26. private long rollXPCooldown = 0;
  27. private long rollXPInterval; //1 Minute
  28. private long rollXPIntervalLengthen = (1000 * 10); //10 Seconds
  29. public boolean canGainRollXP()
  30. {
  31. if(!ExperienceConfig.getInstance().isAcrobaticsExploitingPrevented())
  32. return true;
  33. if(System.currentTimeMillis() >= rollXPCooldown)
  34. {
  35. rollXPCooldown = System.currentTimeMillis() + rollXPInterval;
  36. rollXPIntervalLengthen = (1000 * 10); //5 Seconds
  37. return true;
  38. } else {
  39. rollXPCooldown += rollXPIntervalLengthen;
  40. rollXPIntervalLengthen += 1000; //Add another second to the next penalty
  41. return false;
  42. }
  43. }
  44. public boolean canDodge(Entity damager) {
  45. if(!RankUtils.hasUnlockedSubskill(getPlayer(), SubSkillType.ACROBATICS_DODGE))
  46. return false;
  47. if (Permissions.isSubSkillEnabled(getPlayer(), SubSkillType.ACROBATICS_DODGE)) {
  48. if (damager instanceof LightningStrike && Acrobatics.dodgeLightningDisabled) {
  49. return false;
  50. }
  51. return skill.shouldProcess(damager);
  52. }
  53. return false;
  54. }
  55. /**
  56. * Handle the damage reduction and XP gain from the Dodge ability
  57. *
  58. * @param damage The amount of damage initially dealt by the event
  59. * @return the modified event damage if the ability was successful, the original event damage otherwise
  60. */
  61. public double dodgeCheck(double damage) {
  62. double modifiedDamage = Acrobatics.calculateModifiedDodgeDamage(damage, Acrobatics.dodgeDamageModifier);
  63. Player player = getPlayer();
  64. if (!isFatal(modifiedDamage) && RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.ACROBATICS_DODGE, player)) {
  65. ParticleEffectUtils.playDodgeEffect(player);
  66. if (mcMMOPlayer.useChatNotifications()) {
  67. NotificationManager.sendPlayerInformation(player, NotificationType.SUBSKILL_MESSAGE, "Acrobatics.Combat.Proc");
  68. }
  69. //Check respawn to prevent abuse
  70. if(!mcMMO.getConfigManager().getConfigExploitPrevention().getConfigSectionExploitAcrobatics().isPreventAcrobaticsAbuse())
  71. applyXpGain((float) (damage * Acrobatics.dodgeXpModifier), XPGainReason.PVP);
  72. else if (SkillUtils.cooldownExpired(mcMMOPlayer.getRespawnATS(), Misc.PLAYER_RESPAWN_COOLDOWN_SECONDS)
  73. && mcMMOPlayer.getTeleportATS() < System.currentTimeMillis()) {
  74. applyXpGain((float) (damage * Acrobatics.dodgeXpModifier), XPGainReason.PVP);
  75. }
  76. return modifiedDamage;
  77. }
  78. return damage;
  79. }
  80. private boolean isFatal(double damage) {
  81. return getPlayer().getHealth() - damage <= 0;
  82. }
  83. }