2
0

ArcheryManager.java 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. package com.gmail.nossr50.skills.archery;
  2. import com.gmail.nossr50.datatypes.interactions.NotificationType;
  3. import com.gmail.nossr50.datatypes.player.McMMOPlayer;
  4. import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
  5. import com.gmail.nossr50.datatypes.skills.SubSkillType;
  6. import com.gmail.nossr50.mcMMO;
  7. import com.gmail.nossr50.skills.SkillManager;
  8. import com.gmail.nossr50.util.Misc;
  9. import com.gmail.nossr50.util.Permissions;
  10. import com.gmail.nossr50.util.player.NotificationManager;
  11. import com.gmail.nossr50.util.random.RandomChanceUtil;
  12. import com.gmail.nossr50.util.skills.RankUtils;
  13. import com.gmail.nossr50.util.skills.SkillActivationType;
  14. import org.bukkit.Location;
  15. import org.bukkit.entity.Entity;
  16. import org.bukkit.entity.LivingEntity;
  17. import org.bukkit.entity.Player;
  18. import org.bukkit.entity.Projectile;
  19. import org.bukkit.potion.PotionEffect;
  20. import org.bukkit.potion.PotionEffectType;
  21. public class ArcheryManager extends SkillManager {
  22. public ArcheryManager(McMMOPlayer mcMMOPlayer) {
  23. super(mcMMOPlayer, PrimarySkillType.ARCHERY);
  24. }
  25. public boolean canDaze(LivingEntity target) {
  26. if(!RankUtils.hasUnlockedSubskill(getPlayer(), SubSkillType.ARCHERY_DAZE))
  27. return false;
  28. return target instanceof Player && Permissions.isSubSkillEnabled(getPlayer(), SubSkillType.ARCHERY_DAZE);
  29. }
  30. public boolean canSkillShot() {
  31. if(!RankUtils.hasUnlockedSubskill(getPlayer(), SubSkillType.ARCHERY_SKILL_SHOT))
  32. return false;
  33. return Permissions.isSubSkillEnabled(getPlayer(), SubSkillType.ARCHERY_SKILL_SHOT);
  34. }
  35. public boolean canRetrieveArrows() {
  36. if(!RankUtils.hasUnlockedSubskill(getPlayer(), SubSkillType.ARCHERY_ARROW_RETRIEVAL))
  37. return false;
  38. return Permissions.isSubSkillEnabled(getPlayer(), SubSkillType.ARCHERY_ARROW_RETRIEVAL);
  39. }
  40. /**
  41. * Calculate bonus XP awarded for Archery when hitting a far-away target.
  42. *
  43. * @param target The {@link LivingEntity} damaged by the arrow
  44. * @param damager The {@link Entity} who shot the arrow
  45. */
  46. public double distanceXpBonusMultiplier(LivingEntity target, Entity damager) {
  47. Location firedLocation = (Location) damager.getMetadata(mcMMO.arrowDistanceKey).get(0).value();
  48. Location targetLocation = target.getLocation();
  49. if (firedLocation.getWorld() != targetLocation.getWorld()) {
  50. return 1;
  51. }
  52. return 1 + Math.min(firedLocation.distance(targetLocation), 50) * Archery.DISTANCE_XP_MULTIPLIER;
  53. }
  54. /**
  55. * Track arrows fired for later retrieval.
  56. *
  57. * @param target The {@link LivingEntity} damaged by the arrow
  58. */
  59. public void retrieveArrows(LivingEntity target, Projectile projectile) {
  60. if(projectile.hasMetadata(mcMMO.trackedArrow)) {
  61. Archery.incrementTrackerValue(target);
  62. projectile.removeMetadata(mcMMO.trackedArrow, mcMMO.p); //Only 1 entity per projectile
  63. }
  64. }
  65. /**
  66. * Handle the effects of the Daze ability
  67. *
  68. * @param defender The {@link Player} being affected by the ability
  69. */
  70. public double daze(Player defender) {
  71. if (!RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.ARCHERY_DAZE, getPlayer())) {
  72. return 0;
  73. }
  74. Location dazedLocation = defender.getLocation();
  75. dazedLocation.setPitch(90 - Misc.getRandom().nextInt(181));
  76. defender.teleport(dazedLocation);
  77. defender.addPotionEffect(new PotionEffect(PotionEffectType.CONFUSION, 20 * 10, 10));
  78. if (NotificationManager.doesPlayerUseNotifications(defender)) {
  79. NotificationManager.sendPlayerInformation(defender, NotificationType.SUBSKILL_MESSAGE, "Combat.TouchedFuzzy");
  80. }
  81. if (mcMMOPlayer.useChatNotifications()) {
  82. NotificationManager.sendPlayerInformation(getPlayer(), NotificationType.SUBSKILL_MESSAGE, "Combat.TargetDazed");
  83. }
  84. return Archery.dazeBonusDamage;
  85. }
  86. /**
  87. * Calculates the damage to deal after Skill Shot has been applied
  88. *
  89. * @param oldDamage The raw damage value of this arrow before we modify it
  90. */
  91. public double skillShot(double oldDamage) {
  92. if (!RandomChanceUtil.isActivationSuccessful(SkillActivationType.ALWAYS_FIRES, SubSkillType.ARCHERY_SKILL_SHOT, getPlayer())) {
  93. return oldDamage;
  94. }
  95. return Archery.getSkillShotBonusDamage(getPlayer(), oldDamage);
  96. }
  97. }