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;
+ }
+
+}