Added a help command

This commit is contained in:
kuroppoi 2021-04-23 15:11:41 +02:00
parent f6c5d563c6
commit dd3a4ebcf1
13 changed files with 249 additions and 21 deletions

View file

@ -4,6 +4,20 @@ public abstract class Command {
public abstract void execute(CommandExecutor executor, String[] args); public abstract void execute(CommandExecutor executor, String[] args);
public abstract String getName();
public String[] getAliases() {
return null;
}
public String getDescription() {
return "No description for this command";
}
public String getUsage() {
return "/" + getName();
}
public boolean requiresAdmin() { public boolean requiresAdmin() {
return false; return false;
} }

View file

@ -1,6 +1,8 @@
package brainwine.gameserver.command; package brainwine.gameserver.command;
import java.util.Collection;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
@ -8,6 +10,7 @@ import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import brainwine.gameserver.command.commands.BroadcastCommand; import brainwine.gameserver.command.commands.BroadcastCommand;
import brainwine.gameserver.command.commands.HelpCommand;
import brainwine.gameserver.command.commands.KickCommand; import brainwine.gameserver.command.commands.KickCommand;
import brainwine.gameserver.command.commands.PlayerIdCommand; import brainwine.gameserver.command.commands.PlayerIdCommand;
import brainwine.gameserver.command.commands.RegisterCommand; import brainwine.gameserver.command.commands.RegisterCommand;
@ -20,8 +23,10 @@ import brainwine.gameserver.entity.player.Player;
public class CommandManager { public class CommandManager {
public static final String CUSTOM_COMMAND_PREFIX = "!"; // TODO configurable
private static final Logger logger = LogManager.getLogger(); private static final Logger logger = LogManager.getLogger();
private static final Map<String, Command> commands = new HashMap<>(); private static final Map<String, Command> commands = new HashMap<>();
private static final Map<String, Command> aliases = new HashMap<>();
private static boolean initialized = false; private static boolean initialized = false;
public static void init() { public static void init() {
@ -36,15 +41,16 @@ public class CommandManager {
private static void registerCommands() { private static void registerCommands() {
logger.info("Registering commands ..."); logger.info("Registering commands ...");
registerCommand("stop", new StopCommand()); registerCommand(new StopCommand());
registerCommand("register", new RegisterCommand()); registerCommand(new RegisterCommand());
registerCommand("tp", new TeleportCommand()); registerCommand(new TeleportCommand());
registerCommand("kick", new KickCommand()); registerCommand(new KickCommand());
registerCommand("say", new SayCommand()); registerCommand(new SayCommand());
registerCommand("think", new ThinkCommand()); registerCommand(new ThinkCommand());
registerCommand("bc", new BroadcastCommand()); registerCommand(new BroadcastCommand());
registerCommand("pid", new PlayerIdCommand()); registerCommand(new PlayerIdCommand());
registerCommand("zid", new ZoneIdCommand()); registerCommand(new ZoneIdCommand());
registerCommand(new HelpCommand());
} }
public static void executeCommand(CommandExecutor executor, String commandLine) { public static void executeCommand(CommandExecutor executor, String commandLine) {
@ -65,10 +71,14 @@ public class CommandManager {
} }
public static void executeCommand(CommandExecutor executor, String commandName, String[] args) { public static void executeCommand(CommandExecutor executor, String commandName, String[] args) {
Command command = commands.get(commandName); if(!(executor instanceof Player) && commandName.startsWith(CUSTOM_COMMAND_PREFIX) || commandName.startsWith("/")) {
commandName = commandName.substring(1);
}
Command command = commands.getOrDefault(commandName, aliases.get(commandName));
if(command == null) { if(command == null) {
executor.sendMessage("Sorry, that command does not exist."); executor.sendMessage("Unknown command. Type '/help' for a list of commands.");
return; return;
} }
@ -82,16 +92,37 @@ public class CommandManager {
command.execute(executor, args); command.execute(executor, args);
} }
public static void registerCommand(String name, Command command) { public static void registerCommand(Command command) {
String name = command.getName();
if(commands.containsKey(name)) { if(commands.containsKey(name)) {
logger.warn("Attempted to register duplicate command {} with name {}", command.getClass(), name); logger.warn("Attempted to register duplicate command {} with name {}", command.getClass(), name);
return; return;
} }
commands.put(name, command); commands.put(name, command);
String[] aliases = command.getAliases();
if(aliases != null) {
for(String alias : aliases) {
if(commands.containsKey(alias) || CommandManager.aliases.containsKey(alias)) {
logger.warn("Duplicate alias {} for command {}", alias, command.getClass());
continue;
}
CommandManager.aliases.put(alias, command);
}
}
} }
public static Set<String> getCommandNames() { public static Set<String> getCommandNames() {
return commands.keySet(); Set<String> names = new HashSet<>();
names.addAll(commands.keySet());
names.addAll(aliases.keySet());
return names;
}
public static Collection<Command> getCommands() {
return commands.values();
} }
} }

View file

@ -10,7 +10,7 @@ public class BroadcastCommand extends Command {
@Override @Override
public void execute(CommandExecutor executor, String[] args) { public void execute(CommandExecutor executor, String[] args) {
if(args.length == 0) { if(args.length == 0) {
executor.sendMessage("Usage: /broadcast <message>"); executor.sendMessage(String.format("Usage: %s", getUsage()));
return; return;
} }
@ -22,10 +22,30 @@ public class BroadcastCommand extends Command {
} }
for(Player player : GameServer.getInstance().getPlayerManager().getPlayers()) { for(Player player : GameServer.getInstance().getPlayerManager().getPlayers()) {
player.notify(text, 9); player.notify(text, 11);
} }
} }
@Override
public String getName() {
return "broadcast";
}
@Override
public String[] getAliases() {
return new String[] { "bc" };
}
@Override
public String getDescription() {
return "Broadcasts a message to the entire server.";
}
@Override
public String getUsage() {
return "/broadcast <message>";
}
@Override @Override
public boolean requiresAdmin() { public boolean requiresAdmin() {
return true; return true;

View file

@ -0,0 +1,44 @@
package brainwine.gameserver.command.commands;
import java.util.Collection;
import brainwine.gameserver.command.Command;
import brainwine.gameserver.command.CommandExecutor;
import brainwine.gameserver.command.CommandManager;
import brainwine.gameserver.entity.player.Player;
public class HelpCommand extends Command {
@Override
public void execute(CommandExecutor executor, String[] args) {
boolean admin = true;
if(executor instanceof Player) {
admin = ((Player)executor).isAdmin();
}
Collection<Command> commands = CommandManager.getCommands();
executor.sendMessage("Command List");
for(Command command : commands) {
if(!command.requiresAdmin() || admin) {
executor.sendMessage(String.format("%s - %s", command.getUsage(), command.getDescription()));
}
}
}
@Override
public String getName() {
return "help";
}
@Override
public String[] getAliases() {
return new String[] { "commands" };
}
@Override
public String getDescription() {
return "Displays a list of commands.";
}
}

View file

@ -12,7 +12,7 @@ public class KickCommand extends Command {
@Override @Override
public void execute(CommandExecutor executor, String[] args) { public void execute(CommandExecutor executor, String[] args) {
if(args.length < 1) { if(args.length < 1) {
executor.sendMessage("Usage: /kick <player> [reason]"); executor.sendMessage(String.format("Usage: %s", getUsage()));
return; return;
} }
@ -36,6 +36,21 @@ public class KickCommand extends Command {
executor.sendMessage("Kicked player " + player.getName() + " for '" + reason + "'"); executor.sendMessage("Kicked player " + player.getName() + " for '" + reason + "'");
} }
@Override
public String getName() {
return "kick";
}
@Override
public String getDescription() {
return "Kicks a player from the server.";
}
@Override
public String getUsage() {
return "/kick <player> [reason]";
}
@Override @Override
public boolean requiresAdmin() { public boolean requiresAdmin() {
return true; return true;

View file

@ -32,6 +32,21 @@ public class PlayerIdCommand extends Command {
executor.sendMessage(target.getDocumentId()); executor.sendMessage(target.getDocumentId());
} }
@Override
public String getName() {
return "pid";
}
@Override
public String getDescription() {
return "Displays the document id of a player.";
}
@Override
public String getUsage() {
return "/pid [player]";
}
@Override @Override
public boolean requiresAdmin() { public boolean requiresAdmin() {
return true; return true;

View file

@ -23,4 +23,14 @@ public class RegisterCommand extends Command{
player.showDialog(new RegistrationDialog()); player.showDialog(new RegistrationDialog());
} }
@Override
public String getName() {
return "register";
}
@Override
public String getDescription() {
return "Shows a prompt with which you can register your account.";
}
} }

View file

@ -15,7 +15,7 @@ public class SayCommand extends Command {
} }
if(args.length == 0) { if(args.length == 0) {
executor.sendMessage("Usage: /say <message>"); executor.sendMessage(String.format("Usage: %s", getUsage()));
return; return;
} }
@ -23,4 +23,19 @@ public class SayCommand extends Command {
Player player = ((Player)executor); Player player = ((Player)executor);
player.getZone().chat(player, text, ChatType.SPEECH); player.getZone().chat(player, text, ChatType.SPEECH);
} }
@Override
public String getName() {
return "say";
}
@Override
public String getDescription() {
return "Shows a speech bubble to nearby players.";
}
@Override
public String getUsage() {
return "/say <message>";
}
} }

View file

@ -11,6 +11,21 @@ public class StopCommand extends Command {
GameServer.getInstance().shutdown(); // YEET!! GameServer.getInstance().shutdown(); // YEET!!
} }
@Override
public String getName() {
return "stop";
}
@Override
public String[] getAliases() {
return new String[] { "exit", "close", "shutdown" };
}
@Override
public String getDescription() {
return "Gracefully shuts down the server after the current tick.";
}
@Override @Override
public boolean requiresAdmin() { public boolean requiresAdmin() {
return true; return true;

View file

@ -14,7 +14,7 @@ public class TeleportCommand extends Command {
} }
if(args.length != 2) { if(args.length != 2) {
executor.sendMessage("Usage: /teleport <x> <y>"); executor.sendMessage(String.format("Usage: %s", getUsage()));
return; return;
} }
@ -37,4 +37,24 @@ public class TeleportCommand extends Command {
player.teleport(x, y); player.teleport(x, y);
} }
@Override
public String getName() {
return "teleport";
}
@Override
public String[] getAliases() {
return new String[] { "tp" };
}
@Override
public String getDescription() {
return "Teleports you to the specified position.";
}
@Override
public String getUsage() {
return "/teleport <x> <y>";
}
} }

View file

@ -15,7 +15,7 @@ public class ThinkCommand extends Command {
} }
if(args.length == 0) { if(args.length == 0) {
executor.sendMessage("Usage: /think <message>"); executor.sendMessage(String.format("Usage: %s", getUsage()));
return; return;
} }
@ -23,4 +23,19 @@ public class ThinkCommand extends Command {
Player player = ((Player)executor); Player player = ((Player)executor);
player.getZone().chat(player, text, ChatType.THOUGHT); player.getZone().chat(player, text, ChatType.THOUGHT);
} }
@Override
public String getName() {
return "think";
}
@Override
public String getDescription() {
return "Shows a thought bubble to nearby players.";
}
@Override
public String getUsage() {
return "/think <message>";
}
} }

View file

@ -33,6 +33,21 @@ public class ZoneIdCommand extends Command {
executor.sendMessage(target.getDocumentId()); executor.sendMessage(target.getDocumentId());
} }
@Override
public String getName() {
return "zid";
}
@Override
public String getDescription() {
return "Displays the document id of a zone.";
}
@Override
public String getUsage() {
return "/zid [zone]";
}
@Override @Override
public boolean requiresAdmin() { public boolean requiresAdmin() {
return true; return true;

View file

@ -11,8 +11,7 @@ public class ChatRequest extends PlayerRequest {
@Override @Override
public void process(Player player) { public void process(Player player) {
// TODO configurable prefix if(text.startsWith(CommandManager.CUSTOM_COMMAND_PREFIX)) {
if(text.startsWith("!")) {
CommandManager.executeCommand(player, text.substring(1)); CommandManager.executeCommand(player, text.substring(1));
return; return;
} }