Automatically show class selection when the phase starts

This commit is contained in:
Teriuihi 2025-02-08 20:56:15 +01:00
parent 53de0fe217
commit e93580bea9
3 changed files with 59 additions and 15 deletions

View File

@ -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

View File

@ -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("<green>Select your class</green>"));
Bukkit.broadcast(MiniMessage.miniMessage().deserialize("<green>Select your class with <gold>/ctf selectclass</gold></green>"));
CircularIterator<Team> 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<Integer, List<GameClass>> gameClassesForAllTeams = GameClassRetrieval.getGameClassesForAllTeams(gameManager);
Bukkit.getOnlinePlayers().forEach(player -> {
Optional<TeamPlayer> optionalTeamPlayer = gameManager.getTeamPlayer(player.getUniqueId());
if (optionalTeamPlayer.isEmpty()) {
return;
}
TeamPlayer teamPlayer = optionalTeamPlayer.get();
List<GameClass> 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);
});
});
}

View File

@ -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<Integer, List<GameClass>> getGameClassesForAllTeams(GameManager gameManager) {
final HashMap<Integer, List<GameClass>> gameClasses = new HashMap<>();
gameManager.getTeams().forEach(team -> {
gameClasses.putAll(getGameClassesForTeam(team));
});
return gameClasses;
}
public static HashMap<Integer, List<GameClass>> getGameClassesForTeam(Team team) {
final HashMap<Integer, List<GameClass>> 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;
}
}