diff --git a/README.md b/README.md
index 1cf8171..99379d1 100644
--- a/README.md
+++ b/README.md
@@ -25,7 +25,7 @@ Maven
com.github.vaperion
blade
- 2.1.5
+ 2.1.6
compile
@@ -40,7 +40,7 @@ allprojects {
}
dependencies {
- implementation 'com.github.vaperion:blade:2.1.5'
+ implementation 'com.github.vaperion:blade:2.1.6'
}
```
diff --git a/pom.xml b/pom.xml
index 32b549e..f7e98cc 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
me.vaperion
blade
- 2.1.5
+ 2.1.6
UTF-8
diff --git a/src/main/java/me/vaperion/blade/Blade.java b/src/main/java/me/vaperion/blade/Blade.java
index 92260b3..406641c 100644
--- a/src/main/java/me/vaperion/blade/Blade.java
+++ b/src/main/java/me/vaperion/blade/Blade.java
@@ -8,10 +8,12 @@
import me.vaperion.blade.bindings.Binding;
import me.vaperion.blade.container.ContainerCreator;
import me.vaperion.blade.help.HelpGenerator;
+import me.vaperion.blade.help.impl.BukkitHelpGenerator;
import me.vaperion.blade.permissions.PermissionPredicate;
import me.vaperion.blade.service.BladeCommandRegistrar;
import me.vaperion.blade.service.BladeCommandService;
import me.vaperion.blade.tabcompleter.TabCompleter;
+import me.vaperion.blade.utils.ClassUtil;
import org.jetbrains.annotations.NotNull;
import java.lang.annotation.Annotation;
@@ -103,6 +105,8 @@ public Blade build() {
if (blade.helpGenerator != null)
blade.commandService.setHelpGenerator(blade.helpGenerator);
+ else if (ClassUtil.classExists("org.bukkit.Bukkit"))
+ blade.commandService.setHelpGenerator(new BukkitHelpGenerator());
if (blade.asyncExecutor != null) {
blade.commandService.setAsyncExecutor(blade.asyncExecutor);
diff --git a/src/main/java/me/vaperion/blade/command/BladeCommand.java b/src/main/java/me/vaperion/blade/command/BladeCommand.java
index 098b75e..2a91f6f 100644
--- a/src/main/java/me/vaperion/blade/command/BladeCommand.java
+++ b/src/main/java/me/vaperion/blade/command/BladeCommand.java
@@ -61,6 +61,8 @@ public BladeCommand(BladeCommandService commandService, Object instance, Method
this.senderType = this.senderParameter ? method.getParameterTypes()[0] : null;
if (method != null) {
+ method.setAccessible(true);
+
int i = 0;
for (Parameter parameter : method.getParameters()) {
if (i == 0 && senderParameter) {
diff --git a/src/main/java/me/vaperion/blade/command/UsageMessage.java b/src/main/java/me/vaperion/blade/command/UsageMessage.java
index dfc9cc9..14ccdbf 100644
--- a/src/main/java/me/vaperion/blade/command/UsageMessage.java
+++ b/src/main/java/me/vaperion/blade/command/UsageMessage.java
@@ -5,4 +5,5 @@
public interface UsageMessage {
void sendTo(@NotNull BladeContext context);
+ @NotNull String toString();
}
diff --git a/src/main/java/me/vaperion/blade/command/impl/BukkitUsageMessage.java b/src/main/java/me/vaperion/blade/command/impl/BukkitUsageMessage.java
index 765adb1..c78e3b8 100644
--- a/src/main/java/me/vaperion/blade/command/impl/BukkitUsageMessage.java
+++ b/src/main/java/me/vaperion/blade/command/impl/BukkitUsageMessage.java
@@ -64,4 +64,10 @@ public BukkitUsageMessage(BladeCommand command) {
public void sendTo(@NotNull BladeContext context) {
messageBuilder.sendTo((CommandSender) context.sender().getBackingSender());
}
+
+ @NotNull
+ @Override
+ public String toString() {
+ return messageBuilder.toStringFormat();
+ }
}
diff --git a/src/main/java/me/vaperion/blade/container/impl/BukkitCommandContainer.java b/src/main/java/me/vaperion/blade/container/impl/BukkitCommandContainer.java
index a4f33a5..cd2a6d4 100644
--- a/src/main/java/me/vaperion/blade/container/impl/BukkitCommandContainer.java
+++ b/src/main/java/me/vaperion/blade/container/impl/BukkitCommandContainer.java
@@ -22,7 +22,6 @@
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Modifier;
import java.util.*;
import java.util.stream.Collectors;
@@ -34,16 +33,14 @@ public class BukkitCommandContainer extends Command implements CommandContainer
private static final String UNKNOWN_COMMAND_MESSAGE;
static {
- Class> spigotConfigClass = null;
- Field mapField = null, commandsField = null, unknownCommandField = null;
+ Field mapField = null, commandsField = null;
String unknownCommandMessage = ChatColor.WHITE + "Unknown command. Type \"/help\" for help.";
try {
- spigotConfigClass = Class.forName("org.spigotmc.SpigotConfig");
+ Class> spigotConfigClass = Class.forName("org.spigotmc.SpigotConfig");
+ Field unknownCommandField = spigotConfigClass.getDeclaredField("unknownCommandMessage");
- unknownCommandField = spigotConfigClass.getDeclaredField("unknownCommandMessage");
unknownCommandField.setAccessible(true);
-
unknownCommandMessage = ChatColor.WHITE + (String) unknownCommandField.get(null);
} catch (Exception ex) {
System.err.println("Failed to grab unknown command message from SpigotConfig.");
@@ -52,15 +49,10 @@ public class BukkitCommandContainer extends Command implements CommandContainer
try {
mapField = SimplePluginManager.class.getDeclaredField("commandMap");
- mapField.setAccessible(true);
commandsField = SimpleCommandMap.class.getDeclaredField("knownCommands");
- commandsField.setAccessible(true);
- Field modifiers = Field.class.getDeclaredField("modifiers");
- modifiers.setAccessible(true);
-
- modifiers.setInt(mapField, modifiers.getInt(mapField) & ~Modifier.FINAL);
- modifiers.setInt(commandsField, modifiers.getInt(commandsField) & ~Modifier.FINAL);
+ mapField.setAccessible(true);
+ commandsField.setAccessible(true);
} catch (Exception ex) {
System.err.println("Failed to grab commandMap from the plugin manager.");
ex.printStackTrace();
@@ -86,13 +78,17 @@ private BukkitCommandContainer(@NotNull BladeCommandService service, @NotNull Bl
if (service.isOverrideCommands()) {
Map knownCommands = (Map) KNOWN_COMMANDS.get(simpleCommandMap);
- for (Command registeredCommand : new ArrayList<>(knownCommands.values())) {
+ Iterator> iterator = knownCommands.entrySet().iterator();
+
+ while (iterator.hasNext()) {
+ Map.Entry entry = iterator.next();
+ Command registeredCommand = entry.getValue();
+
if (doesBukkitCommandConflict(registeredCommand, alias, command)) {
registeredCommand.unregister(simpleCommandMap);
- knownCommands.remove(registeredCommand.getName().toLowerCase(Locale.ENGLISH));
+ iterator.remove();
}
}
- KNOWN_COMMANDS.set(simpleCommandMap, knownCommands);
}
simpleCommandMap.register(fallbackPrefix, this);
@@ -197,6 +193,10 @@ public boolean execute(@NotNull CommandSender sender, @NotNull String alias, @No
final BladeCommand finalCommand = command;
final String finalResolvedAlias = resolvedAlias;
+ if (finalCommand.getMethod() == null) {
+ throw new BladeExitMessage("The command " + finalResolvedAlias + " is a root command and cannot be executed.");
+ }
+
Runnable runnable = () -> {
try {
List