From e93580bea97b229ebd6bd6b9d13bcc915774c8c6 Mon Sep 17 00:00:00 2001 From: Teriuihi Date: Sat, 8 Feb 2025 20:56:15 +0100 Subject: [PATCH] Automatically show class selection when the phase starts --- .../ctf/commands/subcommands/SelectClass.java | 12 ++----- .../ctf/game/phases/ClassSelectionPhase.java | 31 ++++++++++++++++--- .../ctf/game_class/GameClassRetrieval.java | 31 +++++++++++++++++++ 3 files changed, 59 insertions(+), 15 deletions(-) create mode 100644 src/main/java/com/alttd/ctf/game_class/GameClassRetrieval.java diff --git a/src/main/java/com/alttd/ctf/commands/subcommands/SelectClass.java b/src/main/java/com/alttd/ctf/commands/subcommands/SelectClass.java index 5ab25e7..37abacd 100644 --- a/src/main/java/com/alttd/ctf/commands/subcommands/SelectClass.java +++ b/src/main/java/com/alttd/ctf/commands/subcommands/SelectClass.java @@ -5,16 +5,13 @@ import com.alttd.ctf.config.Messages; import com.alttd.ctf.game.GameManager; import com.alttd.ctf.game.GamePhase; import com.alttd.ctf.game_class.GameClass; -import com.alttd.ctf.game_class.creation.EngineerCreator; -import com.alttd.ctf.game_class.creation.FighterCreator; -import com.alttd.ctf.game_class.creation.TankCreator; +import com.alttd.ctf.game_class.GameClassRetrieval; import com.alttd.ctf.gui.ClassSelectionGUI; import com.alttd.ctf.team.TeamPlayer; import com.github.yannicklamprecht.worldborder.api.WorldBorderApi; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Optional; @@ -28,12 +25,7 @@ public class SelectClass extends SubCommand { public SelectClass(GameManager gameManager, WorldBorderApi worldBorderApi) { this.gameManager = gameManager; this.worldBorderApi = worldBorderApi; - this.gameClasses = new HashMap<>(); - gameManager.getTeams().forEach(team -> { - gameClasses.computeIfAbsent(team.getId(), teamId -> new ArrayList<>()).add(FighterCreator.createFighter(team.getColor())); - gameClasses.computeIfAbsent(team.getId(), teamId -> new ArrayList<>()).add(TankCreator.createTank(team.getColor())); - gameClasses.computeIfAbsent(team.getId(), teamId -> new ArrayList<>()).add(EngineerCreator.createEngineer(team.getColor())); - }); + gameClasses = GameClassRetrieval.getGameClassesForAllTeams(gameManager); } @Override diff --git a/src/main/java/com/alttd/ctf/game/phases/ClassSelectionPhase.java b/src/main/java/com/alttd/ctf/game/phases/ClassSelectionPhase.java index 9259e44..7c09024 100644 --- a/src/main/java/com/alttd/ctf/game/phases/ClassSelectionPhase.java +++ b/src/main/java/com/alttd/ctf/game/phases/ClassSelectionPhase.java @@ -5,6 +5,8 @@ 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.alttd.ctf.game_class.GameClassRetrieval; +import com.alttd.ctf.gui.ClassSelectionGUI; import com.alttd.ctf.team.Team; import com.alttd.ctf.team.TeamColor; import com.alttd.ctf.team.TeamPlayer; @@ -14,8 +16,11 @@ import lombok.extern.slf4j.Slf4j; import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import org.bukkit.Bukkit; +import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; +import java.util.HashMap; +import java.util.List; import java.util.Optional; @Slf4j @@ -39,7 +44,7 @@ public class ClassSelectionPhase implements GamePhaseExecutor { @Override public void start(Flag flag) { - Bukkit.broadcast(MiniMessage.miniMessage().deserialize("Select your class")); + Bukkit.broadcast(MiniMessage.miniMessage().deserialize("Select your class with /ctf selectclass")); CircularIterator teamCircularIterator = new CircularIterator<>(gameManager.getTeams()); if (teamCircularIterator.hasNext()) { Bukkit.getOnlinePlayers().stream() @@ -53,6 +58,17 @@ public class ClassSelectionPhase implements GamePhaseExecutor { log.warn("No teams to add players to"); } teleportPlayersToStartingZone(); + HashMap> gameClassesForAllTeams = GameClassRetrieval.getGameClassesForAllTeams(gameManager); + Bukkit.getOnlinePlayers().forEach(player -> { + Optional optionalTeamPlayer = gameManager.getTeamPlayer(player.getUniqueId()); + if (optionalTeamPlayer.isEmpty()) { + return; + } + TeamPlayer teamPlayer = optionalTeamPlayer.get(); + List gameClasses = gameClassesForAllTeams.get(teamPlayer.getTeam().getId()); + new ClassSelectionGUI(gameClasses, teamPlayer, worldBorderApi, GamePhase.CLASS_SELECTION) + .open(player); + }); } private void teleportPlayersToStartingZone() { @@ -75,12 +91,17 @@ public class ClassSelectionPhase implements GamePhaseExecutor { public void end(GamePhase nextPhase) { gameManager.getTeams().forEach(team -> { GameClass defaultClass = defaultClassCreator.apply(team.getColor()); - team.getPlayers().forEach(player -> { - player.resetWorldBorder(Bukkit.getPlayer(player.getUuid()), worldBorderApi, nextPhase, team.getWorldBorderCenter()); - if (player.getGameClass() != null) { + team.getPlayers().forEach(teamPlayer -> { + Player player = Bukkit.getPlayer(teamPlayer.getUuid()); + if (player == null || !player.isOnline()) { + log.debug("Tried to reset world border for offline player"); return; } - defaultClass.apply(player, worldBorderApi, nextPhase, false); + teamPlayer.resetWorldBorder(player, worldBorderApi, nextPhase, team.getWorldBorderCenter()); + if (teamPlayer.getGameClass() != null) { + return; + } + defaultClass.apply(teamPlayer, worldBorderApi, nextPhase, false); }); }); } diff --git a/src/main/java/com/alttd/ctf/game_class/GameClassRetrieval.java b/src/main/java/com/alttd/ctf/game_class/GameClassRetrieval.java new file mode 100644 index 0000000..5e77365 --- /dev/null +++ b/src/main/java/com/alttd/ctf/game_class/GameClassRetrieval.java @@ -0,0 +1,31 @@ +package com.alttd.ctf.game_class; + +import com.alttd.ctf.game.GameManager; +import com.alttd.ctf.game_class.creation.EngineerCreator; +import com.alttd.ctf.game_class.creation.FighterCreator; +import com.alttd.ctf.game_class.creation.TankCreator; +import com.alttd.ctf.team.Team; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public class GameClassRetrieval { + + public static HashMap> getGameClassesForAllTeams(GameManager gameManager) { + final HashMap> gameClasses = new HashMap<>(); + gameManager.getTeams().forEach(team -> { + gameClasses.putAll(getGameClassesForTeam(team)); + }); + return gameClasses; + } + + public static HashMap> getGameClassesForTeam(Team team) { + final HashMap> gameClasses = new HashMap<>(); + gameClasses.computeIfAbsent(team.getId(), teamId -> new ArrayList<>()).add(FighterCreator.createFighter(team.getColor())); + gameClasses.computeIfAbsent(team.getId(), teamId -> new ArrayList<>()).add(TankCreator.createTank(team.getColor())); + gameClasses.computeIfAbsent(team.getId(), teamId -> new ArrayList<>()).add(EngineerCreator.createEngineer(team.getColor())); + return gameClasses; + } + +}