From 4953cec215930c091225e10d7c1efaab3c376cde Mon Sep 17 00:00:00 2001 From: Teriuihi Date: Thu, 6 Mar 2025 19:47:28 +0100 Subject: [PATCH] Make game logic adjustments and improve async command handling Added permission checks for players bypassing game actions and refined block event handling based on game phase. Introduced asynchronous handling for permission commands to improve server performance. Updated constructors and dependencies to streamline game phase management. --- src/main/java/com/alttd/ctf/Main.java | 4 +++- .../ctf/events/OnPlayerOnlineStatus.java | 6 +++-- .../com/alttd/ctf/events/OtherGameEvents.java | 10 ++++++--- .../java/com/alttd/ctf/game/GameManager.java | 5 +++-- .../com/alttd/ctf/game/phases/EndedPhase.java | 22 ++++++++++++------- .../java/com/alttd/ctf/stats/PlayerStat.java | 17 ++++++++++++-- version.properties | 4 ++-- 7 files changed, 48 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/alttd/ctf/Main.java b/src/main/java/com/alttd/ctf/Main.java index c204143..44aad60 100644 --- a/src/main/java/com/alttd/ctf/Main.java +++ b/src/main/java/com/alttd/ctf/Main.java @@ -8,6 +8,7 @@ import com.alttd.ctf.events.*; import com.alttd.ctf.flag.Flag; import com.alttd.ctf.flag.FlagTryCaptureEvent; import com.alttd.ctf.game.GameManager; +import com.alttd.ctf.game.phases.EndedPhase; import com.alttd.ctf.gui.ClassSelectionGUI; import com.alttd.ctf.gui.GUIInventory; import com.alttd.ctf.gui.GUIListener; @@ -38,6 +39,7 @@ public class Main extends JavaPlugin { @Override public void onEnable() { + PlayerStat.main = this; GUIInventory.setMain(this); // sorry ClassSelectionGUI.setMain(this); // sorry Package pkg = Main.class.getPackage(); @@ -46,7 +48,7 @@ public class Main extends JavaPlugin { reloadConfigs(); WorldBorderApi worldBorderApi = worldBorder(); - this.gameManager = new GameManager(worldBorderApi); + this.gameManager = new GameManager(this, worldBorderApi); registerTeams(); //Skipped in reloadConfig if gameManager is not created yet loadPlayerStats(); //Skipped in reloadConfig if gameManager is not created yet Flag flag = new Flag(this, gameManager); diff --git a/src/main/java/com/alttd/ctf/events/OnPlayerOnlineStatus.java b/src/main/java/com/alttd/ctf/events/OnPlayerOnlineStatus.java index 8e28b64..7b4975a 100644 --- a/src/main/java/com/alttd/ctf/events/OnPlayerOnlineStatus.java +++ b/src/main/java/com/alttd/ctf/events/OnPlayerOnlineStatus.java @@ -40,9 +40,11 @@ public class OnPlayerOnlineStatus implements Listener { public void onPlayerJoin(PlayerJoinEvent event) { Player player = event.getPlayer(); resetPlayer(player); - handleRunningGame(player); + if (!player.hasPermission("ctf.bypass")) { + handleRunningGame(player); + } handleDiscordLink(player); - gameManager.getTeamPlayer(player).ifPresent(teamPlayer -> + gameManager.getTeamPlayer(player).ifPresent(teamPlayer -> player.teleportAsync(teamPlayer.getTeam().getSpawnLocation())); } diff --git a/src/main/java/com/alttd/ctf/events/OtherGameEvents.java b/src/main/java/com/alttd/ctf/events/OtherGameEvents.java index 0fc72f7..410f523 100644 --- a/src/main/java/com/alttd/ctf/events/OtherGameEvents.java +++ b/src/main/java/com/alttd/ctf/events/OtherGameEvents.java @@ -1,6 +1,7 @@ package com.alttd.ctf.events; import com.alttd.ctf.game.GameManager; +import com.alttd.ctf.game.GamePhase; import com.alttd.ctf.stats.Stat; import com.alttd.ctf.team.TeamPlayer; import lombok.extern.slf4j.Slf4j; @@ -12,6 +13,7 @@ import org.bukkit.entity.ThrownPotion; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.entity.PotionSplashEvent; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; @@ -29,7 +31,8 @@ public class OtherGameEvents implements Listener { @EventHandler public void onBlockBreak(BlockBreakEvent event) { - if (gameManager.getGamePhase().isEmpty()) { + Optional gamePhase = gameManager.getGamePhase(); + if (gamePhase.isEmpty() || gamePhase.get() == GamePhase.ENDED) { return; } if (!Tag.SNOW.isTagged(event.getBlock().getType())) { @@ -41,8 +44,9 @@ public class OtherGameEvents implements Listener { } @EventHandler - public void onBlockPlace(BlockBreakEvent event) { - if (gameManager.getGamePhase().isEmpty()) { + public void onBlockPlace(BlockPlaceEvent event) { + Optional gamePhase = gameManager.getGamePhase(); + if (gamePhase.isEmpty() || gamePhase.get() == GamePhase.ENDED) { return; } if (!Tag.SNOW.isTagged(event.getBlock().getType())) { diff --git a/src/main/java/com/alttd/ctf/game/GameManager.java b/src/main/java/com/alttd/ctf/game/GameManager.java index 7a4191c..001891f 100644 --- a/src/main/java/com/alttd/ctf/game/GameManager.java +++ b/src/main/java/com/alttd/ctf/game/GameManager.java @@ -1,5 +1,6 @@ package com.alttd.ctf.game; +import com.alttd.ctf.Main; import com.alttd.ctf.flag.Flag; import com.alttd.ctf.game.phases.ClassSelectionPhase; import com.alttd.ctf.game.phases.CombatPhase; @@ -27,12 +28,12 @@ public class GameManager { private final HashMap teams = new HashMap<>(); private final HashMap playerStats = new HashMap<>(); - public GameManager(WorldBorderApi worldBorderApi) { + public GameManager(Main main, WorldBorderApi worldBorderApi) { phases = new HashMap<>(); phases.put(GamePhase.CLASS_SELECTION, new ClassSelectionPhase(this, FighterCreator::createFighter, worldBorderApi)); phases.put(GamePhase.GATHERING, new GatheringPhase(this, worldBorderApi)); phases.put(GamePhase.COMBAT, new CombatPhase()); - phases.put(GamePhase.ENDED, new EndedPhase(this)); + phases.put(GamePhase.ENDED, new EndedPhase(main, this)); } public Optional getGamePhase() { diff --git a/src/main/java/com/alttd/ctf/game/phases/EndedPhase.java b/src/main/java/com/alttd/ctf/game/phases/EndedPhase.java index cc08894..7f026a5 100644 --- a/src/main/java/com/alttd/ctf/game/phases/EndedPhase.java +++ b/src/main/java/com/alttd/ctf/game/phases/EndedPhase.java @@ -1,5 +1,6 @@ package com.alttd.ctf.game.phases; +import com.alttd.ctf.Main; import com.alttd.ctf.config.GameConfig; import com.alttd.ctf.flag.Flag; import com.alttd.ctf.game.GameManager; @@ -28,9 +29,11 @@ import java.util.Map; public class EndedPhase implements GamePhaseExecutor { private final MiniMessage miniMessage = MiniMessage.miniMessage(); + private final Main main; private final GameManager gameManager; - public EndedPhase(GameManager gameManager) { + public EndedPhase(Main main, GameManager gameManager) { + this.main = main; this.gameManager = gameManager; } @@ -91,14 +94,17 @@ public class EndedPhase implements GamePhaseExecutor { Placeholder.component("team", winner.getName()), Placeholder.parsed("score", String.valueOf(highestScore)))); ConsoleCommandSender consoleSender = Bukkit.getConsoleSender(); - winner.getPlayers().forEach(teamPlayer -> { - OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(teamPlayer.getUuid()); - String name = offlinePlayer.getName(); - if (name == null) { - return; - } - Bukkit.dispatchCommand(consoleSender, String.format("lp user %s permission settemp ctf.victory.%s true 14d", name, winner.getId())); + Bukkit.getScheduler().runTaskAsynchronously(main, () -> { + winner.getPlayers().forEach(teamPlayer -> { + OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(teamPlayer.getUuid()); + String name = offlinePlayer.getName(); + if (name == null) { + return; + } + Bukkit.dispatchCommand(consoleSender, String.format("lp user %s permission settemp ctf.victory.%s true 14d", name, winner.getId())); + }); }); + if (wins.size() <= 1) { return messages; } diff --git a/src/main/java/com/alttd/ctf/stats/PlayerStat.java b/src/main/java/com/alttd/ctf/stats/PlayerStat.java index 2b414ce..a31ff32 100644 --- a/src/main/java/com/alttd/ctf/stats/PlayerStat.java +++ b/src/main/java/com/alttd/ctf/stats/PlayerStat.java @@ -1,5 +1,7 @@ package com.alttd.ctf.stats; +import com.alttd.ctf.Main; +import com.alttd.ctf.config.GameConfig; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Getter; @@ -19,6 +21,9 @@ import java.util.UUID; @RequiredArgsConstructor @Getter public final class PlayerStat { + @JsonIgnore + public static Main main; + @JsonIgnore private boolean touched; @JsonIgnore @@ -48,7 +53,12 @@ public final class PlayerStat { switch (stat) { case COMPLETED_GAME -> { if (!completedGame) { - Bukkit.dispatchCommand(commandSender, String.format("lp user %s permission settemp ctf.game.completed true 14d", inGameName)); + Bukkit.getScheduler().runTask(main, () -> { + Bukkit.getScheduler().runTaskAsynchronously(main, () -> { + Bukkit.dispatchCommand(commandSender, String.format("lp user %s permission settemp ctf.game.completed true 14d", inGameName)); + }); + }); + } completedGame = true; } @@ -73,7 +83,10 @@ public final class PlayerStat { } Bukkit.broadcast(MiniMessage.miniMessage().deserialize(" will receive a consolation prize for being the first to die in powdered snow.", Placeholder.component("player",player.displayName()))); - Bukkit.dispatchCommand(commandSender, String.format("lp user %s permission settemp ctf.game.first_powdered_snow_death true 14d", inGameName)); + Bukkit.getScheduler().runTaskAsynchronously(main, () -> { + Bukkit.dispatchCommand(commandSender, String.format("lp user %s permission settemp ctf.game.first_powdered_snow_death true 14d", inGameName)); + }); + someoneDiedInPowderedSnow = true; } case DAMAGE_DONE, DAMAGE_HEALED -> throw new IllegalArgumentException(String.format("%s requires a number", stat.name())); diff --git a/version.properties b/version.properties index 8e744b1..780809e 100644 --- a/version.properties +++ b/version.properties @@ -1,3 +1,3 @@ -#Sat Mar 01 22:40:35 CET 2025 -buildNumber=110 +#Sun Mar 02 00:42:30 CET 2025 +buildNumber=112 version=0.1