ctf/src/main/java/com/alttd/ctf/commands/CommandManager.java
Teriuihi 73c11ab1ca Add GUI framework for class selection in CTF
Introduced a GUI system to facilitate class selection in the CTF game. This includes an abstract GUIInventory, GUIListener for event handling, and a ClassSelectionGUI for selecting classes. Also, added the "selectclass" command and integrated the GUI with game mechanics for improved player interaction.
2025-02-07 23:22:50 +01:00

121 lines
4.5 KiB
Java

package com.alttd.ctf.commands;
import com.alttd.ctf.Main;
import com.alttd.ctf.commands.subcommands.*;
import com.alttd.ctf.config.Messages;
import com.alttd.ctf.flag.Flag;
import com.alttd.ctf.game.GameManager;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
import org.bukkit.command.*;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
@Getter
@Slf4j
public class CommandManager implements CommandExecutor, TabExecutor {
private final List<SubCommand> subCommands;
public CommandManager(Main main, GameManager gameManager, Flag flag) {
PluginCommand command = main.getCommand("ctf");
if (command == null) {
subCommands = null;
log.error("Unable to find transfer command.");
return;
}
command.setExecutor(this);
command.setTabCompleter(this);
subCommands = Arrays.asList(
new ChangeTeam(gameManager),
new Start(gameManager, flag),
new CreateTeam(main, gameManager),
new SelectClass(gameManager),
new Reload(main)
);
}
@Override
public boolean onCommand(@NotNull CommandSender commandSender, @NotNull Command command, @NotNull String cmd, @NotNull String[] args) {
if (args.length == 0) {
commandSender.sendRichMessage(Messages.HELP.HELP_MESSAGE_WRAPPER.replaceAll("<commands>", subCommands.stream()
.filter(subCommand -> commandSender.hasPermission(subCommand.getPermission()))
.map(SubCommand::getHelpMessage)
.collect(Collectors.joining("\n"))));
return true;
}
SubCommand subCommand = getSubCommand(args[0]);
if (subCommand == null)
return false;
if (!commandSender.hasPermission(subCommand.getPermission())) {
commandSender.sendRichMessage(Messages.GENERIC.NO_PERMISSION, Placeholder.parsed("permission", subCommand.getPermission()));
return true;
}
int failedPos = subCommand.onCommand(commandSender, args);
if (failedPos > 0) {
commandSender.sendRichMessage(String.format("<hover:show_text:'%s'>%s</hover>",
getHoverText(command.getName(), args, failedPos),
subCommand.getHelpMessage()));
} else if (failedPos < 0) {
commandSender.sendRichMessage(subCommand.getHelpMessage());
}
return true;
}
private String getHoverText(String commandName, String[] args, int failedPos) {
StringBuilder hoverText = new StringBuilder();
hoverText.append("<green>/").append(commandName);
for (int i = 0; i < failedPos; i++) {
hoverText.append(" ").append(args[i]);
}
hoverText.append("</green>");
if (failedPos < args.length) {
hoverText.append(" <red>").append(args[failedPos]).append("</red>");
}
for (int i = failedPos + 1; i < args.length; i++) {
hoverText.append(" <yellow>").append(args[i]).append("</yellow>");
}
return hoverText.toString();
}
@Override
public @Nullable List<String> onTabComplete(@NotNull CommandSender commandSender, @NotNull Command command, @NotNull String cmd, @NotNull String[] args) {
List<String> res = new ArrayList<>();
if (args.length <= 1) {
res.addAll(subCommands.stream()
.filter(subCommand -> commandSender.hasPermission(subCommand.getPermission()))
.map(SubCommand::getName)
.filter(name -> args.length == 0 || name.startsWith(args[0]))
.toList()
);
} else {
SubCommand subCommand = getSubCommand(args[0]);
if (subCommand != null && commandSender.hasPermission(subCommand.getPermission()))
res.addAll(subCommand.getTabComplete(commandSender, args).stream()
.filter(str -> str.toLowerCase().startsWith(args[args.length - 1].toLowerCase()))
.toList());
}
return res;
}
private SubCommand getSubCommand(String cmdName) {
return subCommands.stream()
.filter(subCommand -> subCommand.getName().equals(cmdName))
.findFirst()
.orElse(null);
}
}