Commit 61c0ff36 authored by KingRainbow44's avatar KingRainbow44
Browse files

Execution power

parent 25c414be
......@@ -7,9 +7,17 @@ import java.lang.annotation.RetentionPolicy;
public @interface Command {
String label() default "";
String usage() default "";
String[] aliases() default {""};
Execution execution() default Execution.ALL;
int gmLevel() default 1;
String usage() default "";
enum Execution {
ALL,
CONSOLE,
PLAYER
}
}
......@@ -7,9 +7,9 @@ import java.util.List;
public interface CommandHandler {
/* Invoked on player execution. */
void execute(GenshinPlayer player, List<String> args);
default void execute(GenshinPlayer player, List<String> args) { }
/* Invoked on server execution. */
void execute(List<String> args);
default void execute(List<String> args) { }
/*
* Utilities.
......
......@@ -13,6 +13,7 @@ public final class CommandMap {
}
private final Map<String, CommandHandler> commands = new HashMap<>();
private final Map<String, Command.Execution> executionPower = new HashMap<>();
/**
* Register a command handler.
......@@ -23,13 +24,18 @@ public final class CommandMap {
public CommandMap registerCommand(String label, CommandHandler command) {
Grasscutter.getLogger().debug("Registered command: " + label);
// Get command data.
Command annotation = command.getClass().getAnnotation(Command.class);
this.executionPower.put(label, annotation.execution());
this.commands.put(label, command);
// Register aliases.
if(annotation.aliases().length > 0) {
for (String alias : annotation.aliases())
for (String alias : annotation.aliases()) {
this.commands.put(alias, command);
} this.commands.put(label, command);
return this;
this.executionPower.put(alias, annotation.execution());
}
} return this;
}
/**
......@@ -43,10 +49,16 @@ public final class CommandMap {
if(handler == null) return this;
Command annotation = handler.getClass().getAnnotation(Command.class);
this.executionPower.remove(label);
this.commands.remove(label);
// Unregister aliases.
if(annotation.aliases().length > 0) {
for (String alias : annotation.aliases())
for (String alias : annotation.aliases()) {
this.commands.remove(alias);
} this.commands.remove(label);
this.executionPower.remove(alias);
}
}
return this;
}
......@@ -77,9 +89,16 @@ public final class CommandMap {
CommandHandler.sendMessage(player, "Unknown command: " + label); return;
}
// Execution power check.
Command.Execution executionPower = this.executionPower.get(label);
if(player == null && executionPower == Command.Execution.PLAYER) {
CommandHandler.sendMessage(null, "Run this command in-game."); return;
} else if (player != null && executionPower == Command.Execution.CONSOLE) {
CommandHandler.sendMessage(player, "This command can only be run from the console."); return;
}
// Invoke execute method for handler.
if(player == null)
handler.execute(args);
if(player == null) handler.execute(args);
else handler.execute(player, args);
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment