Die Command Manager API ist in der Developer API enthaltene API um Commands mit SubCommands zu erstellen und es garnicht so schwer.
Initialization
Als erstes muss man eine neue Klasse die der Command Manager werden soll erstellen. Diese Klasse muss dann die Klasse de.happybavarian07.adminpanel.commandmanagement.CommandManager extenden und die Methoden müssen implementiert werden. Die Methoden Namen sind wahrscheinlich ziemlich selbsterklärend aber ganz unten kommt nochmal ein gesamt Beispiel. Dann muss man der Klasse die Annotation @de.happybavarian07.adminpanel.commandmanagement.CommandData hinzufügen und der Parameter ist auch selbst erklärend. Die Methoden onCommand müssen wenn man nichts verändern will und es sich leicht machen will einfach für den Spieler return super.onCommand(player, args); und für die Console return super.onCommand(sender, args); enthalten und nichts weiteres. Für Tab Complete ist es return super.onTabComplete(sender, command, label, args);. In der Setup Methode registriert man alle Sub Commands, indem man sie der Liste hinzufügt so: commands.add(new <SubCommand>());.
Danach muss man nur noch in der onEnable Methode des Plugins das auf meine API zugreift gehen und AdminPanelMain.getAPI().registerCommandManager(new SuperCommandManager()); ausführen. Mein Plugin wird den Rest übernehmen und den Command registrieren (ohne plugin.yml oder sontiges). Momentan wird der Command dann noch den Prefix admin-panel haben aber vielleicht gebe ich später noch eine Option für sowas.
Übrigens, falls es noch nicht klar war: getJavaPlugin steht für das Plugin was auf die API zugreift also dein Plugin für den der Command sein soll.
Sub Commands
Die Sub Commands kann man über die Setup Methode im Manager hinzufügen, aber dafür muss man erst einen erstellen (Ich habe unter dem Manager Example ein Help Command Example hinzugefügt, den man nutzen kann aber nicht muss). Also man fängt damit an, dass man eine Klasse erstellt die die Klasse de.happybavarian07.adminpanel.commandmanagement.SubCommand extended. Danach implementiert man die Methoden und fühlt sie mit Daten aus (getName() = "Sub Command Name", etc). Dann muss man in onPlayerCommand und onConsoleCommand den Code hinzufügen der ausgeführt werden soll (onPlayerCommand = Player Code, onConsoleCommand = Console Code). Wenn man Unter Argumente hat im Sub Command kann man mit der Methode subArgs diese auflisten für den Tab Completer und mein Plugin wird dann alles handeln. Wenn man Aliases haben möchte muss man natürlich es in die aliases Methode eintragen. Eine weitere Info: Wenn man möchte das der Sub Command speziell nur für Spieler sein sollte dann einfach auch hier die CommandData Annotation hinzufügen mit playerRequired auf true. Wenn man bei den Sub Commands den playerRequired auf true / false macht, muss natürlich im Command Manager die Annotation auf false gesetzt werden um den Check auszuschalten der dafür sorgt, dass der ganze Command nur für Spieler / für alle ist
Weitere Nützliche Klassen
Ich habe unter anderem eine Klasse hinzugefügt mit der man eine Liste an Objekten in eine Liste mit Seiten machen kann. Diese Klasse heißt PaginatedList und kann benutzt werden wann immer man mag. Zum Beispiel:
PaginatedList<SubCommand> subCommandsSorted = new PaginatedList<>(plugin.getCommandManagerRegistry().getSubCommands("example"));
subCommandsSorted.maxItemsPerPage(10).sort();
System.out.println(subCommandsSorted.toString());
Full Code Example
package de.happybavarian07.adminpanel.commands.managers;
/*
* @Author HappyBavarian07
* @Date 27.04.2022 | 17:07
*/
import de.happybavarian07.adminpanel.commandmanagement.CommandData;
import de.happybavarian07.adminpanel.commandmanagement.CommandManager;
import de.happybavarian07.adminpanel.commandmanagement.SubCommand;
import de.happybavarian07.adminpanel.commands.subcommands.panelopencommands.HelpCommand;
import de.happybavarian07.adminpanel.commands.subcommands.panelopencommands.panels.playermanager.*;
import de.happybavarian07.adminpanel.commands.subcommands.panelopencommands.panels.pluginmanager.*;
import de.happybavarian07.adminpanel.commands.subcommands.panelopencommands.panels.servermanager.*;
import de.happybavarian07.adminpanel.commands.subcommands.panelopencommands.panels.worldmanager.*;
import de.happybavarian07.adminpanel.commands.subcommands.panelopencommands.panels.*;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.entity.Player;
import java.util.Collections;
import java.util.List;
// getJavaPlugin kann ein Plugin sein man kann aber auch einfach adminpanel reinschreiben,
// dann wird der Command mit dem Admin-Panel registriert und erhält admin-panel als Prefix
@CommandData(playerRequired = false)
public class ExampleCommandManager extends CommandManager {
@Override
public String getCommandName() {
return "example";
}
@Override
public String getCommandUsage() {
/*
*/
return "/example<SubCommand> (openpanel help <Page>)";
}
@Override
public JavaPlugin getJavaPlugin() {
return adminpanel;
}
@Override
public String getCommandInfo() {
return "Read the Example message and do a flip";
}
@Override
public List<String> getCommandAliases() {
return Collections.singletonList("ex");
}
@Override
public String getCommandPermission() {
return "The.CommandManager.Example";
}
@Override
public boolean onCommand(Player player, String[] args) {
return super.onCommand(player, args);
}
@Override
public boolean onCommand(ConsoleCommandSender player, String[] args) {
return super.onCommand(player, args);
}
@Override
public List<String> onTabComplete(CommandSender sender, Command command, String label, String[] args) {
return super.onTabComplete(sender, command, label, args);
}
@Override
public void setup() {
commands.add(new SuperDuperCommand());
}
@Override
public List<SubCommand> getSubCommands() {
return commands;
}
}
Help Command Example
package de.happybavarian07.adminpanel.commands.subcommands.panelopencommands;
/*
* @Author HappyBavarian07
* @Date 05.10.2021 | 17:53
*/
import de.happybavarian07.adminpanel.commandmanagement.PaginatedList;
import de.happybavarian07.adminpanel.commandmanagement.SubCommand;
import de.happybavarian07.adminpanel.main.PlaceholderType;
import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.entity.Player;
import java.util.HashMap;
import java.util.Map;
@CommandData
// Diese Klasse nimmt sich eine Liste aller Sub Commands des Befehls
// und sortiert diese und setzt ein Maximum pro Seite.
// Danach muss man nur noch durch die Liste durchgehen wie hier oder halt auch anders
public class HelpCommand extends SubCommand {
@Override
public boolean onPlayerCommand(Player player, String[] args) {
if (args.length != 1) {
return false;
}
try {
int page = Integer.parseInt(args[0]);
PaginatedList<SubCommand> messages = new PaginatedList<>(plugin.getCommandManagerRegistry().getSubCommands("openpanel"));
messages.maxItemsPerPage(10).sort();
lgm.addPlaceholder(PlaceholderType.MESSAGE, "%page%", page, false);
if (!messages.containsPage(page)) {
player.sendMessage(lgm.getMessage("Player.Commands.HelpPageDoesNotExist", player, true));
return true;
}
lgm.addPlaceholder(PlaceholderType.MESSAGE, "%max_page%", messages.getMaxPage(), false);
player.sendMessage(lgm.getMessage("Player.Commands.HelpMessages.Header", player, false));
for (SubCommand s : messages.getPage(page)) {
if(player.hasPermission(s.permission())) {
player.sendMessage(format(lgm.getMessage("Player.Commands.HelpMessages.Format", player, false), s));
}
}
player.sendMessage(lgm.getMessage("Player.Commands.HelpMessages.Footer", player, true));
} catch (NumberFormatException e) {
player.sendMessage(lgm.getMessage("Player.Commands.NotANumber", player, true));
return true;
} catch (PaginatedList.ListNotSortedException e2) {
e2.printStackTrace();
return true;
}
return true;
}
@Override
public boolean onConsoleCommand(ConsoleCommandSender sender, String[] args) {
if (args.length != 1) {
return false;
}
try {
int page = Integer.parseInt(args[0]);
PaginatedList<SubCommand> messages = new PaginatedList<>(plugin.getCommandManagerRegistry().getSubCommands("openpanel"));
messages.maxItemsPerPage(10).sort();
lgm.addPlaceholder(PlaceholderType.MESSAGE, "%page%", page, false);
if (!messages.containsPage(page)) {
sender.sendMessage(lgm.getMessage("Player.Commands.HelpPageDoesNotExist", null, true));
return true;
}
lgm.addPlaceholder(PlaceholderType.MESSAGE, "%max_page%", messages.getMaxPage(), false);
sender.sendMessage(lgm.getMessage("Player.Commands.HelpMessages.Header", null, false));
for (SubCommand s : messages.getPage(page)) {
if(sender.hasPermission(s.permission())) {
sender.sendMessage(format(lgm.getMessage("Player.Commands.HelpMessages.Format", null, false), s));
}
}
sender.sendMessage(lgm.getMessage("Player.Commands.HelpMessages.Footer", null, true));
} catch (NumberFormatException e) {
sender.sendMessage(lgm.getMessage("Player.Commands.NotANumber", null, true));
return true;
} catch (PaginatedList.ListNotSortedException e2) {
e2.printStackTrace();
return true;
}
return true;
}
@Override
public String name() {
return "help";
}
@Override
public String info() {
return "The Help Command";
}
@Override
public String[] aliases() {
return new String[0];
}
@Override
public Map<Integer, String[]> subArgs() {
return new HashMap<>();
}
@Override
public String syntax() {
return "/openpanel help <Page>";
}
@Override
public String permission() {
return "";
}
}