parent
3c4f9f6c7a
commit
00738fe820
4 changed files with 36 additions and 21 deletions
|
@ -193,7 +193,7 @@
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>me.lucko</groupId>
|
<groupId>me.lucko</groupId>
|
||||||
<artifactId>commodore</artifactId>
|
<artifactId>commodore</artifactId>
|
||||||
<version>1.5</version>
|
<version>1.7</version>
|
||||||
<scope>compile</scope>
|
<scope>compile</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
|
@ -285,7 +285,7 @@ public abstract class Command2<TC extends ICommand2, TP extends Command2Sender>
|
||||||
boolean nosubs = true;
|
boolean nosubs = true;
|
||||||
boolean isSubcommand = x != -1;
|
boolean isSubcommand = x != -1;
|
||||||
try { //Register the default handler first so it can be reliably overwritten
|
try { //Register the default handler first so it can be reliably overwritten
|
||||||
mainMethod = command.getClass().getMethod("def", Command2Sender.class, String.class);
|
mainMethod = command.getClass().getMethod("def", Command2Sender.class);
|
||||||
val cc = command.getClass().getAnnotation(CommandClass.class);
|
val cc = command.getClass().getAnnotation(CommandClass.class);
|
||||||
var ht = cc == null || isSubcommand ? new String[0] : cc.helpText(); //If it's not the main command, don't add it
|
var ht = cc == null || isSubcommand ? new String[0] : cc.helpText(); //If it's not the main command, don't add it
|
||||||
if (ht.length > 0)
|
if (ht.length > 0)
|
||||||
|
@ -303,7 +303,7 @@ public abstract class Command2<TC extends ICommand2, TP extends Command2Sender>
|
||||||
val ann = method.getAnnotation(Subcommand.class);
|
val ann = method.getAnnotation(Subcommand.class);
|
||||||
if (ann == null) continue; //Don't call the method on non-subcommands because they're not in the yaml
|
if (ann == null) continue; //Don't call the method on non-subcommands because they're not in the yaml
|
||||||
var ht = command.getHelpText(method, ann);
|
var ht = command.getHelpText(method, ann);
|
||||||
if (ht != null) {
|
if (ht != null) { //The method is a subcommand
|
||||||
val subcommand = commandChar + path + //Add command path (class name by default)
|
val subcommand = commandChar + path + //Add command path (class name by default)
|
||||||
getCommandPath(method.getName(), ' '); //Add method name, unless it's 'def'
|
getCommandPath(method.getName(), ' '); //Add method name, unless it's 'def'
|
||||||
ht = getParameterHelp(method, ht, subcommand);
|
ht = getParameterHelp(method, ht, subcommand);
|
||||||
|
|
|
@ -12,23 +12,21 @@ import lombok.val;
|
||||||
import me.lucko.commodore.Commodore;
|
import me.lucko.commodore.Commodore;
|
||||||
import me.lucko.commodore.CommodoreProvider;
|
import me.lucko.commodore.CommodoreProvider;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.Location;
|
||||||
import org.bukkit.OfflinePlayer;
|
import org.bukkit.OfflinePlayer;
|
||||||
import org.bukkit.command.Command;
|
import org.bukkit.command.Command;
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
import org.bukkit.command.ConsoleCommandSender;
|
import org.bukkit.command.ConsoleCommandSender;
|
||||||
import org.bukkit.command.SimpleCommandMap;
|
import org.bukkit.command.SimpleCommandMap;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.EventHandler;
|
|
||||||
import org.bukkit.event.Listener;
|
import org.bukkit.event.Listener;
|
||||||
import org.bukkit.event.server.TabCompleteEvent;
|
|
||||||
import org.bukkit.permissions.Permission;
|
import org.bukkit.permissions.Permission;
|
||||||
import org.bukkit.permissions.PermissionDefault;
|
import org.bukkit.permissions.PermissionDefault;
|
||||||
|
|
||||||
import java.lang.annotation.Annotation;
|
import java.lang.annotation.Annotation;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.lang.reflect.Parameter;
|
import java.lang.reflect.Parameter;
|
||||||
import java.util.Arrays;
|
import java.util.Collections;
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
@ -159,7 +157,7 @@ public class Command2MC extends Command2<ICommand2MC, Command2MCSender> implemen
|
||||||
.map(comp -> component.getClass().getSimpleName().equals(comp.getClass().getSimpleName())).orElse(false));
|
.map(comp -> component.getClass().getSimpleName().equals(comp.getClass().getSimpleName())).orElse(false));
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler
|
/*@EventHandler
|
||||||
private void handleTabComplete(TabCompleteEvent event) {
|
private void handleTabComplete(TabCompleteEvent event) {
|
||||||
String commandline = event.getBuffer();
|
String commandline = event.getBuffer();
|
||||||
CommandSender sender = event.getSender();
|
CommandSender sender = event.getSender();
|
||||||
|
@ -260,24 +258,23 @@ public class Command2MC extends Command2<ICommand2MC, Command2MCSender> implemen
|
||||||
return true; //We found a method
|
return true; //We found a method
|
||||||
} catch (InvocationTargetException e) {
|
} catch (InvocationTargetException e) {
|
||||||
TBMCCoreAPI.SendException("An error occurred in a command handler!", e.getCause());
|
TBMCCoreAPI.SendException("An error occurred in a command handler!", e.getCause());
|
||||||
|
}*
|
||||||
|
}
|
||||||
}*/
|
}*/
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean shouldRegisterOfficially = true;
|
private boolean shouldRegisterOfficially = true;
|
||||||
|
|
||||||
private void registerOfficially(ICommand2MC command, List<SubcommandData<ICommand2MC>> subcmds) {
|
private void registerOfficially(ICommand2MC command, List<SubcommandData<ICommand2MC>> subcmds) {
|
||||||
if (!shouldRegisterOfficially) return;
|
if (!shouldRegisterOfficially) return;
|
||||||
if (CommodoreProvider.isSupported()) {
|
|
||||||
TabcompleteHelper.registerTabcomplete(command, subcmds);
|
|
||||||
return; //Commodore registers the command as well
|
|
||||||
}
|
|
||||||
try {
|
try {
|
||||||
var cmdmap = (SimpleCommandMap) Bukkit.getServer().getClass().getMethod("getCommandMap").invoke(Bukkit.getServer());
|
var cmdmap = (SimpleCommandMap) Bukkit.getServer().getClass().getMethod("getCommandMap").invoke(Bukkit.getServer());
|
||||||
var path = command.getCommandPath();
|
var path = command.getCommandPath();
|
||||||
int x = path.indexOf(' ');
|
int x = path.indexOf(' ');
|
||||||
var mainPath = path.substring(0, x == -1 ? path.length() : x);
|
var mainPath = path.substring(0, x == -1 ? path.length() : x);
|
||||||
cmdmap.register(command.getPlugin().getName(), new BukkitCommand(mainPath));
|
var bukkitCommand = new BukkitCommand(mainPath);
|
||||||
|
cmdmap.register(command.getPlugin().getName(), bukkitCommand);
|
||||||
|
if (CommodoreProvider.isSupported())
|
||||||
|
TabcompleteHelper.registerTabcomplete(command, subcmds, bukkitCommand);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
TBMCCoreAPI.SendException("Failed to register command in command map!", e);
|
TBMCCoreAPI.SendException("Failed to register command in command map!", e);
|
||||||
shouldRegisterOfficially = false;
|
shouldRegisterOfficially = false;
|
||||||
|
@ -294,20 +291,37 @@ public class Command2MC extends Command2<ICommand2MC, Command2MCSender> implemen
|
||||||
sender.sendMessage("§cThe command wasn't executed for some reason... (command processing failed)");
|
sender.sendMessage("§cThe command wasn't executed for some reason... (command processing failed)");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<String> tabComplete(CommandSender sender, String alias, String[] args) throws IllegalArgumentException {
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<String> tabComplete(CommandSender sender, String alias, String[] args, Location location) throws IllegalArgumentException {
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class TabcompleteHelper {
|
private static class TabcompleteHelper {
|
||||||
private static Commodore commodore;
|
private static Commodore commodore;
|
||||||
|
|
||||||
private static void registerTabcomplete(ICommand2MC command2MC, List<SubcommandData<ICommand2MC>> subcmds) {
|
private static void registerTabcomplete(ICommand2MC command2MC, List<SubcommandData<ICommand2MC>> subcmds, Command bukkitCommand) {
|
||||||
if (commodore == null)
|
if (commodore == null) {
|
||||||
commodore = CommodoreProvider.getCommodore(MainPlugin.Instance); //Register all to the Core, it's easier
|
commodore = CommodoreProvider.getCommodore(MainPlugin.Instance); //Register all to the Core, it's easier
|
||||||
|
System.out.println("Registering test tabcomplete");
|
||||||
|
commodore.register(LiteralArgumentBuilder.literal("test")
|
||||||
|
.then(LiteralArgumentBuilder.literal("asd")
|
||||||
|
.then(RequiredArgumentBuilder.argument("dsa", StringArgumentType.word())))
|
||||||
|
.then(RequiredArgumentBuilder.argument("lol", StringArgumentType.word())));
|
||||||
|
}
|
||||||
System.out.println("Registering tabcomplete for path: " + command2MC.getCommandPath());
|
System.out.println("Registering tabcomplete for path: " + command2MC.getCommandPath());
|
||||||
String[] path = command2MC.getCommandPath().split(" ");
|
String[] path = command2MC.getCommandPath().split(" ");
|
||||||
var maincmd = LiteralArgumentBuilder.literal(path[0]);
|
var maincmd = LiteralArgumentBuilder.literal(path[0]);
|
||||||
var cmd = maincmd;
|
var cmd = maincmd;
|
||||||
for (int i = 1; i < path.length; i++) {
|
for (int i = 1; i < path.length; i++) {
|
||||||
var subcmd = LiteralArgumentBuilder.literal(path[i]);
|
var subcmd = LiteralArgumentBuilder.literal(path[i]);
|
||||||
|
System.out.println(cmd.build() + " -> " + subcmd.build());
|
||||||
cmd.then(subcmd);
|
cmd.then(subcmd);
|
||||||
cmd = subcmd; //Add each part of the path as a child of the previous one
|
cmd = subcmd; //Add each part of the path as a child of the previous one
|
||||||
}
|
}
|
||||||
|
@ -317,6 +331,7 @@ public class Command2MC extends Command2<ICommand2MC, Command2MCSender> implemen
|
||||||
if (subpath[0].length() > 0) { //If the method is def, it will contain one empty string
|
if (subpath[0].length() > 0) { //If the method is def, it will contain one empty string
|
||||||
for (String s : subpath) {
|
for (String s : subpath) {
|
||||||
var subsubcmd = LiteralArgumentBuilder.literal(s);
|
var subsubcmd = LiteralArgumentBuilder.literal(s);
|
||||||
|
System.out.println(scmd.build() + " -> " + subsubcmd.build());
|
||||||
scmd.then(subsubcmd);
|
scmd.then(subsubcmd);
|
||||||
scmd = subsubcmd; //Add method name part of the path (could_be_multiple())
|
scmd = subsubcmd; //Add method name part of the path (could_be_multiple())
|
||||||
}
|
}
|
||||||
|
@ -346,14 +361,15 @@ public class Command2MC extends Command2<ICommand2MC, Command2MCSender> implemen
|
||||||
else //TODO: Custom parameter types
|
else //TODO: Custom parameter types
|
||||||
type = StringArgumentType.word();
|
type = StringArgumentType.word();
|
||||||
var arg = RequiredArgumentBuilder.argument(parameter.getName(), type);
|
var arg = RequiredArgumentBuilder.argument(parameter.getName(), type);
|
||||||
|
System.out.println("Adding arg: " + arg.build() + " to " + scmd.build());
|
||||||
scmd.then(arg);
|
scmd.then(arg);
|
||||||
scmd = arg;
|
scmd = arg;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
System.out.println("maincmd: " + maincmd);
|
System.out.println("maincmd: " + maincmd.build());
|
||||||
System.out.println("Children:");
|
System.out.println("Children:");
|
||||||
maincmd.build().getChildren().forEach(System.out::println);
|
maincmd.build().getChildren().forEach(System.out::println);
|
||||||
commodore.register(maincmd);
|
commodore.register(bukkitCommand, maincmd, p -> true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,10 +12,9 @@ public abstract class ICommand2<TP extends Command2Sender> {
|
||||||
* Default handler for commands, can be used to copy the args too.
|
* Default handler for commands, can be used to copy the args too.
|
||||||
*
|
*
|
||||||
* @param sender The sender which ran the command
|
* @param sender The sender which ran the command
|
||||||
* @param args All of the arguments passed as is
|
|
||||||
* @return The success of the command
|
* @return The success of the command
|
||||||
*/
|
*/
|
||||||
public boolean def(TP sender, @Command2.TextArg String args) {
|
public boolean def(TP sender) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue