From e04892156c0baa8fe9b0af779d96060b88a2dad0 Mon Sep 17 00:00:00 2001 From: Teriuihi Date: Sat, 15 Feb 2025 23:44:15 +0100 Subject: [PATCH] Gracefully handle null or offline players in game phases. Added checks to ensure players are online and not null before interacting with them during the game phases. This prevents potential null pointer exceptions and improves overall code robustness. Also added a null check for the executorService in the CombatPhase end method. --- .../java/com/alttd/ctf/game/phases/CombatPhase.java | 4 +++- .../java/com/alttd/ctf/game/phases/GatheringPhase.java | 10 +++++++--- src/main/java/com/alttd/ctf/team/TeamPlayer.java | 5 ++++- 3 files changed, 14 insertions(+), 5 deletions(-) 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 ef90272..1e09953 100644 --- a/src/main/java/com/alttd/ctf/game/phases/CombatPhase.java +++ b/src/main/java/com/alttd/ctf/game/phases/CombatPhase.java @@ -32,6 +32,8 @@ public class CombatPhase implements GamePhaseExecutor { @Override public void end(GamePhase ignored) { - executorService.shutdown(); + if (executorService != null) { + executorService.shutdown(); + } } } diff --git a/src/main/java/com/alttd/ctf/game/phases/GatheringPhase.java b/src/main/java/com/alttd/ctf/game/phases/GatheringPhase.java index 8d1e51a..f2123fc 100644 --- a/src/main/java/com/alttd/ctf/game/phases/GatheringPhase.java +++ b/src/main/java/com/alttd/ctf/game/phases/GatheringPhase.java @@ -4,11 +4,11 @@ import com.alttd.ctf.flag.Flag; import com.alttd.ctf.game.GameManager; import com.alttd.ctf.game.GamePhase; import com.alttd.ctf.game.GamePhaseExecutor; -import com.alttd.ctf.game_class.GameClass; import com.github.yannicklamprecht.worldborder.api.WorldBorderApi; import lombok.extern.slf4j.Slf4j; import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.Bukkit; +import org.bukkit.entity.Player; @Slf4j public class GatheringPhase implements GamePhaseExecutor { @@ -37,8 +37,12 @@ public class GatheringPhase implements GamePhaseExecutor { return; } gameManager.getTeams().forEach(team -> { - team.getPlayers().forEach(player -> { - player.resetWorldBorder(Bukkit.getPlayer(player.getUuid()), worldBorderApi, nextPhase, flag.getFlagLocation()); + team.getPlayers().forEach(teamPlayer -> { + Player player = Bukkit.getPlayer(teamPlayer.getUuid()); + if (player == null || !player.isOnline()) { + return; + } + teamPlayer.resetWorldBorder(player, worldBorderApi, nextPhase, flag.getFlagLocation()); }); }); } diff --git a/src/main/java/com/alttd/ctf/team/TeamPlayer.java b/src/main/java/com/alttd/ctf/team/TeamPlayer.java index 529e243..af47a6e 100644 --- a/src/main/java/com/alttd/ctf/team/TeamPlayer.java +++ b/src/main/java/com/alttd/ctf/team/TeamPlayer.java @@ -50,7 +50,10 @@ public class TeamPlayer { resetWorldBorder(player, worldBorderApi, gamePhase, worldBorderCenter)); } - public void resetWorldBorder(Player player, WorldBorderApi worldBorderApi, GamePhase gamePhase, Location worldBorderCenter) { + public void resetWorldBorder(@NotNull Player player, WorldBorderApi worldBorderApi, GamePhase gamePhase, Location worldBorderCenter) { + if (!player.isOnline()) { + return; + } WorldBorderSettings worldBorderSettings = GameConfig.WORLD_BORDER.getGAME_PHASE_WORLD_BORDER().get(gamePhase); if (worldBorderSettings == null) { throw new IllegalStateException("All phases need to have world border settings");