diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/PlayerActivity.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/PlayerActivity.java index 65f523c9..5c602d0a 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/PlayerActivity.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/PlayerActivity.java @@ -23,7 +23,7 @@ public enum PlayerActivity { CAST_SKILL(() -> MMOCore.plugin.configManager.globalSkillCooldown), - ; + ENTER_CASTING(null); private final Provider timeout; 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 48cbc5ef..0616392b 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 @@ -1007,13 +1007,7 @@ public class PlayerData extends SynchronizedDataHolder implements OfflinePlayerD @Deprecated 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()) return false; - - skillCasting.close(); - setSkillCasting(); - return true; + return setSkillCasting(); } /** @@ -1025,8 +1019,8 @@ public class PlayerData extends SynchronizedDataHolder implements OfflinePlayerD PlayerEnterCastingModeEvent event = new PlayerEnterCastingModeEvent(getPlayer()); Bukkit.getPluginManager().callEvent(event); if (event.isCancelled()) return false; - this.skillCasting = SkillCastingMode.getCurrent().newInstance(this); + setLastActivity(PlayerActivity.ENTER_CASTING); return true; } @@ -1062,10 +1056,26 @@ public class PlayerData extends SynchronizedDataHolder implements OfflinePlayerD return true; } - public boolean isCastingTimeoutExpired(){ - return isCasting() && System.currentTimeMillis() - getLastActivity(PlayerActivity.CAST_SKILL) > (MMOCore.plugin.configManager.castingTimeoutTime * 1000L) && MMOCore.plugin.configManager.castingTimeoutTime > 0; + public boolean isCastingTimeoutExpired() { + if (MMOCore.plugin.configManager.castingTimeoutTime <= 0) return false; + if (!isCasting()) return false; + + long lastSkillCastTime = getLastActivity(PlayerActivity.CAST_SKILL); + long lastEnterCastingTime = getLastActivity(PlayerActivity.ENTER_CASTING); + + // If the player is in casting mode but has not yet cast a skill, use the enter casting time + if (lastSkillCastTime == 0L) + lastSkillCastTime = lastEnterCastingTime; + + long lastActivityTime = Math.max(lastSkillCastTime, lastEnterCastingTime); + long timeSinceLastActivity = System.currentTimeMillis() - lastActivityTime; + long castingTimeoutMillis = MMOCore.plugin.configManager.castingTimeoutTime * 1000L; + + return timeSinceLastActivity > castingTimeoutMillis; } + + public void displayActionBar(String message) { setLastActivity(PlayerActivity.ACTION_BAR_MESSAGE); getPlayer().spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText(message));