Archery.java 3.2 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.event.entity.EntityDamageByEntityEvent;
  12. import org.bukkit.inventory.ItemStack;
  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.Misc;
  17. import com.gmail.nossr50.util.Users;
  18. public class Archery {
  19. private static Random random = new Random();
  20. public static Map<Entity, Integer> arrowTracker = new HashMap<Entity, Integer>();
  21. /**
  22. * Track arrows fired for later retrieval.
  23. *
  24. * @param entity Entity damaged by the arrow
  25. * @param PPa PlayerProfile of the player firing the arrow
  26. */
  27. public static void trackArrows(Entity entity, PlayerProfile PPa) {
  28. final int MAX_BONUS_LEVEL = 1000;
  29. int skillLevel = PPa.getSkillLevel(SkillType.ARCHERY);
  30. int skillCheck = Misc.skillCheck(skillLevel, MAX_BONUS_LEVEL);
  31. if (random.nextInt(1000) <= skillCheck) {
  32. for (Entry<Entity, Integer> entry : arrowTracker.entrySet()) {
  33. if (entry.getKey() == entity) { //Shouldn't we be using .equals() here?
  34. entry.setValue(entry.getValue() + 1);
  35. return;
  36. }
  37. }
  38. arrowTracker.put(entity, 1);
  39. }
  40. }
  41. /**
  42. * Check for Daze.
  43. *
  44. * @param defender Defending player
  45. * @param attacker Attacking player
  46. * @param event The event to modify
  47. */
  48. public static void dazeCheck(Player defender, Player attacker, EntityDamageByEntityEvent event) {
  49. final int MAX_BONUS_LEVEL = 1000;
  50. int skillLevel = Users.getProfile(attacker).getSkillLevel(SkillType.ARCHERY);
  51. Location location = defender.getLocation();
  52. int skillCheck = Misc.skillCheck(skillLevel, MAX_BONUS_LEVEL);
  53. if (random.nextInt(10) > 5) {
  54. location.setPitch(90);
  55. }
  56. else {
  57. location.setPitch(-90);
  58. }
  59. if (random.nextInt(2000) <= skillCheck) {
  60. defender.teleport(location);
  61. event.setDamage(event.getDamage() + 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() ; ) { //This is a wee bit confusing...
  73. Entry<Entity, Integer> entry = it.next();
  74. if (entry.getKey() == entity) { //Shouldn't we be using .equals() here?
  75. Misc.dropItems(entity.getLocation(), new ItemStack(Material.ARROW), entry.getValue());
  76. it.remove();
  77. return;
  78. }
  79. }
  80. }
  81. }