AcrobaticsManager.java 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. package com.gmail.nossr50.skills.acrobatics;
  2. import com.gmail.nossr50.config.experience.ExperienceConfig;
  3. import com.gmail.nossr50.datatypes.BlockLocationHistory;
  4. import com.gmail.nossr50.datatypes.experience.XPGainReason;
  5. import com.gmail.nossr50.datatypes.interactions.NotificationType;
  6. import com.gmail.nossr50.datatypes.player.McMMOPlayer;
  7. import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
  8. import com.gmail.nossr50.datatypes.skills.SubSkillType;
  9. import com.gmail.nossr50.mcMMO;
  10. import com.gmail.nossr50.skills.SkillManager;
  11. import com.gmail.nossr50.util.Misc;
  12. import com.gmail.nossr50.util.Permissions;
  13. import com.gmail.nossr50.util.player.NotificationManager;
  14. import com.gmail.nossr50.util.random.RandomChanceUtil;
  15. import com.gmail.nossr50.util.skills.ParticleEffectUtils;
  16. import com.gmail.nossr50.util.skills.RankUtils;
  17. import com.gmail.nossr50.util.skills.SkillActivationType;
  18. import com.gmail.nossr50.util.skills.SkillUtils;
  19. import org.bukkit.Location;
  20. import org.bukkit.entity.Entity;
  21. import org.bukkit.entity.LightningStrike;
  22. import org.bukkit.entity.Player;
  23. import org.bukkit.metadata.FixedMetadataValue;
  24. import org.bukkit.metadata.MetadataValue;
  25. public class AcrobaticsManager extends SkillManager {
  26. public AcrobaticsManager(McMMOPlayer mcMMOPlayer) {
  27. super(mcMMOPlayer, PrimarySkillType.ACROBATICS);
  28. fallLocationMap = new BlockLocationHistory(50);
  29. }
  30. private long rollXPCooldown = 0;
  31. private final long rollXPInterval = (1000 * 3); //1 Minute
  32. private long rollXPIntervalLengthen = (1000 * 10); //10 Seconds
  33. private final BlockLocationHistory fallLocationMap;
  34. public boolean hasFallenInLocationBefore(Location location)
  35. {
  36. return fallLocationMap.contains(location);
  37. }
  38. public void addLocationToFallMap(Location location)
  39. {
  40. fallLocationMap.add(location);
  41. }
  42. public boolean canGainRollXP()
  43. {
  44. if(!ExperienceConfig.getInstance().isAcrobaticsExploitingPrevented())
  45. return true;
  46. if(System.currentTimeMillis() >= rollXPCooldown)
  47. {
  48. rollXPCooldown = System.currentTimeMillis() + rollXPInterval;
  49. rollXPIntervalLengthen = (1000 * 10); //5 Seconds
  50. return true;
  51. } else {
  52. rollXPCooldown += rollXPIntervalLengthen;
  53. rollXPIntervalLengthen += 1000; //Add another second to the next penalty
  54. return false;
  55. }
  56. }
  57. public boolean canDodge(Entity damager) {
  58. if(!RankUtils.hasUnlockedSubskill(getPlayer(), SubSkillType.ACROBATICS_DODGE))
  59. return false;
  60. if (Permissions.isSubSkillEnabled(getPlayer(), SubSkillType.ACROBATICS_DODGE)) {
  61. if (damager instanceof LightningStrike && Acrobatics.dodgeLightningDisabled) {
  62. return false;
  63. }
  64. return skill.shouldProcess(damager);
  65. }
  66. return false;
  67. }
  68. /**
  69. * Handle the damage reduction and XP gain from the Dodge ability
  70. *
  71. * @param damage The amount of damage initially dealt by the event
  72. * @return the modified event damage if the ability was successful, the original event damage otherwise
  73. */
  74. public double dodgeCheck(Entity attacker, double damage) {
  75. double modifiedDamage = Acrobatics.calculateModifiedDodgeDamage(damage, Acrobatics.dodgeDamageModifier);
  76. Player player = getPlayer();
  77. if (!isFatal(modifiedDamage) && RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.ACROBATICS_DODGE, player)) {
  78. ParticleEffectUtils.playDodgeEffect(player);
  79. if (mmoPlayer.useChatNotifications()) {
  80. NotificationManager.sendPlayerInformation(player, NotificationType.SUBSKILL_MESSAGE, "Acrobatics.Combat.Proc");
  81. }
  82. if (SkillUtils.cooldownExpired(mmoPlayer.getRespawnATS(), Misc.PLAYER_RESPAWN_COOLDOWN_SECONDS)) {
  83. if(!(attacker instanceof Player)) {
  84. //Check to see how many dodge XP rewards this mob has handed out
  85. if(attacker.hasMetadata(mcMMO.DODGE_TRACKER) && ExperienceConfig.getInstance().isAcrobaticsExploitingPrevented()) {
  86. //If Dodge XP has been handed out 5 times then consider it being exploited
  87. MetadataValue metadataValue = attacker.getMetadata(mcMMO.DODGE_TRACKER).get(0);
  88. int count = attacker.getMetadata(mcMMO.DODGE_TRACKER).get(0).asInt();
  89. if(count <= 5) {
  90. applyXpGain((float) (damage * Acrobatics.dodgeXpModifier), XPGainReason.PVE);
  91. attacker.setMetadata(mcMMO.DODGE_TRACKER, new FixedMetadataValue(mcMMO.p, count + 1));
  92. }
  93. } else {
  94. applyXpGain((float) (damage * Acrobatics.dodgeXpModifier), XPGainReason.PVE);
  95. attacker.setMetadata(mcMMO.DODGE_TRACKER, new FixedMetadataValue(mcMMO.p, 1));
  96. }
  97. }
  98. }
  99. //Check respawn to prevent abuse
  100. return modifiedDamage;
  101. }
  102. return damage;
  103. }
  104. private boolean isFatal(double damage) {
  105. return getPlayer().getHealth() - damage <= 0;
  106. }
  107. }