diff --git a/SpigotCore_Main/src/de/steamwar/command/SWCommand.java b/SpigotCore_Main/src/de/steamwar/command/SWCommand.java index e1aefde..239b0ad 100644 --- a/SpigotCore_Main/src/de/steamwar/command/SWCommand.java +++ b/SpigotCore_Main/src/de/steamwar/command/SWCommand.java @@ -20,15 +20,34 @@ package de.steamwar.command; +import org.bukkit.Bukkit; +import org.bukkit.command.Command; +import org.bukkit.command.CommandMap; import org.bukkit.command.CommandSender; +import java.lang.reflect.Field; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Optional; import java.util.function.BiConsumer; public class SWCommand { + private static final CommandMap commandMap; + + static { + try { + final Field commandMapField = Bukkit.getServer().getClass().getDeclaredField("commandMap"); + commandMapField.setAccessible(true); + commandMap = (CommandMap) commandMapField.get(Bukkit.getServer()); + } catch (NoSuchFieldException | IllegalAccessException exception) { + Bukkit.shutdown(); + throw new SecurityException("Oh shit. Commands cannot not register.", exception); + } + } + + private SWCommand instance; private Argument[] arguments; private BiConsumer executor; private boolean lastArgRepeatable = false; @@ -36,6 +55,7 @@ public class SWCommand { public SWCommand(BiConsumer executor, Argument... arguments) { this.executor = executor; this.arguments = arguments; + this.instance = this; } public SWCommand(BiConsumer executor, boolean lastArgRepeatable, Argument... arguments) { @@ -43,6 +63,34 @@ public class SWCommand { this.lastArgRepeatable = lastArgRepeatable; } + protected void register(String name, String... aliases) { + commandMap.register("steamwar", new Command(name, "", "/" + name, Arrays.asList(aliases)) { + @Override + public boolean execute(CommandSender sender, String alias, String[] args) { + if (!isInstance(sender)) return false; + instance.execute((T) sender, args); + return true; + } + + @Override + public List tabComplete(CommandSender sender, String alias, String[] args) { + if (!isInstance(sender)) new ArrayList<>(); + return SWCommand.this.tabComplete((T) sender, args); + } + + private boolean isInstance(CommandSender sender) { + try { + if (Class.forName(getClass().getGenericInterfaces()[0].getTypeName()).isInstance(sender)) { + return true; + } + } catch (ClassNotFoundException e) { + // Ignored + } + return false; + } + }); + } + public boolean execute(T sender, String[] args) { if (args.length != arguments.length) return false; Object[] objects = new Object[args.length]; @@ -73,7 +121,8 @@ public class SWCommand { } if (lastArgRepeatable) { for (int i = arguments.length; i < args.length; i++) { - if (!arguments[arguments.length - 1].valueSupplier(args[i], sender).isPresent()) return new ArrayList<>(); + if (!arguments[arguments.length - 1].valueSupplier(args[i], sender).isPresent()) + return new ArrayList<>(); } } return arguments[arguments.length - 1].tabCompleteSupplier(args[args.length - 1], sender).orElseGet(ArrayList::new);