ArcheryManager.java 5.1 KB

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