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 "!"
This commit is contained in:
Benjamin Elsdon 2022-04-18 23:47:26 +08:00
parent 589d0dd6f8
commit 3be50b5b01
4 changed files with 75 additions and 22 deletions

View File

@ -4,6 +4,7 @@ import java.lang.reflect.Modifier;
import java.util.HashMap; import java.util.HashMap;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Map;
import emu.grasscutter.data.GenshinData; import emu.grasscutter.data.GenshinData;
import emu.grasscutter.data.def.ItemData; import emu.grasscutter.data.def.ItemData;
@ -23,7 +24,9 @@ import emu.grasscutter.server.packet.send.PacketItemAddHintNotify;
import emu.grasscutter.utils.Position; import emu.grasscutter.utils.Position;
public class PlayerCommands { 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 { static {
try { try {
@ -36,22 +39,19 @@ public class PlayerCommands {
if (commandAnnotation != null) { if (commandAnnotation != null) {
command.setLevel(commandAnnotation.gmLevel()); command.setLevel(commandAnnotation.gmLevel());
for (String alias : commandAnnotation.aliases()) { command.setHelpText(commandAnnotation.helpText());
for (String alias : commandAnnotation.aliases()) {
if (alias.length() == 0) { if (alias.length() == 0) {
continue; continue;
} }
String commandName = "!" + alias; String commandName = alias;
list.put(commandName, command); commandAliasList.put(commandName, command);
commandName = "/" + alias;
list.put(commandName, command);
} }
} }
String commandName = "!" + cls.getSimpleName().toLowerCase(); String commandName = cls.getSimpleName().toLowerCase();
list.put(commandName, command); commandList.put(commandName, command);
commandName = "/" + cls.getSimpleName().toLowerCase();
list.put(commandName, command);
} }
} }
@ -68,33 +68,54 @@ public class PlayerCommands {
return; return;
} }
// String first = split[0].toLowerCase().substring(1);
String first = split[0].toLowerCase(); PlayerCommand c = PlayerCommands.commandList.get(first);
PlayerCommand c = PlayerCommands.list.get(first); PlayerCommand a = PlayerCommands.commandAliasList.get(first);
if (c != null) { if (c != null || a != null) {
PlayerCommand cmd = c != null ? c : a;
// Level check // Level check
if (player.getGmLevel() < c.getLevel()) { if (player.getGmLevel() < cmd.getLevel()) {
return; return;
} }
// Execute // Execute
int len = Math.min(first.length() + 1, msg.length()); 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 { public static abstract class PlayerCommand {
// GM level required to use this command // GM level required to use this command
private int level; private int level;
private String helpText;
protected int getLevel() { return this.level; } protected int getLevel() { return this.level; }
protected void setLevel(int minLevel) { this.level = minLevel; } protected void setLevel(int minLevel) { this.level = minLevel; }
protected String getHelpText() { return this.helpText; }
protected void setHelpText(String helpText) { this.helpText = helpText; }
// Main // Main
public abstract void execute(GenshinPlayer player, String raw); public abstract void execute(GenshinPlayer player, String raw);
} }
// ================ Commands ================ // ================ 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}") @Command(aliases = {"g", "item", "additem"}, helpText = "/give [item id] [count] - Gives {count} amount of {item id}")
public static class Give extends PlayerCommand { public static class Give extends PlayerCommand {
@Override @Override

View File

@ -1,9 +1,11 @@
package emu.grasscutter.commands; package emu.grasscutter.commands;
import java.lang.reflect.Modifier; import java.lang.reflect.Modifier;
import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
import emu.grasscutter.Grasscutter; import emu.grasscutter.Grasscutter;
import emu.grasscutter.data.GenshinData; import emu.grasscutter.data.GenshinData;
@ -68,6 +70,35 @@ public class ServerCommands {
} }
} }
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 { public static class Account extends ServerCommand {
@Override @Override
public void execute(String raw) { public void execute(String raw) {

View File

@ -95,7 +95,7 @@ public class DatabaseHelper {
return cursor.next(); 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); MorphiaCursor<Account> cursor = DatabaseManager.getDatastore().createQuery(Account.class).field("playerId").equal(playerId).find(FIND_ONE);
if (!cursor.hasNext()) return null; if (!cursor.hasNext()) return null;
return cursor.next(); return cursor.next();

View File

@ -1,5 +1,6 @@
package emu.grasscutter.game.managers; package emu.grasscutter.game.managers;
import emu.grasscutter.Grasscutter;
import emu.grasscutter.commands.PlayerCommands; import emu.grasscutter.commands.PlayerCommands;
import emu.grasscutter.game.GenshinPlayer; import emu.grasscutter.game.GenshinPlayer;
import emu.grasscutter.net.packet.GenshinPacket; import emu.grasscutter.net.packet.GenshinPacket;
@ -25,7 +26,7 @@ public class ChatManager {
} }
// Check if command // Check if command
if (message.charAt(0) == '!') { if (message.charAt(0) == '!' || message.charAt(0) == '/') {
PlayerCommands.handle(player, message); PlayerCommands.handle(player, message);
return; return;
} }