ctf/src/main/java/com/alttd/ctf/commands/subcommands/ChangeTeam.java
Teriuihi 5a87784d71 Add JSON configuration support and new team management commands
Introduced JSON-based configuration handling for teams using Jackson and validation utilities. Added commands for reloading configurations and creating teams with support for saving and loading team data. Refactored related classes to integrate with the new system.
2025-01-24 20:12:27 +01:00

108 lines
4.1 KiB
Java

package com.alttd.ctf.commands.subcommands;
import com.alttd.ctf.commands.SubCommand;
import com.alttd.ctf.config.Messages;
import com.alttd.ctf.game.GameManager;
import com.alttd.ctf.team.Team;
import lombok.AllArgsConstructor;
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.List;
import java.util.Optional;
@AllArgsConstructor
public class ChangeTeam extends SubCommand {
private final GameManager gameManager;
@FunctionalInterface
private interface ChangeTeamConsumer {
int apply(Player player, Team team);
}
@Override
public int onCommand(CommandSender commandSender, String[] args) {
return handle(commandSender, args, (player, team) -> {
changeTeam(commandSender, player, team);
return 0;
});
}
private int handle(CommandSender commandSender, String[] args, ChangeTeamConsumer consumer) {
if (args.length != 3) {
return -1;
}
Player player = Bukkit.getPlayer(args[1]);
if (player == null) {
commandSender.sendRichMessage("<red>Please provide a valid player</red>");
return 1;
}
int teamId;
try {
teamId = Integer.parseInt(args[2]);
} catch (NumberFormatException e) {
commandSender.sendRichMessage(String.format("<red>Please enter a valid integer, %s is not a valid integer</red>", args[2]));
return 2;
}
Optional<Team> optionalTeam = gameManager.getTeams().stream().filter(team -> team.getId() == teamId).findFirst();
if (optionalTeam.isEmpty()) {
commandSender.sendRichMessage(String.format("<red>Please provide a valid team id %d is not a valid team id</red>", teamId));
return 3;
}
return consumer.apply(player, optionalTeam.get());
}
private void changeTeam(CommandSender commandSender, Player player, Team team) {
Optional<Team> optionalOldTeam = gameManager.getTeam(player.getUniqueId());
if (optionalOldTeam.isPresent()) {
moveBetweenTeams(commandSender, player, team, optionalOldTeam.get());
return;
}
gameManager.registerPlayer(team, player);
commandSender.sendRichMessage("<green><player> has been placed in <team>.</green>",
TagResolver.resolver(
Placeholder.component("player", player.displayName()),
Placeholder.component("team", team.getName())));
}
private void moveBetweenTeams(CommandSender commandSender, Player player, Team newTeam, Team oldTeam) {
if (oldTeam.equals(newTeam)) {
commandSender.sendRichMessage("<green><player> was already in <team>, nothing has changed.</green>",
TagResolver.resolver(
Placeholder.component("player", player.displayName()),
Placeholder.component("team", newTeam.getName())));
return;
}
gameManager.registerPlayer(newTeam, player);
commandSender.sendRichMessage("<green><player> has been moved from <old_team> to <new_team>.</green>",
TagResolver.resolver(
Placeholder.component("player", player.displayName()),
Placeholder.component("old_team", oldTeam.getName())),
Placeholder.component("new_team", newTeam.getName()));
}
@Override
public String getName() {
return "changeteam";
}
@Override
public List<String> getTabComplete(CommandSender commandSender, String[] args) {
return switch (args.length) {
case 2 -> Bukkit.getOnlinePlayers().stream().map(Player::getName).toList();
case 3 -> gameManager.getTeams().stream().map(Team::getId).map(Object::toString).toList();
default -> List.of();
};
}
@Override
public String getHelpMessage() {
return Messages.HELP.CHANGE_TEAM;
}
}