2
0

EventUtils.java 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472
  1. package com.gmail.nossr50.util;
  2. import com.gmail.nossr50.config.Config;
  3. import com.gmail.nossr50.datatypes.party.Party;
  4. import com.neetgames.mcmmo.player.OnlineMMOPlayer;
  5. import com.gmail.nossr50.datatypes.player.PlayerProfile;
  6. import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
  7. import com.gmail.nossr50.datatypes.skills.SubSkillType;
  8. import com.gmail.nossr50.datatypes.skills.SuperAbilityType;
  9. import com.gmail.nossr50.datatypes.skills.subskills.AbstractSubSkill;
  10. import com.gmail.nossr50.events.experience.McMMOPlayerLevelChangeEvent;
  11. import com.gmail.nossr50.events.experience.McMMOPlayerLevelDownEvent;
  12. import com.gmail.nossr50.events.experience.McMMOPlayerLevelUpEvent;
  13. import com.gmail.nossr50.events.experience.McMMOPlayerXpGainEvent;
  14. import com.gmail.nossr50.events.fake.*;
  15. import com.gmail.nossr50.events.hardcore.McMMOPlayerPreDeathPenaltyEvent;
  16. import com.gmail.nossr50.events.hardcore.McMMOPlayerStatLossEvent;
  17. import com.gmail.nossr50.events.hardcore.McMMOPlayerVampirismEvent;
  18. import com.gmail.nossr50.events.party.McMMOPartyLevelUpEvent;
  19. import com.gmail.nossr50.events.party.McMMOPartyTeleportEvent;
  20. import com.gmail.nossr50.events.party.McMMOPartyXpGainEvent;
  21. import com.gmail.nossr50.events.players.McMMOPlayerProfileLoadEvent;
  22. import com.gmail.nossr50.events.skills.abilities.McMMOPlayerAbilityActivateEvent;
  23. import com.gmail.nossr50.events.skills.abilities.McMMOPlayerAbilityDeactivateEvent;
  24. import com.gmail.nossr50.events.skills.fishing.McMMOPlayerFishingTreasureEvent;
  25. import com.gmail.nossr50.events.skills.fishing.McMMOPlayerMagicHunterEvent;
  26. import com.gmail.nossr50.events.skills.repair.McMMOPlayerRepairCheckEvent;
  27. import com.gmail.nossr50.events.skills.salvage.McMMOPlayerSalvageCheckEvent;
  28. import com.gmail.nossr50.events.skills.secondaryabilities.SubSkillEvent;
  29. import com.gmail.nossr50.events.skills.unarmed.McMMOPlayerDisarmEvent;
  30. import com.gmail.nossr50.locale.LocaleLoader;
  31. import com.gmail.nossr50.mcMMO;
  32. import com.gmail.nossr50.util.skills.CombatUtils;
  33. import org.bukkit.block.Block;
  34. import org.bukkit.enchantments.Enchantment;
  35. import org.bukkit.entity.Entity;
  36. import org.bukkit.entity.FishHook;
  37. import org.bukkit.entity.LivingEntity;
  38. import org.bukkit.entity.Player;
  39. import org.bukkit.event.Event;
  40. import org.bukkit.event.entity.EntityDamageEvent;
  41. import org.bukkit.event.player.PlayerFishEvent;
  42. import org.bukkit.inventory.ItemStack;
  43. import org.bukkit.plugin.Plugin;
  44. import org.bukkit.plugin.PluginManager;
  45. import org.jetbrains.annotations.NotNull;
  46. import java.util.HashMap;
  47. import java.util.Map;
  48. /**
  49. * This class is meant to help make event related code less boilerplate
  50. */
  51. public final class EventUtils {
  52. /**
  53. * This is a static utility class, therefore we don't want any instances of
  54. * this class. Making the constructor private prevents accidents like that.
  55. */
  56. private EventUtils() {}
  57. /*
  58. * Quality of Life methods
  59. */
  60. /**
  61. * This is a simple check to see if an {@link Event} is fake or not.
  62. * {@link FakeEvent FakeEvents} should not be processed like normally and maybe even
  63. * be ignored by other {@link Plugin plugins} completely.
  64. *
  65. * @param event The {@link Event} in question
  66. * @return Whether this {@link Event} has been faked by mcMMO and should not be processed normally.
  67. */
  68. public static boolean isFakeEvent(@NotNull Event event) {
  69. return event instanceof FakeEvent;
  70. }
  71. /**
  72. * Checks to see if damage is from natural sources
  73. * This cannot be used to determine if damage is from vanilla MC, it just checks to see if the damage is from a complex behaviour in mcMMO such as bleed.
  74. *
  75. * @param event this event
  76. * @return true if damage is NOT from an unnatural mcMMO skill (such as bleed DOTs)
  77. */
  78. public static boolean isDamageFromMcMMOComplexBehaviour(@NotNull Event event) {
  79. return event instanceof FakeEntityDamageEvent;
  80. }
  81. /**
  82. * This little method is just to make the code more readable
  83. *
  84. * @param entity target entity
  85. * @return the associated OnlineMMOPlayer for this entity
  86. */
  87. public static OnlineMMOPlayer getMcMMOPlayer(@NotNull Entity entity)
  88. {
  89. return mcMMO.getUserManager().queryPlayer((Player)entity);
  90. }
  91. /**
  92. * Checks to see if a Player was damaged in this EntityDamageEvent
  93. *
  94. * This method checks for the following things and if they are all true it returns true
  95. *
  96. * 1) The player is real and not an NPC
  97. * 2) The player is not in god mode
  98. * 3) The damage dealt is above 0
  99. * 4) The player is loaded into our mcMMO user profiles
  100. *
  101. * @param entityDamageEvent
  102. * @return
  103. */
  104. public static boolean isRealPlayerDamaged(@NotNull EntityDamageEvent entityDamageEvent)
  105. {
  106. //Make sure the damage is above 0
  107. double damage = entityDamageEvent.getFinalDamage();
  108. if (damage <= 0) {
  109. return false;
  110. }
  111. Entity entity = entityDamageEvent.getEntity();
  112. //Check to make sure the entity is not an NPC
  113. if(Misc.isNPCEntityExcludingVillagers(entity))
  114. return false;
  115. if (!entity.isValid() || !(entity instanceof LivingEntity)) {
  116. return false;
  117. }
  118. LivingEntity livingEntity = (LivingEntity) entity;
  119. if (CombatUtils.isInvincible(livingEntity, damage)) {
  120. return false;
  121. }
  122. if (livingEntity instanceof Player) {
  123. Player player = (Player) entity;
  124. if (!mcMMO.getUserManager().hasPlayerDataKey(player)) {
  125. return true;
  126. }
  127. OnlineMMOPlayer mmoPlayer = mcMMO.getUserManager().queryPlayer(player);
  128. if(mmoPlayer == null)
  129. {
  130. return true;
  131. }
  132. /* Check for invincibility */
  133. if (mmoPlayer.getGodMode()) {
  134. entityDamageEvent.setCancelled(true);
  135. return false;
  136. }
  137. return true;
  138. } else {
  139. return false;
  140. }
  141. }
  142. /*
  143. * Others
  144. */
  145. public static @NotNull McMMOPlayerAbilityActivateEvent callPlayerAbilityActivateEvent(@NotNull Player player, @NotNull PrimarySkillType skill) {
  146. McMMOPlayerAbilityActivateEvent event = new McMMOPlayerAbilityActivateEvent(player, skill);
  147. mcMMO.p.getServer().getPluginManager().callEvent(event);
  148. return event;
  149. }
  150. public static @NotNull McMMOPlayerProfileLoadEvent callPlayerProfileLoadEvent(@NotNull Player player, @NotNull PlayerProfile profile){
  151. McMMOPlayerProfileLoadEvent event = new McMMOPlayerProfileLoadEvent(player, profile);
  152. mcMMO.p.getServer().getPluginManager().callEvent(event);
  153. return event;
  154. }
  155. /**
  156. * Calls a new SubSkillEvent for this SubSkill and then returns it
  157. * @param player target player
  158. * @param subSkillType target subskill
  159. * @return the event after it has been fired
  160. */
  161. @Deprecated
  162. public static SubSkillEvent callSubSkillEvent(Player player, SubSkillType subSkillType) {
  163. SubSkillEvent event = new SubSkillEvent(player, subSkillType);
  164. mcMMO.p.getServer().getPluginManager().callEvent(event);
  165. return event;
  166. }
  167. /**
  168. * Calls a new SubSkillEvent for this SubSkill and then returns it
  169. * @param player target player
  170. * @param abstractSubSkill target subskill
  171. * @return the event after it has been fired
  172. */
  173. public static SubSkillEvent callSubSkillEvent(Player player, AbstractSubSkill abstractSubSkill) {
  174. SubSkillEvent event = new SubSkillEvent(player, abstractSubSkill);
  175. mcMMO.p.getServer().getPluginManager().callEvent(event);
  176. return event;
  177. }
  178. public static FakePlayerAnimationEvent callFakeArmSwingEvent(Player player) {
  179. FakePlayerAnimationEvent event = new FakePlayerAnimationEvent(player);
  180. mcMMO.p.getServer().getPluginManager().callEvent(event);
  181. return event;
  182. }
  183. public static boolean tryLevelChangeEvent(Player player, PrimarySkillType skill, int levelsChanged, float xpRemoved, boolean isLevelUp, XPGainReason xpGainReason) {
  184. McMMOPlayerLevelChangeEvent event = isLevelUp ? new McMMOPlayerLevelUpEvent(player, skill, levelsChanged, xpGainReason) : new McMMOPlayerLevelDownEvent(player, skill, levelsChanged, xpGainReason);
  185. mcMMO.p.getServer().getPluginManager().callEvent(event);
  186. boolean isCancelled = event.isCancelled();
  187. if (isCancelled) {
  188. PlayerProfile profile = mcMMO.getUserManager().queryPlayer(player);
  189. profile.getExperienceHandler().setSkillLevel(skill, profile.getSkillLevel(skill) - (isLevelUp ? levelsChanged : -levelsChanged));
  190. profile.addXp(skill, xpRemoved);
  191. }
  192. return isCancelled;
  193. }
  194. public static boolean tryLevelEditEvent(Player player, PrimarySkillType skill, int levelsChanged, float xpRemoved, boolean isLevelUp, XPGainReason xpGainReason, int oldLevel) {
  195. McMMOPlayerLevelChangeEvent event = isLevelUp ? new McMMOPlayerLevelUpEvent(player, skill, levelsChanged - oldLevel, xpGainReason) : new McMMOPlayerLevelDownEvent(player, skill, levelsChanged, xpGainReason);
  196. mcMMO.p.getServer().getPluginManager().callEvent(event);
  197. boolean isCancelled = event.isCancelled();
  198. if (isCancelled) {
  199. PlayerProfile profile = mcMMO.getUserManager().queryPlayer(player);
  200. profile.modifySkill(skill, profile.getSkillLevel(skill) - (isLevelUp ? levelsChanged : -levelsChanged));
  201. profile.addXp(skill, xpRemoved);
  202. }
  203. return isCancelled;
  204. }
  205. /**
  206. * Simulate a block break event.
  207. *
  208. * @param block The block to break
  209. * @param player The player breaking the block
  210. * @param shouldArmSwing true if an armswing event should be fired, false otherwise
  211. * @return true if the event wasn't cancelled, false otherwise
  212. */
  213. public static boolean simulateBlockBreak(Block block, Player player, boolean shouldArmSwing) {
  214. PluginManager pluginManager = mcMMO.p.getServer().getPluginManager();
  215. // Support for NoCheat
  216. if (shouldArmSwing) {
  217. callFakeArmSwingEvent(player);
  218. }
  219. FakeBlockDamageEvent damageEvent = new FakeBlockDamageEvent(player, block, player.getInventory().getItemInMainHand(), true);
  220. pluginManager.callEvent(damageEvent);
  221. FakeBlockBreakEvent breakEvent = new FakeBlockBreakEvent(block, player);
  222. pluginManager.callEvent(breakEvent);
  223. return !damageEvent.isCancelled() && !breakEvent.isCancelled();
  224. }
  225. public static void handlePartyTeleportEvent(Player teleportingPlayer, Player targetPlayer) {
  226. OnlineMMOPlayer mmoPlayer = mcMMO.getUserManager().queryPlayer(teleportingPlayer);
  227. if(mmoPlayer == null)
  228. return;
  229. McMMOPartyTeleportEvent event = new McMMOPartyTeleportEvent(teleportingPlayer, targetPlayer, mmoPlayer.getParty().getName());
  230. mcMMO.p.getServer().getPluginManager().callEvent(event);
  231. if (event.isCancelled()) {
  232. return;
  233. }
  234. teleportingPlayer.teleport(targetPlayer);
  235. teleportingPlayer.sendMessage(LocaleLoader.getString("Party.Teleport.Player", targetPlayer.getName()));
  236. targetPlayer.sendMessage(LocaleLoader.getString("Party.Teleport.Target", teleportingPlayer.getName()));
  237. mmoPlayer.getPartyTeleportRecord().actualizeLastUse();
  238. }
  239. public static boolean handlePartyXpGainEvent(Party party, float xpGained) {
  240. McMMOPartyXpGainEvent event = new McMMOPartyXpGainEvent(party, xpGained);
  241. mcMMO.p.getServer().getPluginManager().callEvent(event);
  242. boolean isCancelled = event.isCancelled();
  243. if (!isCancelled) {
  244. party.addXp(event.getRawXpGained());
  245. }
  246. return !isCancelled;
  247. }
  248. public static boolean handlePartyLevelChangeEvent(Party party, int levelsChanged, float xpRemoved) {
  249. McMMOPartyLevelUpEvent event = new McMMOPartyLevelUpEvent(party, levelsChanged);
  250. mcMMO.p.getServer().getPluginManager().callEvent(event);
  251. boolean isCancelled = event.isCancelled();
  252. if (isCancelled) {
  253. party.setLevel(party.getLevel() + levelsChanged);
  254. party.addXp(xpRemoved);
  255. }
  256. return !isCancelled;
  257. }
  258. public static boolean handleXpGainEvent(Player player, PrimarySkillType skill, float xpGained, XPGainReason xpGainReason) {
  259. McMMOPlayerXpGainEvent event = new McMMOPlayerXpGainEvent(player, skill, xpGained, xpGainReason);
  260. mcMMO.p.getServer().getPluginManager().callEvent(event);
  261. boolean isCancelled = event.isCancelled();
  262. if (!isCancelled) {
  263. mcMMO.getUserManager().queryPlayer(player).addXp(skill, event.getRawXpGained());
  264. mcMMO.getUserManager().queryPlayer(player).registerXpGain(skill, event.getRawXpGained());
  265. }
  266. return !isCancelled;
  267. }
  268. public static boolean handleStatsLossEvent(Player player, HashMap<String, Integer> levelChanged, HashMap<String, Float> experienceChanged) {
  269. if(mcMMO.getUserManager().queryPlayer(player) == null)
  270. return true;
  271. McMMOPlayerStatLossEvent event = new McMMOPlayerStatLossEvent(player, levelChanged, experienceChanged);
  272. mcMMO.p.getServer().getPluginManager().callEvent(event);
  273. boolean isCancelled = event.isCancelled();
  274. if (!isCancelled) {
  275. levelChanged = event.getLevelChanged();
  276. experienceChanged = event.getExperienceChanged();
  277. PlayerProfile playerProfile = mcMMO.getUserManager().queryPlayer(player);
  278. for (PrimarySkillType primarySkillType : PrimarySkillType.NON_CHILD_SKILLS) {
  279. String skillName = primarySkillType.toString();
  280. int playerSkillLevel = playerProfile.getSkillLevel(primarySkillType);
  281. int threshold = Config.getInstance().getHardcoreDeathStatPenaltyLevelThreshold();
  282. if(playerSkillLevel > threshold) {
  283. playerProfile.modifySkill(primarySkillType, Math.max(threshold, playerSkillLevel - levelChanged.get(skillName)));
  284. playerProfile.removeXp(primarySkillType, experienceChanged.get(skillName));
  285. if (playerProfile.getSkillXpLevel(primarySkillType) < 0) {
  286. playerProfile.setSkillXpLevel(primarySkillType, 0);
  287. }
  288. if (playerProfile.getSkillLevel(primarySkillType) < 0) {
  289. playerProfile.modifySkill(primarySkillType, 0);
  290. }
  291. }
  292. }
  293. }
  294. return !isCancelled;
  295. }
  296. public static boolean handleVampirismEvent(Player killer, Player victim, HashMap<String, Integer> levelChanged, HashMap<String, Float> experienceChanged) {
  297. McMMOPlayerVampirismEvent eventKiller = new McMMOPlayerVampirismEvent(killer, false, levelChanged, experienceChanged);
  298. McMMOPlayerVampirismEvent eventVictim = new McMMOPlayerVampirismEvent(victim, true, levelChanged, experienceChanged);
  299. mcMMO.p.getServer().getPluginManager().callEvent(eventKiller);
  300. mcMMO.p.getServer().getPluginManager().callEvent(eventVictim);
  301. boolean isCancelled = eventKiller.isCancelled() || eventVictim.isCancelled();
  302. if (!isCancelled) {
  303. HashMap<String, Integer> levelChangedKiller = eventKiller.getLevelChanged();
  304. HashMap<String, Float> experienceChangedKiller = eventKiller.getExperienceChanged();
  305. HashMap<String, Integer> levelChangedVictim = eventVictim.getLevelChanged();
  306. HashMap<String, Float> experienceChangedVictim = eventVictim.getExperienceChanged();
  307. OnlineMMOPlayer killerPlayer = mcMMO.getUserManager().queryPlayer(killer);
  308. //Not loaded
  309. if(killerPlayer == null)
  310. return true;
  311. //Not loaded
  312. if(mcMMO.getUserManager().queryPlayer(victim) == null)
  313. return true;
  314. PlayerProfile victimProfile = mcMMO.getUserManager().queryPlayer(victim);
  315. for (PrimarySkillType primarySkillType : PrimarySkillType.NON_CHILD_SKILLS) {
  316. String skillName = primarySkillType.toString();
  317. int victimSkillLevel = victimProfile.getSkillLevel(primarySkillType);
  318. killerPlayer.addLevels(primarySkillType, levelChangedKiller.get(skillName));
  319. killerPlayer.beginUnsharedXpGain(primarySkillType, experienceChangedKiller.get(skillName), XPGainReason.VAMPIRISM, XPGainSource.VAMPIRISM);
  320. victimProfile.modifySkill(primarySkillType, victimSkillLevel - levelChangedVictim.get(skillName));
  321. victimProfile.removeXp(primarySkillType, experienceChangedVictim.get(skillName));
  322. if (victimProfile.getSkillXpLevel(primarySkillType) < 0) {
  323. victimProfile.setSkillXpLevel(primarySkillType, 0);
  324. }
  325. if (victimProfile.getSkillLevel(primarySkillType) < 0) {
  326. victimProfile.modifySkill(primarySkillType, 0);
  327. }
  328. }
  329. }
  330. return !isCancelled;
  331. }
  332. public static McMMOPlayerAbilityDeactivateEvent callAbilityDeactivateEvent(Player player, SuperAbilityType ability) {
  333. McMMOPlayerAbilityDeactivateEvent event = new McMMOPlayerAbilityDeactivateEvent(player, PrimarySkillType.byAbility(ability));
  334. mcMMO.p.getServer().getPluginManager().callEvent(event);
  335. return event;
  336. }
  337. public static McMMOPlayerFishingTreasureEvent callFishingTreasureEvent(Player player, ItemStack treasureDrop, int treasureXp, Map<Enchantment, Integer> enchants) {
  338. McMMOPlayerFishingTreasureEvent event = enchants.isEmpty() ? new McMMOPlayerFishingTreasureEvent(player, treasureDrop, treasureXp) : new McMMOPlayerMagicHunterEvent(player, treasureDrop, treasureXp, enchants);
  339. mcMMO.p.getServer().getPluginManager().callEvent(event);
  340. return event;
  341. }
  342. public static FakePlayerFishEvent callFakeFishEvent(Player player, FishHook hook) {
  343. FakePlayerFishEvent event = new FakePlayerFishEvent(player, null, hook, PlayerFishEvent.State.FISHING);
  344. mcMMO.p.getServer().getPluginManager().callEvent(event);
  345. return event;
  346. }
  347. public static McMMOPlayerRepairCheckEvent callRepairCheckEvent(Player player, short durability, ItemStack repairMaterial, ItemStack repairedObject) {
  348. McMMOPlayerRepairCheckEvent event = new McMMOPlayerRepairCheckEvent(player, durability, repairMaterial, repairedObject);
  349. mcMMO.p.getServer().getPluginManager().callEvent(event);
  350. return event;
  351. }
  352. public static McMMOPlayerPreDeathPenaltyEvent callPreDeathPenaltyEvent(Player player) {
  353. McMMOPlayerPreDeathPenaltyEvent event = new McMMOPlayerPreDeathPenaltyEvent(player);
  354. mcMMO.p.getServer().getPluginManager().callEvent(event);
  355. return event;
  356. }
  357. public static McMMOPlayerDisarmEvent callDisarmEvent(Player defender) {
  358. McMMOPlayerDisarmEvent event = new McMMOPlayerDisarmEvent(defender);
  359. mcMMO.p.getServer().getPluginManager().callEvent(event);
  360. return event;
  361. }
  362. public static McMMOPlayerSalvageCheckEvent callSalvageCheckEvent(Player player, ItemStack salvageMaterial, ItemStack salvageResults, ItemStack enchantedBook) {
  363. McMMOPlayerSalvageCheckEvent event = new McMMOPlayerSalvageCheckEvent(player, salvageMaterial, salvageResults, enchantedBook);
  364. mcMMO.p.getServer().getPluginManager().callEvent(event);
  365. return event;
  366. }
  367. }