EventUtils.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  1. package com.gmail.nossr50.util;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. import org.bukkit.block.Block;
  5. import org.bukkit.enchantments.Enchantment;
  6. import org.bukkit.entity.Fish;
  7. import org.bukkit.entity.Player;
  8. import org.bukkit.event.player.PlayerFishEvent;
  9. import org.bukkit.inventory.ItemStack;
  10. import org.bukkit.plugin.PluginManager;
  11. import com.gmail.nossr50.mcMMO;
  12. import com.gmail.nossr50.datatypes.party.Party;
  13. import com.gmail.nossr50.datatypes.player.McMMOPlayer;
  14. import com.gmail.nossr50.datatypes.player.PlayerProfile;
  15. import com.gmail.nossr50.datatypes.skills.AbilityType;
  16. import com.gmail.nossr50.datatypes.skills.SecondaryAbility;
  17. import com.gmail.nossr50.datatypes.skills.SkillType;
  18. import com.gmail.nossr50.datatypes.skills.XPGainReason;
  19. import com.gmail.nossr50.events.experience.McMMOPlayerLevelChangeEvent;
  20. import com.gmail.nossr50.events.experience.McMMOPlayerLevelDownEvent;
  21. import com.gmail.nossr50.events.experience.McMMOPlayerLevelUpEvent;
  22. import com.gmail.nossr50.events.experience.McMMOPlayerXpGainEvent;
  23. import com.gmail.nossr50.events.fake.FakeBlockBreakEvent;
  24. import com.gmail.nossr50.events.fake.FakeBlockDamageEvent;
  25. import com.gmail.nossr50.events.fake.FakePlayerAnimationEvent;
  26. import com.gmail.nossr50.events.fake.FakePlayerFishEvent;
  27. import com.gmail.nossr50.events.hardcore.McMMOPlayerPreDeathPenaltyEvent;
  28. import com.gmail.nossr50.events.hardcore.McMMOPlayerStatLossEvent;
  29. import com.gmail.nossr50.events.hardcore.McMMOPlayerVampirismEvent;
  30. import com.gmail.nossr50.events.party.McMMOPartyLevelUpEvent;
  31. import com.gmail.nossr50.events.party.McMMOPartyTeleportEvent;
  32. import com.gmail.nossr50.events.party.McMMOPartyXpGainEvent;
  33. import com.gmail.nossr50.events.skills.abilities.McMMOPlayerAbilityActivateEvent;
  34. import com.gmail.nossr50.events.skills.abilities.McMMOPlayerAbilityDeactivateEvent;
  35. import com.gmail.nossr50.events.skills.fishing.McMMOPlayerFishingTreasureEvent;
  36. import com.gmail.nossr50.events.skills.fishing.McMMOPlayerMagicHunterEvent;
  37. import com.gmail.nossr50.events.skills.repair.McMMOPlayerRepairCheckEvent;
  38. import com.gmail.nossr50.events.skills.secondaryabilities.SecondaryAbilityEvent;
  39. import com.gmail.nossr50.events.skills.unarmed.McMMOPlayerDisarmEvent;
  40. import com.gmail.nossr50.locale.LocaleLoader;
  41. import com.gmail.nossr50.util.player.UserManager;
  42. public class EventUtils {
  43. public static McMMOPlayerAbilityActivateEvent callPlayerAbilityActivateEvent(Player player, SkillType skill) {
  44. McMMOPlayerAbilityActivateEvent event = new McMMOPlayerAbilityActivateEvent(player, skill);
  45. mcMMO.p.getServer().getPluginManager().callEvent(event);
  46. return event;
  47. }
  48. public static SecondaryAbilityEvent callSecondaryAbilityEvent(Player player, SecondaryAbility secondaryAbility) {
  49. SecondaryAbilityEvent event = new SecondaryAbilityEvent(player, secondaryAbility);
  50. mcMMO.p.getServer().getPluginManager().callEvent(event);
  51. return event;
  52. }
  53. public static FakePlayerAnimationEvent callFakeArmSwingEvent(Player player) {
  54. FakePlayerAnimationEvent event = new FakePlayerAnimationEvent(player);
  55. mcMMO.p.getServer().getPluginManager().callEvent(event);
  56. return event;
  57. }
  58. public static boolean handleLevelChangeEvent(Player player, SkillType skill, int levelsChanged, float xpRemoved, boolean isLevelUp, XPGainReason xpGainReason) {
  59. McMMOPlayerLevelChangeEvent event = isLevelUp ? new McMMOPlayerLevelUpEvent(player, skill, levelsChanged, xpGainReason) : new McMMOPlayerLevelDownEvent(player, skill, levelsChanged, xpGainReason);
  60. mcMMO.p.getServer().getPluginManager().callEvent(event);
  61. boolean isCancelled = event.isCancelled();
  62. if (isCancelled) {
  63. PlayerProfile profile = UserManager.getPlayer(player).getProfile();
  64. profile.modifySkill(skill, profile.getSkillLevel(skill) - (isLevelUp ? levelsChanged : -levelsChanged));
  65. profile.addXp(skill, xpRemoved);
  66. }
  67. return !isCancelled;
  68. }
  69. /**
  70. * Simulate a block break event.
  71. *
  72. * @param block The block to break
  73. * @param player The player breaking the block
  74. * @param shouldArmSwing true if an armswing event should be fired, false otherwise
  75. * @return true if the event wasn't cancelled, false otherwise
  76. */
  77. public static boolean simulateBlockBreak(Block block, Player player, boolean shouldArmSwing) {
  78. PluginManager pluginManager = mcMMO.p.getServer().getPluginManager();
  79. // Support for NoCheat
  80. if (shouldArmSwing) {
  81. callFakeArmSwingEvent(player);
  82. }
  83. FakeBlockDamageEvent damageEvent = new FakeBlockDamageEvent(player, block, player.getInventory().getItemInMainHand(), true);
  84. pluginManager.callEvent(damageEvent);
  85. FakeBlockBreakEvent breakEvent = new FakeBlockBreakEvent(block, player);
  86. pluginManager.callEvent(breakEvent);
  87. return !damageEvent.isCancelled() && !breakEvent.isCancelled();
  88. }
  89. public static void handlePartyTeleportEvent(Player teleportingPlayer, Player targetPlayer) {
  90. McMMOPlayer mcMMOPlayer = UserManager.getPlayer(teleportingPlayer);
  91. McMMOPartyTeleportEvent event = new McMMOPartyTeleportEvent(teleportingPlayer, targetPlayer, mcMMOPlayer.getParty().getName());
  92. mcMMO.p.getServer().getPluginManager().callEvent(event);
  93. if (event.isCancelled()) {
  94. return;
  95. }
  96. teleportingPlayer.teleport(targetPlayer);
  97. teleportingPlayer.sendMessage(LocaleLoader.getString("Party.Teleport.Player", targetPlayer.getName()));
  98. targetPlayer.sendMessage(LocaleLoader.getString("Party.Teleport.Target", teleportingPlayer.getName()));
  99. mcMMOPlayer.getPartyTeleportRecord().actualizeLastUse();
  100. }
  101. public static boolean handlePartyXpGainEvent(Party party, float xpGained) {
  102. McMMOPartyXpGainEvent event = new McMMOPartyXpGainEvent(party, xpGained);
  103. mcMMO.p.getServer().getPluginManager().callEvent(event);
  104. boolean isCancelled = event.isCancelled();
  105. if (!isCancelled) {
  106. party.addXp(event.getRawXpGained());
  107. }
  108. return !isCancelled;
  109. }
  110. public static boolean handlePartyLevelChangeEvent(Party party, int levelsChanged, float xpRemoved) {
  111. McMMOPartyLevelUpEvent event = new McMMOPartyLevelUpEvent(party, levelsChanged);
  112. mcMMO.p.getServer().getPluginManager().callEvent(event);
  113. boolean isCancelled = event.isCancelled();
  114. if (isCancelled) {
  115. party.setLevel(party.getLevel() + levelsChanged);
  116. party.addXp(xpRemoved);
  117. }
  118. return !isCancelled;
  119. }
  120. public static boolean handleXpGainEvent(Player player, SkillType skill, float xpGained, XPGainReason xpGainReason) {
  121. McMMOPlayerXpGainEvent event = new McMMOPlayerXpGainEvent(player, skill, xpGained, xpGainReason);
  122. mcMMO.p.getServer().getPluginManager().callEvent(event);
  123. boolean isCancelled = event.isCancelled();
  124. if (!isCancelled) {
  125. UserManager.getPlayer(player).addXp(skill, event.getRawXpGained());
  126. UserManager.getPlayer(player).getProfile().registerXpGain(skill, event.getRawXpGained());
  127. }
  128. return !isCancelled;
  129. }
  130. public static boolean handleStatsLossEvent(Player player, HashMap<String, Integer> levelChanged, HashMap<String, Float> experienceChanged) {
  131. McMMOPlayerStatLossEvent event = new McMMOPlayerStatLossEvent(player, levelChanged, experienceChanged);
  132. mcMMO.p.getServer().getPluginManager().callEvent(event);
  133. boolean isCancelled = event.isCancelled();
  134. if (!isCancelled) {
  135. levelChanged = event.getLevelChanged();
  136. experienceChanged = event.getExperienceChanged();
  137. PlayerProfile playerProfile = UserManager.getPlayer(player).getProfile();
  138. for (SkillType skillType : SkillType.NON_CHILD_SKILLS) {
  139. String skillName = skillType.toString();
  140. int playerSkillLevel = playerProfile.getSkillLevel(skillType);
  141. playerProfile.modifySkill(skillType, playerSkillLevel - levelChanged.get(skillName));
  142. playerProfile.removeXp(skillType, experienceChanged.get(skillName));
  143. if (playerProfile.getSkillXpLevel(skillType) < 0) {
  144. playerProfile.setSkillXpLevel(skillType, 0);
  145. }
  146. if (playerProfile.getSkillLevel(skillType) < 0) {
  147. playerProfile.modifySkill(skillType, 0);
  148. }
  149. }
  150. }
  151. return !isCancelled;
  152. }
  153. public static boolean handleVampirismEvent(Player killer, Player victim, HashMap<String, Integer> levelChanged, HashMap<String, Float> experienceChanged) {
  154. McMMOPlayerVampirismEvent eventKiller = new McMMOPlayerVampirismEvent(killer, false, levelChanged, experienceChanged);
  155. McMMOPlayerVampirismEvent eventVictim = new McMMOPlayerVampirismEvent(victim, true, levelChanged, experienceChanged);
  156. mcMMO.p.getServer().getPluginManager().callEvent(eventKiller);
  157. mcMMO.p.getServer().getPluginManager().callEvent(eventVictim);
  158. boolean isCancelled = eventKiller.isCancelled() || eventVictim.isCancelled();
  159. if (!isCancelled) {
  160. HashMap<String, Integer> levelChangedKiller = eventKiller.getLevelChanged();
  161. HashMap<String, Float> experienceChangedKiller = eventKiller.getExperienceChanged();
  162. HashMap<String, Integer> levelChangedVictim = eventVictim.getLevelChanged();
  163. HashMap<String, Float> experienceChangedVictim = eventVictim.getExperienceChanged();
  164. McMMOPlayer killerPlayer = UserManager.getPlayer(killer);
  165. PlayerProfile victimProfile = UserManager.getPlayer(victim).getProfile();
  166. for (SkillType skillType : SkillType.NON_CHILD_SKILLS) {
  167. String skillName = skillType.toString();
  168. int victimSkillLevel = victimProfile.getSkillLevel(skillType);
  169. killerPlayer.addLevels(skillType, levelChangedKiller.get(skillName));
  170. killerPlayer.beginUnsharedXpGain(skillType, experienceChangedKiller.get(skillName), XPGainReason.VAMPIRISM);
  171. victimProfile.modifySkill(skillType, victimSkillLevel - levelChangedVictim.get(skillName));
  172. victimProfile.removeXp(skillType, experienceChangedVictim.get(skillName));
  173. if (victimProfile.getSkillXpLevel(skillType) < 0) {
  174. victimProfile.setSkillXpLevel(skillType, 0);
  175. }
  176. if (victimProfile.getSkillLevel(skillType) < 0) {
  177. victimProfile.modifySkill(skillType, 0);
  178. }
  179. }
  180. }
  181. return !isCancelled;
  182. }
  183. public static McMMOPlayerAbilityDeactivateEvent callAbilityDeactivateEvent(Player player, AbilityType ability) {
  184. McMMOPlayerAbilityDeactivateEvent event = new McMMOPlayerAbilityDeactivateEvent(player, SkillType.byAbility(ability));
  185. mcMMO.p.getServer().getPluginManager().callEvent(event);
  186. return event;
  187. }
  188. public static McMMOPlayerFishingTreasureEvent callFishingTreasureEvent(Player player, ItemStack treasureDrop, int treasureXp, Map<Enchantment, Integer> enchants) {
  189. McMMOPlayerFishingTreasureEvent event = enchants.isEmpty() ? new McMMOPlayerFishingTreasureEvent(player, treasureDrop, treasureXp) : new McMMOPlayerMagicHunterEvent(player, treasureDrop, treasureXp, enchants);
  190. mcMMO.p.getServer().getPluginManager().callEvent(event);
  191. return event;
  192. }
  193. public static FakePlayerFishEvent callFakeFishEvent(Player player, Fish hook) {
  194. FakePlayerFishEvent event = new FakePlayerFishEvent(player, null, hook, PlayerFishEvent.State.FISHING);
  195. mcMMO.p.getServer().getPluginManager().callEvent(event);
  196. return event;
  197. }
  198. public static McMMOPlayerRepairCheckEvent callRepairCheckEvent(Player player, short durability, ItemStack repairMaterial, ItemStack repairedObject) {
  199. McMMOPlayerRepairCheckEvent event = new McMMOPlayerRepairCheckEvent(player, durability, repairMaterial, repairedObject);
  200. mcMMO.p.getServer().getPluginManager().callEvent(event);
  201. return event;
  202. }
  203. public static McMMOPlayerPreDeathPenaltyEvent callPreDeathPenaltyEvent(Player player) {
  204. McMMOPlayerPreDeathPenaltyEvent event = new McMMOPlayerPreDeathPenaltyEvent(player);
  205. mcMMO.p.getServer().getPluginManager().callEvent(event);
  206. return event;
  207. }
  208. public static McMMOPlayerDisarmEvent callDisarmEvent(Player defender) {
  209. McMMOPlayerDisarmEvent event = new McMMOPlayerDisarmEvent(defender);
  210. mcMMO.p.getServer().getPluginManager().callEvent(event);
  211. return event;
  212. }
  213. }