ArcheryManager.java 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. package com.gmail.nossr50.skills.archery;
  2. import com.gmail.nossr50.datatypes.skills.SubSkill;
  3. import com.gmail.nossr50.util.skills.RankUtils;
  4. import com.gmail.nossr50.util.skills.SubSkillActivationType;
  5. import org.bukkit.Location;
  6. import org.bukkit.entity.Entity;
  7. import org.bukkit.entity.LivingEntity;
  8. import org.bukkit.entity.Player;
  9. import org.bukkit.potion.PotionEffect;
  10. import org.bukkit.potion.PotionEffectType;
  11. import com.gmail.nossr50.mcMMO;
  12. import com.gmail.nossr50.datatypes.player.McMMOPlayer;
  13. import com.gmail.nossr50.datatypes.skills.PrimarySkill;
  14. import com.gmail.nossr50.locale.LocaleLoader;
  15. import com.gmail.nossr50.skills.SkillManager;
  16. import com.gmail.nossr50.util.Misc;
  17. import com.gmail.nossr50.util.Permissions;
  18. import com.gmail.nossr50.util.player.UserManager;
  19. import com.gmail.nossr50.util.skills.SkillUtils;
  20. public class ArcheryManager extends SkillManager {
  21. public ArcheryManager(McMMOPlayer mcMMOPlayer) {
  22. super(mcMMOPlayer, PrimarySkill.ARCHERY);
  23. }
  24. public boolean canDaze(LivingEntity target) {
  25. return target instanceof Player && Permissions.isSubSkillEnabled(getPlayer(), SubSkill.ARCHERY_DAZE);
  26. }
  27. public boolean canSkillShot() {
  28. return getSkillLevel() >= Archery.skillShotIncreaseLevel && Permissions.isSubSkillEnabled(getPlayer(), SubSkill.ARCHERY_SKILL_SHOT);
  29. }
  30. public boolean canRetrieveArrows() {
  31. return Permissions.isSubSkillEnabled(getPlayer(), SubSkill.ARCHERY_RETRIEVE);
  32. }
  33. /**
  34. * Calculate bonus XP awarded for Archery when hitting a far-away target.
  35. *
  36. * @param target The {@link LivingEntity} damaged by the arrow
  37. * @param damager The {@link Entity} who shot the arrow
  38. */
  39. public void distanceXpBonus(LivingEntity target, Entity damager) {
  40. Location firedLocation = (Location) damager.getMetadata(mcMMO.arrowDistanceKey).get(0).value();
  41. Location targetLocation = target.getLocation();
  42. if (firedLocation.getWorld() != targetLocation.getWorld()) {
  43. return;
  44. }
  45. applyXpGain((int) (Math.min(firedLocation.distanceSquared(targetLocation), 2500) * Archery.DISTANCE_XP_MULTIPLIER), getXPGainReason(target, damager));
  46. }
  47. /**
  48. * Track arrows fired for later retrieval.
  49. *
  50. * @param target The {@link LivingEntity} damaged by the arrow
  51. */
  52. public void retrieveArrows(LivingEntity target) {
  53. if (SkillUtils.isActivationSuccessful(SubSkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkill.ARCHERY_RETRIEVE, getPlayer(), this.skill, getSkillLevel(), activationChance)) {
  54. Archery.incrementTrackerValue(target);
  55. }
  56. }
  57. /**
  58. * Handle the effects of the Daze ability
  59. *
  60. * @param defender The {@link Player} being affected by the ability
  61. */
  62. public double daze(Player defender) {
  63. if (!SkillUtils.isActivationSuccessful(SubSkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkill.ARCHERY_DAZE, getPlayer(), this.skill, getSkillLevel(), activationChance)) {
  64. return 0;
  65. }
  66. Location dazedLocation = defender.getLocation();
  67. dazedLocation.setPitch(90 - Misc.getRandom().nextInt(181));
  68. defender.teleport(dazedLocation);
  69. defender.addPotionEffect(new PotionEffect(PotionEffectType.CONFUSION, 20 * 10, 10));
  70. if (UserManager.getPlayer(defender).useChatNotifications()) {
  71. defender.sendMessage(LocaleLoader.getString("Combat.TouchedFuzzy"));
  72. }
  73. if (mcMMOPlayer.useChatNotifications()) {
  74. getPlayer().sendMessage(LocaleLoader.getString("Combat.TargetDazed"));
  75. }
  76. return Archery.dazeBonusDamage;
  77. }
  78. /**
  79. * Handle the effects of the Skill Shot ability
  80. *
  81. * @param damage The amount of damage initially dealt by the event
  82. */
  83. public double skillShot(double damage) {
  84. if (!SkillUtils.isActivationSuccessful(SubSkillActivationType.ALWAYS_FIRES, SubSkill.ARCHERY_SKILL_SHOT, getPlayer(), null, 0, 0)) {
  85. return damage;
  86. }
  87. /*
  88. * Archery
  89. * Skill Shot
  90. *
  91. * Every rank we increase Skill Shot's bonus damage % by the IncreaseDamage percentage value from advanced.yml
  92. * Divide end result by 100.0D to get proper scale
  93. */
  94. double damageBonusPercent = (Math.min(((RankUtils.getRank(getPlayer(), SubSkill.ARCHERY_SKILL_SHOT)) * Archery.skillShotIncreasePercentage), Archery.skillShotMaxBonusPercentage) / 100.0D);
  95. return Math.min(damage * damageBonusPercent, Archery.skillShotMaxBonusDamage);
  96. }
  97. }