修复管理员菜单:从config.yml读取配置,添加权限过滤的Tab补全,优化代码性能
This commit is contained in:
@@ -2,10 +2,42 @@ package cn.infstar.essentialsC.commands;
|
||||
|
||||
import cn.infstar.essentialsC.EssentialsC;
|
||||
import cn.infstar.essentialsC.LangManager;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.command.TabCompleter;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
public class HelpCommand extends BaseCommand {
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
public class HelpCommand extends BaseCommand implements TabCompleter {
|
||||
|
||||
// 缓存命令实例,避免重复创建
|
||||
static final java.util.Map<String, BaseCommand> COMMAND_CACHE = new java.util.HashMap<>();
|
||||
|
||||
static {
|
||||
COMMAND_CACHE.put("workbench", new WorkbenchCommand());
|
||||
COMMAND_CACHE.put("anvil", new AnvilCommand());
|
||||
COMMAND_CACHE.put("enchantingtable", new EnchantingTableCommand());
|
||||
COMMAND_CACHE.put("cartographytable", new CartographyTableCommand());
|
||||
COMMAND_CACHE.put("grindstone", new GrindstoneCommand());
|
||||
COMMAND_CACHE.put("loom", new LoomCommand());
|
||||
COMMAND_CACHE.put("smithingtable", new SmithingTableCommand());
|
||||
COMMAND_CACHE.put("stonecutter", new StonecutterCommand());
|
||||
COMMAND_CACHE.put("enderchest", new EnderChestCommand());
|
||||
COMMAND_CACHE.put("hat", new HatCommand());
|
||||
COMMAND_CACHE.put("suicide", new SuicideCommand());
|
||||
COMMAND_CACHE.put("fly", new FlyCommand());
|
||||
COMMAND_CACHE.put("heal", new HealCommand());
|
||||
COMMAND_CACHE.put("vanish", new VanishCommand());
|
||||
COMMAND_CACHE.put("seen", new SeenCommand());
|
||||
COMMAND_CACHE.put("feed", new FeedCommand());
|
||||
COMMAND_CACHE.put("repair", new RepairCommand());
|
||||
COMMAND_CACHE.put("admin", new AdminMenuCommand());
|
||||
}
|
||||
|
||||
public HelpCommand() {
|
||||
super("essentialsc.command.help");
|
||||
@@ -13,6 +45,60 @@ public class HelpCommand extends BaseCommand {
|
||||
|
||||
@Override
|
||||
protected boolean execute(@NotNull Player player, String[] args) {
|
||||
if (args.length > 0) {
|
||||
String subCommand = args[0].toLowerCase();
|
||||
|
||||
// 管理相关
|
||||
if (subCommand.equals("admin")) {
|
||||
if (!player.hasPermission("essentialsc.command.admin")) {
|
||||
player.sendMessage(getLang().getString("messages.no-permission"));
|
||||
return true;
|
||||
}
|
||||
COMMAND_CACHE.get("admin").execute(player, new String[]{});
|
||||
return true;
|
||||
} else if (subCommand.equals("reload")) {
|
||||
if (!player.hasPermission("essentialsc.command.reload")) {
|
||||
player.sendMessage(getLang().getString("messages.no-permission"));
|
||||
return true;
|
||||
}
|
||||
plugin.reloadConfig();
|
||||
EssentialsC.getLangManager().reload();
|
||||
player.sendMessage("§a配置已重载!");
|
||||
return true;
|
||||
}
|
||||
// 功能方块和其他命令 - 使用别名映射
|
||||
String actualCommand = getActualCommand(subCommand);
|
||||
if (actualCommand != null && COMMAND_CACHE.containsKey(actualCommand)) {
|
||||
String permission = getPermissionForCommand(actualCommand);
|
||||
if (!player.hasPermission(permission)) {
|
||||
player.sendMessage(getLang().getString("messages.no-permission"));
|
||||
return true;
|
||||
}
|
||||
|
||||
// seen 需要特殊处理参数
|
||||
if (actualCommand.equals("seen")) {
|
||||
if (args.length < 2) {
|
||||
player.sendMessage("§c用法: /essc seen <玩家名>");
|
||||
return true;
|
||||
}
|
||||
COMMAND_CACHE.get("seen").execute(player, new String[]{args[1]});
|
||||
} else {
|
||||
COMMAND_CACHE.get(actualCommand).execute(player, new String[]{});
|
||||
}
|
||||
return true;
|
||||
} else if (subCommand.equals("version") || subCommand.equals("v")) {
|
||||
player.sendMessage("§6EssentialsC §fv" + plugin.getDescription().getVersion());
|
||||
player.sendMessage("§7运行在 Paper " + Bukkit.getVersion());
|
||||
return true;
|
||||
} else {
|
||||
// 未知子命令
|
||||
player.sendMessage("§c未知子命令: " + subCommand);
|
||||
player.sendMessage("§7使用 §f/essc help §7查看所有可用命令");
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
// 显示帮助
|
||||
LangManager lang = getLang();
|
||||
String version = plugin.getDescription().getVersion();
|
||||
|
||||
@@ -110,4 +196,101 @@ public class HelpCommand extends BaseCommand {
|
||||
player.sendMessage(lang.getString("help.footer"));
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 将别名映射到实际命令名
|
||||
*/
|
||||
private String getActualCommand(String alias) {
|
||||
return switch (alias) {
|
||||
case "wb" -> "workbench";
|
||||
case "enchant", "et" -> "enchantingtable";
|
||||
case "cartography", "ct" -> "cartographytable";
|
||||
case "gs" -> "grindstone";
|
||||
case "smithing", "st" -> "smithingtable";
|
||||
case "sc" -> "stonecutter";
|
||||
case "ec" -> "enderchest";
|
||||
case "die" -> "suicide";
|
||||
case "info" -> "seen";
|
||||
case "rep" -> "repair";
|
||||
default -> alias;
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取命令对应的权限节点
|
||||
*/
|
||||
private String getPermissionForCommand(String command) {
|
||||
return "essentialsc.command." + command;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
|
||||
if (args.length == 1) {
|
||||
List<String> completions = new ArrayList<>();
|
||||
String partial = args[0].toLowerCase();
|
||||
|
||||
// 所有可能的子命令及其权限(包括别名)
|
||||
String[][] subCommands = {
|
||||
{"admin", "essentialsc.command.admin"},
|
||||
{"reload", "essentialsc.command.reload"},
|
||||
{"workbench", "essentialsc.command.workbench"},
|
||||
{"wb", "essentialsc.command.workbench"},
|
||||
{"anvil", "essentialsc.command.anvil"},
|
||||
{"enchantingtable", "essentialsc.command.enchantingtable"},
|
||||
{"enchant", "essentialsc.command.enchantingtable"},
|
||||
{"et", "essentialsc.command.enchantingtable"},
|
||||
{"cartographytable", "essentialsc.command.cartographytable"},
|
||||
{"cartography", "essentialsc.command.cartographytable"},
|
||||
{"ct", "essentialsc.command.cartographytable"},
|
||||
{"grindstone", "essentialsc.command.grindstone"},
|
||||
{"gs", "essentialsc.command.grindstone"},
|
||||
{"loom", "essentialsc.command.loom"},
|
||||
{"smithingtable", "essentialsc.command.smithingtable"},
|
||||
{"smithing", "essentialsc.command.smithingtable"},
|
||||
{"st", "essentialsc.command.smithingtable"},
|
||||
{"stonecutter", "essentialsc.command.stonecutter"},
|
||||
{"sc", "essentialsc.command.stonecutter"},
|
||||
{"enderchest", "essentialsc.command.enderchest"},
|
||||
{"ec", "essentialsc.command.enderchest"},
|
||||
{"hat", "essentialsc.command.hat"},
|
||||
{"suicide", "essentialsc.command.suicide"},
|
||||
{"die", "essentialsc.command.suicide"},
|
||||
{"fly", "essentialsc.command.fly"},
|
||||
{"heal", "essentialsc.command.heal"},
|
||||
{"vanish", "essentialsc.command.vanish"},
|
||||
{"v", "essentialsc.command.vanish"},
|
||||
{"seen", "essentialsc.command.seen"},
|
||||
{"info", "essentialsc.command.seen"},
|
||||
{"feed", "essentialsc.command.feed"},
|
||||
{"repair", "essentialsc.command.repair"},
|
||||
{"rep", "essentialsc.command.repair"},
|
||||
{"version", null},
|
||||
{"help", null}
|
||||
};
|
||||
|
||||
for (String[] subCmd : subCommands) {
|
||||
if (subCmd[0].startsWith(partial)) {
|
||||
if (subCmd[1] == null || sender.hasPermission(subCmd[1])) {
|
||||
completions.add(subCmd[0]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return completions;
|
||||
} else if (args.length == 2) {
|
||||
String subCmd = args[0].toLowerCase();
|
||||
if ((subCmd.equals("seen") || subCmd.equals("info")) && sender.hasPermission("essentialsc.command.seen")) {
|
||||
List<String> players = new ArrayList<>();
|
||||
String partial = args[1].toLowerCase();
|
||||
for (Player p : Bukkit.getOnlinePlayers()) {
|
||||
if (p.getName().toLowerCase().startsWith(partial)) {
|
||||
players.add(p.getName());
|
||||
}
|
||||
}
|
||||
return players;
|
||||
}
|
||||
}
|
||||
|
||||
return new ArrayList<>();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user