Commit ea2b2f95 authored by Benjamin Elsdon's avatar Benjamin Elsdon
Browse files

Refactored PlayerCommands, added commands and more

Added player "Help" command, added server "sendmsg" command, changed getAcccountByPlayerID to public in DatabaseHelper, and allowed player commands to be submitted with "/" and "!"
parent eaba8bc1
......@@ -4,6 +4,7 @@ import java.lang.reflect.Modifier;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import emu.grasscutter.data.GenshinData;
import emu.grasscutter.data.def.ItemData;
......@@ -23,7 +24,9 @@ import emu.grasscutter.server.packet.send.PacketItemAddHintNotify;
import emu.grasscutter.utils.Position;
public class PlayerCommands {
private static HashMap<String, PlayerCommand> list = new HashMap<String, PlayerCommand>();
private static HashMap<String, PlayerCommand> commandList = new HashMap<String, PlayerCommand>();
private static HashMap<String, PlayerCommand> commandAliasList = new HashMap<String, PlayerCommand>();
static {
try {
......@@ -36,22 +39,19 @@ public class PlayerCommands {
if (commandAnnotation != null) {
command.setLevel(commandAnnotation.gmLevel());
for (String alias : commandAnnotation.aliases()) {
command.setHelpText(commandAnnotation.helpText());
for (String alias : commandAnnotation.aliases()) {
if (alias.length() == 0) {
continue;
}
String commandName = "!" + alias;
list.put(commandName, command);
commandName = "/" + alias;
list.put(commandName, command);
String commandName = alias;
commandAliasList.put(commandName, command);
}
}
String commandName = "!" + cls.getSimpleName().toLowerCase();
list.put(commandName, command);
commandName = "/" + cls.getSimpleName().toLowerCase();
list.put(commandName, command);
String commandName = cls.getSimpleName().toLowerCase();
commandList.put(commandName, command);
}
}
......@@ -67,33 +67,54 @@ public class PlayerCommands {
if (split.length == 0) {
return;
}
String first = split[0].toLowerCase().substring(1);
PlayerCommand c = PlayerCommands.commandList.get(first);
PlayerCommand a = PlayerCommands.commandAliasList.get(first);
//
String first = split[0].toLowerCase();
PlayerCommand c = PlayerCommands.list.get(first);
if (c != null) {
if (c != null || a != null) {
PlayerCommand cmd = c != null ? c : a;
// Level check
if (player.getGmLevel() < c.getLevel()) {
if (player.getGmLevel() < cmd.getLevel()) {
return;
}
// Execute
int len = Math.min(first.length() + 1, msg.length());
c.execute(player, msg.substring(len));
cmd.execute(player, msg.substring(len));
}
}
public static abstract class PlayerCommand {
// GM level required to use this command
private int level;
private String helpText;
protected int getLevel() { return this.level; }
protected void setLevel(int minLevel) { this.level = minLevel; }
protected String getHelpText() { return this.helpText; }
protected void setHelpText(String helpText) { this.helpText = helpText; }
// Main
public abstract void execute(GenshinPlayer player, String raw);
}
// ================ Commands ================
@Command(aliases = {"h"}, helpText = "Shows this command")
public static class Help extends PlayerCommand {
@Override
public void execute(GenshinPlayer player, String raw) {
String helpMessage = "Grasscutter Commands: ";
for (Map.Entry<String, PlayerCommand> cmd : commandList.entrySet()) {
helpMessage += "\n" + cmd.getKey() + " - " + cmd.getValue().helpText;
}
player.dropMessage(helpMessage);
}
}
@Command(aliases = {"g", "item", "additem"}, helpText = "/give [item id] [count] - Gives {count} amount of {item id}")
public static class Give extends PlayerCommand {
......
package emu.grasscutter.commands;
import java.lang.reflect.Modifier;
import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.stream.Collectors;
import emu.grasscutter.Grasscutter;
import emu.grasscutter.data.GenshinData;
......@@ -67,6 +69,35 @@ public class ServerCommands {
Grasscutter.getLogger().info("Reload complete.");
}
}
public static class sendMsg extends ServerCommand {
@Override
public void execute(String raw) {
List<String> split = Arrays.asList(raw.split(" "));
if (split.size() < 2) {
Grasscutter.getLogger().error("Invalid amount of args");
return;
}
String playerID = split.get(0);
String message = split.stream().skip(1).collect(Collectors.joining(" "));
emu.grasscutter.game.Account account = DatabaseHelper.getAccountByPlayerId(Integer.parseInt(playerID));
if (account != null) {
GenshinPlayer player = Grasscutter.getGameServer().getPlayerById(Integer.parseInt(playerID));
if(player != null) {
player.dropMessage(message);
Grasscutter.getLogger().info(String.format("Successfully sent message to %s: %s", playerID, message));
} else {
Grasscutter.getLogger().error("Player not online");
}
} else {
Grasscutter.getLogger().error(String.format("Player %s does not exist", playerID));
}
}
}
public static class Account extends ServerCommand {
@Override
......
......@@ -95,7 +95,7 @@ public class DatabaseHelper {
return cursor.next();
}
private static Account getAccountByPlayerId(int playerId) {
public static Account getAccountByPlayerId(int playerId) {
MorphiaCursor<Account> cursor = DatabaseManager.getDatastore().createQuery(Account.class).field("playerId").equal(playerId).find(FIND_ONE);
if (!cursor.hasNext()) return null;
return cursor.next();
......
package emu.grasscutter.game.managers;
import emu.grasscutter.Grasscutter;
import emu.grasscutter.commands.PlayerCommands;
import emu.grasscutter.game.GenshinPlayer;
import emu.grasscutter.net.packet.GenshinPacket;
......@@ -25,7 +26,7 @@ public class ChatManager {
}
// Check if command
if (message.charAt(0) == '!') {
if (message.charAt(0) == '!' || message.charAt(0) == '/') {
PlayerCommands.handle(player, message);
return;
}
......
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