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.
121 lines
4.5 KiB
Java
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);
|
|
}
|
|
} |