diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/event/PlayerEnterCastingModeEvent.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/event/PlayerEnterCastingModeEvent.java new file mode 100644 index 00000000..bc40bd99 --- /dev/null +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/event/PlayerEnterCastingModeEvent.java @@ -0,0 +1,36 @@ +package net.Indyuce.mmocore.api.event; + +import net.Indyuce.mmocore.api.player.PlayerData; +import org.bukkit.entity.Player; +import org.bukkit.event.Cancellable; +import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; + +public class PlayerEnterCastingModeEvent extends PlayerDataEvent implements Cancellable { + private static final HandlerList handlerList = new HandlerList(); + private boolean cancelled = false; + + public PlayerEnterCastingModeEvent(@NotNull Player who) { + super(PlayerData.get(who.getUniqueId())); + } + + @Override + public boolean isCancelled() { + return cancelled; + } + + @Override + public void setCancelled(boolean cancelled) { + this.cancelled = cancelled; + } + + @NotNull + @Override + public HandlerList getHandlers() { + return getHandlerList(); + } + + public static HandlerList getHandlerList(){ + return handlerList; + } +} diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/event/PlayerExitCastingModeEvent.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/event/PlayerExitCastingModeEvent.java new file mode 100644 index 00000000..6f859a32 --- /dev/null +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/event/PlayerExitCastingModeEvent.java @@ -0,0 +1,38 @@ +package net.Indyuce.mmocore.api.event; + + +import net.Indyuce.mmocore.api.player.PlayerData; +import org.bukkit.entity.Player; +import org.bukkit.event.Cancellable; +import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; + +public class PlayerExitCastingModeEvent extends PlayerDataEvent implements Cancellable { + private static final HandlerList handlerList = new HandlerList(); + private boolean cancelled = false; + + public PlayerExitCastingModeEvent(@NotNull Player who) { + super(PlayerData.get(who.getUniqueId())); + } + + + @Override + public boolean isCancelled() { + return cancelled; + } + + @Override + public void setCancelled(boolean cancelled) { + this.cancelled = cancelled; + } + + @NotNull + @Override + public HandlerList getHandlers() { + return handlerList; + } + + public static HandlerList getHandlerList() { + return handlerList; + } +} diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java index 1375e555..7e9ee45d 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java @@ -10,9 +10,7 @@ import io.lumine.mythic.lib.util.Closeable; import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.ConfigMessage; import net.Indyuce.mmocore.api.SoundEvent; -import net.Indyuce.mmocore.api.event.PlayerExperienceGainEvent; -import net.Indyuce.mmocore.api.event.PlayerLevelUpEvent; -import net.Indyuce.mmocore.api.event.PlayerResourceUpdateEvent; +import net.Indyuce.mmocore.api.event.*; import net.Indyuce.mmocore.api.event.unlocking.ItemLockedEvent; import net.Indyuce.mmocore.api.event.unlocking.ItemUnlockedEvent; import net.Indyuce.mmocore.api.player.attribute.PlayerAttribute; @@ -1005,9 +1003,21 @@ public class PlayerData extends SynchronizedDataHolder implements OfflinePlayerD return skillCasting != null; } - public void setSkillCasting(@NotNull SkillCastingInstance skillCasting) { + /** + * @return true if the PlayerEnterCastingModeEvent successfully put the player into casting mode, otherwise if the event is cancelled, returns false. + * @apiNote Changed to a boolean to reflect the cancellation state of the event being fired + */ + public boolean setSkillCasting(@NotNull SkillCastingInstance skillCasting) { Validate.isTrue(!isCasting(), "Player already in casting mode"); + PlayerEnterCastingModeEvent event = new PlayerEnterCastingModeEvent(getPlayer()); + Bukkit.getPluginManager().callEvent(event); + + if (event.isCancelled()){ + skillCasting.close(); + return false; + } this.skillCasting = skillCasting; + return true; } /** @@ -1023,11 +1033,33 @@ public class PlayerData extends SynchronizedDataHolder implements OfflinePlayerD return Objects.requireNonNull(skillCasting, "Player not in casting mode"); } - public void leaveSkillCasting() { + /** + * API Method to leave casting mode and fire the PlayerExitCastingModeEvent + * @return true if the skill casting mode was left, or false if the event was cancelled, keeping the player in casting mode. + */ + public boolean leaveSkillCasting(){ + return this.leaveSkillCasting(false); + } + + /** + * @param skipEvent Skip Firing the PlayerExitCastingModeEvent + * @return true if the PlayerExitCastingModeEvent is not cancelled, or if the event is skipped. + * + */ + public boolean leaveSkillCasting(boolean skipEvent) { Validate.isTrue(isCasting(), "Player not in casting mode"); + if (!skipEvent) { + PlayerExitCastingModeEvent event = new PlayerExitCastingModeEvent(getPlayer()); + Bukkit.getPluginManager().callEvent(event); + + if (event.isCancelled()) { + return false; + } + } skillCasting.close(); this.skillCasting = null; setLastActivity(PlayerActivity.ACTION_BAR_MESSAGE, 0); // Reset action bar + return true; } public void displayActionBar(String message) { diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/cast/listener/KeyCombos.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/cast/listener/KeyCombos.java index 410ce5d9..e05758e4 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/cast/listener/KeyCombos.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/cast/listener/KeyCombos.java @@ -71,7 +71,7 @@ public class KeyCombos implements SkillCastingListener { public void whenPressingKey(PlayerKeyPressEvent event) { PlayerData playerData = event.getData(); Player player = playerData.getPlayer(); - if(player.getGameMode()== GameMode.CREATIVE&&!MMOCore.plugin.configManager.canCreativeCast) + if (player.getGameMode() == GameMode.CREATIVE && !MMOCore.plugin.configManager.canCreativeCast) return; // Start combo when there is an initializer key @@ -82,8 +82,9 @@ public class KeyCombos implements SkillCastingListener { if (event.getPressed().shouldCancelEvent()) event.setCancelled(true); // Start combo - playerData.setSkillCasting(new CustomSkillCastingInstance(playerData)); - if (beginComboSound != null) beginComboSound.playTo(player); + if (playerData.setSkillCasting(new CustomSkillCastingInstance(playerData)) && beginComboSound != null) + beginComboSound.playTo(player); + } return; } @@ -98,8 +99,8 @@ public class KeyCombos implements SkillCastingListener { final @NotNull ComboMap comboMap = Objects.requireNonNullElse(playerData.getProfess().getComboMap(), this.comboMap); if (comboMap.isComboStart(event.getPressed())) { casting = new CustomSkillCastingInstance(playerData); - playerData.setSkillCasting(casting); - if (beginComboSound != null) beginComboSound.playTo(player); + if (playerData.setSkillCasting(new CustomSkillCastingInstance(playerData)) && beginComboSound != null) + beginComboSound.playTo(player); } } diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/cast/listener/SkillBar.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/cast/listener/SkillBar.java index ca459b64..6f338ff1 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/cast/listener/SkillBar.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/cast/listener/SkillBar.java @@ -56,8 +56,9 @@ public class SkillBar implements SkillCastingListener { // Enter spell casting final PlayerData playerData = event.getData(); if (player.getGameMode() != GameMode.SPECTATOR && (MMOCore.plugin.configManager.canCreativeCast || player.getGameMode() != GameMode.CREATIVE) && !playerData.isCasting() && !playerData.getBoundSkills().isEmpty()) { - playerData.setSkillCasting(new CustomSkillCastingInstance(playerData)); - MMOCore.plugin.soundManager.getSound(SoundEvent.SPELL_CAST_BEGIN).playTo(player); + if (playerData.setSkillCasting(new CustomSkillCastingInstance(playerData))) { + MMOCore.plugin.soundManager.getSound(SoundEvent.SPELL_CAST_BEGIN).playTo(player); + } } } diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/cast/listener/SkillScroller.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/cast/listener/SkillScroller.java index 18bf85bf..48c55fef 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/cast/listener/SkillScroller.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/skill/cast/listener/SkillScroller.java @@ -80,7 +80,10 @@ public class SkillScroller implements SkillCastingListener { if (event.getPressed().shouldCancelEvent()) event.setCancelled(true); // Enter casting mode - playerData.setSkillCasting(new CustomSkillCastingInstance(playerData)); + if (!playerData.setSkillCasting(new CustomSkillCastingInstance(playerData))) { + return; + } + if (enterSound != null) enterSound.playTo(player); }