From 56455b4c50e24cda69b4389b90efb93075480e69 Mon Sep 17 00:00:00 2001 From: Teriuihi Date: Tue, 11 Feb 2025 23:17:10 +0100 Subject: [PATCH] Fix executor handling in phase transitions and game ending Ensure proper management of executor service during CombatPhase and shutdown when the game ends. Avoids potential resource leaks or invalid executor state during phase transitions. --- src/main/java/com/alttd/ctf/game/RunningGame.java | 4 +++- .../java/com/alttd/ctf/game/phases/CombatPhase.java | 12 +++++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/alttd/ctf/game/RunningGame.java b/src/main/java/com/alttd/ctf/game/RunningGame.java index d376d47..e19d26d 100644 --- a/src/main/java/com/alttd/ctf/game/RunningGame.java +++ b/src/main/java/com/alttd/ctf/game/RunningGame.java @@ -58,13 +58,15 @@ public class RunningGame implements Runnable { } private void nextPhaseActions(@Nullable GamePhase previousPhase, @NotNull GamePhase phase) { - //TODO command to go to next phase this.currentPhase = phase; this.phaseStartTime = Instant.now(); if (previousPhase != null) { gameManager.getPhaseExecutor(previousPhase).end(phase); } gameManager.getPhaseExecutor(phase).start(flag); + if (phase.equals(GamePhase.ENDED)) { + executorService.shutdown(); + } } private static final List NOTIFY_SECONDS = List.of(45, 30, 15, 10, 5, 3, 2, 1); diff --git a/src/main/java/com/alttd/ctf/game/phases/CombatPhase.java b/src/main/java/com/alttd/ctf/game/phases/CombatPhase.java index 987c454..0f9f2ce 100644 --- a/src/main/java/com/alttd/ctf/game/phases/CombatPhase.java +++ b/src/main/java/com/alttd/ctf/game/phases/CombatPhase.java @@ -15,13 +15,15 @@ public class CombatPhase implements GamePhaseExecutor { private ScheduledExecutorService executorService = null; @Override - public void start(Flag flag) { + public synchronized void start(Flag flag) { Bukkit.broadcast(MiniMessage.miniMessage().deserialize("CAPTURE THE FLAG")); flag.spawnFlag(); - if (executorService == null || !executorService.isShutdown()) { - if (executorService != null) { - executorService.shutdown(); - } + if (executorService == null) { + executorService = Executors.newSingleThreadScheduledExecutor(); + } else if (executorService.isTerminated() || executorService.isShutdown()) { + executorService = Executors.newSingleThreadScheduledExecutor(); + } else { + executorService.shutdown(); executorService = Executors.newSingleThreadScheduledExecutor(); } executorService.scheduleAtFixedRate(flag, 0, 1, TimeUnit.SECONDS);