Archery.java 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. package com.gmail.nossr50.skills.combat;
  2. import java.util.HashMap;
  3. import java.util.Iterator;
  4. import java.util.Map;
  5. import java.util.Map.Entry;
  6. import java.util.Random;
  7. import org.bukkit.Location;
  8. import org.bukkit.Material;
  9. import org.bukkit.entity.Entity;
  10. import org.bukkit.entity.Player;
  11. import org.bukkit.inventory.ItemStack;
  12. import com.gmail.nossr50.mcMMO;
  13. import com.gmail.nossr50.datatypes.PlayerProfile;
  14. import com.gmail.nossr50.datatypes.SkillType;
  15. import com.gmail.nossr50.locale.LocaleLoader;
  16. import com.gmail.nossr50.util.Combat;
  17. import com.gmail.nossr50.util.Misc;
  18. import com.gmail.nossr50.util.Users;
  19. public class Archery {
  20. public static Map<Entity, Integer> arrowTracker = new HashMap<Entity, Integer>();
  21. private static Random random = new Random();
  22. /**
  23. * Track arrows fired for later retrieval.
  24. *
  25. * @param plugin mcMMO plugin instance
  26. * @param entity Entity damaged by the arrow
  27. * @param PPa PlayerProfile of the player firing the arrow
  28. */
  29. public static void trackArrows(mcMMO plugin, Entity entity, PlayerProfile PPa) {
  30. final int MAX_BONUS_LEVEL = 1000;
  31. int skillLevel = PPa.getSkillLevel(SkillType.ARCHERY);
  32. if (skillLevel > MAX_BONUS_LEVEL || (random.nextInt(1000) <= skillLevel)) {
  33. for (Entry<Entity, Integer> entry : arrowTracker.entrySet()) {
  34. if (entry.getKey() == entity) {
  35. entry.setValue(entry.getValue() + 1);
  36. return;
  37. }
  38. }
  39. arrowTracker.put(entity, 1);
  40. }
  41. }
  42. /**
  43. * Check for Daze.
  44. *
  45. * @param defender Defending player
  46. * @param attacker Attacking player
  47. */
  48. public static void dazeCheck(Player defender, Player attacker) {
  49. final int MAX_BONUS_LEVEL = 1000;
  50. int skillLevel = Users.getProfile(attacker).getSkillLevel(SkillType.ARCHERY);
  51. Location loc = defender.getLocation();
  52. int skillCheck = Misc.skillCheck(skillLevel, MAX_BONUS_LEVEL);
  53. if (random.nextInt(10) > 5) {
  54. loc.setPitch(90);
  55. }
  56. else {
  57. loc.setPitch(-90);
  58. }
  59. if (random.nextInt(2000) <= skillCheck) {
  60. defender.teleport(loc);
  61. Combat.dealDamage(defender, 4);
  62. defender.sendMessage(LocaleLoader.getString("Combat.TouchedFuzzy"));
  63. attacker.sendMessage(LocaleLoader.getString("Combat.TargetDazed"));
  64. }
  65. }
  66. /**
  67. * Check for arrow retrieval.
  68. *
  69. * @param entity The entity hit by the arrows
  70. */
  71. public static void arrowRetrievalCheck(Entity entity) {
  72. for (Iterator<Map.Entry<Entity, Integer>> it = arrowTracker.entrySet().iterator() ; it.hasNext() ; ) {
  73. Entry<Entity, Integer> entry = it.next();
  74. if (entry.getKey() == entity) {
  75. Misc.mcDropItems(entity.getLocation(), new ItemStack(Material.ARROW), entry.getValue());
  76. it.remove();
  77. return;
  78. }
  79. }
  80. }
  81. }