fix: 修复模块加载并调整构建以兼容 Paper 26.1.2
This commit is contained in:
@@ -1,6 +1,8 @@
|
||||
package cn.infstar.essentialsC;
|
||||
|
||||
import cn.infstar.essentialsC.commands.*;
|
||||
import cn.infstar.essentialsC.commands.BaseCommand;
|
||||
import cn.infstar.essentialsC.commands.CommandRegistry;
|
||||
import cn.infstar.essentialsC.commands.HelpCommand;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
@@ -18,200 +20,112 @@ public final class EssentialsC extends JavaPlugin {
|
||||
registerPluginChannels();
|
||||
registerListeners();
|
||||
registerCommands();
|
||||
|
||||
getLogger().info("插件已启用!版本: " + getDescription().getVersion());
|
||||
|
||||
getLogger().info("EssentialsC enabled. Version: " + getDescription().getVersion());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDisable() {
|
||||
getLogger().info("EssentialsC 插件已禁用!");
|
||||
getLogger().info("EssentialsC disabled.");
|
||||
}
|
||||
|
||||
|
||||
public static LangManager getLangManager() {
|
||||
return langManager;
|
||||
}
|
||||
|
||||
/**
|
||||
* 注册 JEI 配方同步所需的插件频道
|
||||
*/
|
||||
|
||||
private void registerPluginChannels() {
|
||||
org.bukkit.plugin.messaging.Messenger messenger = getServer().getMessenger();
|
||||
// 注册 Fabric 和 NeoForge 的配方同步频道
|
||||
messenger.registerOutgoingPluginChannel(this, "fabric:recipe_sync");
|
||||
messenger.registerOutgoingPluginChannel(this, "neoforge:recipe_content");
|
||||
}
|
||||
|
||||
|
||||
private void registerListeners() {
|
||||
if (registerListener("cn.infstar.essentialsC.listeners.ShulkerBoxListener")) {
|
||||
getLogger().info("- 潜影盒模块");
|
||||
getLogger().info("- Shulker box module");
|
||||
}
|
||||
|
||||
|
||||
if (registerListener("cn.infstar.essentialsC.listeners.JeiRecipeSyncListener")) {
|
||||
getLogger().info("- JEI 配方同步");
|
||||
getLogger().info("- JEI recipe sync");
|
||||
}
|
||||
|
||||
|
||||
if (registerListener("cn.infstar.essentialsC.listeners.MobDropListener")) {
|
||||
try {
|
||||
Class.forName("cn.infstar.essentialsC.listeners.MobDropMenuListener");
|
||||
new cn.infstar.essentialsC.listeners.MobDropMenuListener(this);
|
||||
} catch (ClassNotFoundException e) {
|
||||
}
|
||||
getLogger().info("- 生物掉落控制");
|
||||
createOptionalInstance("cn.infstar.essentialsC.listeners.MobDropMenuListener");
|
||||
getLogger().info("- Mob drop control");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private boolean registerListener(String className) {
|
||||
try {
|
||||
Class<?> listenerClass = Class.forName(className);
|
||||
Object listenerInstance = listenerClass.getConstructor(EssentialsC.class).newInstance(this);
|
||||
getServer().getPluginManager().registerEvents((org.bukkit.event.Listener) listenerInstance, this);
|
||||
return true;
|
||||
} catch (Exception e) {
|
||||
} catch (Exception ignored) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void createOptionalInstance(String className) {
|
||||
try {
|
||||
Class<?> targetClass = Class.forName(className);
|
||||
targetClass.getConstructor(EssentialsC.class).newInstance(this);
|
||||
} catch (Exception ignored) {
|
||||
}
|
||||
}
|
||||
|
||||
private void registerCommands() {
|
||||
try {
|
||||
Field bukkitCommandMap = Bukkit.getServer().getClass().getDeclaredField("commandMap");
|
||||
bukkitCommandMap.setAccessible(true);
|
||||
org.bukkit.command.CommandMap commandMap = (org.bukkit.command.CommandMap) bukkitCommandMap.get(Bukkit.getServer());
|
||||
|
||||
int commandCount = 0;
|
||||
|
||||
if (classExists("cn.infstar.essentialsC.commands.WorkbenchCommand")) {
|
||||
registerCommandWithAliases(commandMap, "workbench", new WorkbenchCommand(), "wb");
|
||||
commandCount++;
|
||||
|
||||
for (CommandRegistry.CommandSpec spec : CommandRegistry.getCommandSpecs()) {
|
||||
BaseCommand executor = CommandRegistry.getCommand(spec.name());
|
||||
if (executor == null) {
|
||||
continue;
|
||||
}
|
||||
registerCommandWithAliases(commandMap, spec.name(), executor, spec.aliases().toArray(String[]::new));
|
||||
}
|
||||
if (classExists("cn.infstar.essentialsC.commands.AnvilCommand")) {
|
||||
registerCommandWithAliases(commandMap, "anvil", new AnvilCommand());
|
||||
commandCount++;
|
||||
}
|
||||
if (classExists("cn.infstar.essentialsC.commands.CartographyTableCommand")) {
|
||||
registerCommandWithAliases(commandMap, "cartographytable", new CartographyTableCommand(), "ct", "cartography");
|
||||
commandCount++;
|
||||
}
|
||||
if (classExists("cn.infstar.essentialsC.commands.GrindstoneCommand")) {
|
||||
registerCommandWithAliases(commandMap, "grindstone", new GrindstoneCommand(), "gs");
|
||||
commandCount++;
|
||||
}
|
||||
if (classExists("cn.infstar.essentialsC.commands.LoomCommand")) {
|
||||
registerCommandWithAliases(commandMap, "loom", new LoomCommand());
|
||||
commandCount++;
|
||||
}
|
||||
if (classExists("cn.infstar.essentialsC.commands.SmithingTableCommand")) {
|
||||
registerCommandWithAliases(commandMap, "smithingtable", new SmithingTableCommand(), "st", "smithing");
|
||||
commandCount++;
|
||||
}
|
||||
if (classExists("cn.infstar.essentialsC.commands.StonecutterCommand")) {
|
||||
registerCommandWithAliases(commandMap, "stonecutter", new StonecutterCommand(), "sc");
|
||||
commandCount++;
|
||||
}
|
||||
if (classExists("cn.infstar.essentialsC.commands.EnderChestCommand")) {
|
||||
registerCommandWithAliases(commandMap, "enderchest", new EnderChestCommand(), "ec");
|
||||
commandCount++;
|
||||
}
|
||||
if (classExists("cn.infstar.essentialsC.commands.BlocksMenuCommand")) {
|
||||
registerCommandWithAliases(commandMap, "blocks", new BlocksMenuCommand());
|
||||
commandCount++;
|
||||
}
|
||||
|
||||
if (classExists("cn.infstar.essentialsC.commands.FlyCommand")) {
|
||||
registerCommandWithAliases(commandMap, "fly", new FlyCommand());
|
||||
commandCount++;
|
||||
}
|
||||
if (classExists("cn.infstar.essentialsC.commands.HealCommand")) {
|
||||
registerCommandWithAliases(commandMap, "heal", new HealCommand());
|
||||
commandCount++;
|
||||
}
|
||||
if (classExists("cn.infstar.essentialsC.commands.FeedCommand")) {
|
||||
registerCommandWithAliases(commandMap, "feed", new FeedCommand());
|
||||
commandCount++;
|
||||
}
|
||||
if (classExists("cn.infstar.essentialsC.commands.VanishCommand")) {
|
||||
registerCommandWithAliases(commandMap, "vanish", new VanishCommand(), "v");
|
||||
commandCount++;
|
||||
}
|
||||
if (classExists("cn.infstar.essentialsC.commands.SeenCommand")) {
|
||||
registerCommandWithAliases(commandMap, "seen", new SeenCommand(), "info");
|
||||
commandCount++;
|
||||
}
|
||||
if (classExists("cn.infstar.essentialsC.commands.HatCommand")) {
|
||||
registerCommandWithAliases(commandMap, "hat", new HatCommand());
|
||||
commandCount++;
|
||||
}
|
||||
if (classExists("cn.infstar.essentialsC.commands.SuicideCommand")) {
|
||||
registerCommandWithAliases(commandMap, "suicide", new SuicideCommand(), "die");
|
||||
commandCount++;
|
||||
}
|
||||
if (classExists("cn.infstar.essentialsC.commands.RepairCommand")) {
|
||||
registerCommandWithAliases(commandMap, "repair", new RepairCommand(), "rep");
|
||||
commandCount++;
|
||||
}
|
||||
|
||||
if (classExists("cn.infstar.essentialsC.commands.MobDropCommand")) {
|
||||
registerCommandWithAliases(commandMap, "mobdrops", new MobDropCommand());
|
||||
commandCount++;
|
||||
}
|
||||
|
||||
|
||||
registerCommandWithAliases(commandMap, "essentialsc", new HelpCommand(), "essc");
|
||||
commandCount++;
|
||||
} catch (Exception e) {
|
||||
getLogger().severe("无法注册命令: " + e.getMessage());
|
||||
getLogger().severe("Failed to register commands: " + e.getMessage());
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
private boolean classExists(String className) {
|
||||
try {
|
||||
Class.forName(className);
|
||||
return true;
|
||||
} catch (ClassNotFoundException e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 注册命令并支持别名
|
||||
* @param commandMap Bukkit CommandMap
|
||||
* @param name 主命令名
|
||||
* @param executor 命令执行器
|
||||
* @param aliases 别名列表(可选)
|
||||
*/
|
||||
private void registerCommandWithAliases(org.bukkit.command.CommandMap commandMap, String name, cn.infstar.essentialsC.commands.BaseCommand executor, String... aliases) {
|
||||
|
||||
private void registerCommandWithAliases(org.bukkit.command.CommandMap commandMap, String name, BaseCommand executor, String... aliases) {
|
||||
Command command = new Command(name) {
|
||||
@Override
|
||||
public boolean execute(CommandSender sender, String commandLabel, String[] args) {
|
||||
return executor.onCommand(sender, this, commandLabel, args);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public java.util.List<String> tabComplete(CommandSender sender, String alias, String[] args) throws IllegalArgumentException {
|
||||
if (executor instanceof org.bukkit.command.TabCompleter) {
|
||||
return ((org.bukkit.command.TabCompleter) executor).onTabComplete(sender, this, alias, args);
|
||||
if (executor instanceof org.bukkit.command.TabCompleter completer) {
|
||||
return completer.onTabComplete(sender, this, alias, args);
|
||||
}
|
||||
return super.tabComplete(sender, alias, args);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
command.setPermission(executor.getPermission());
|
||||
// 注册到默认命名空间,使玩家可以直接使用 /workbench 而不是 /essentialsc:workbench
|
||||
commandMap.register("", command);
|
||||
|
||||
// 注册别名
|
||||
|
||||
for (String alias : aliases) {
|
||||
Command aliasCmd = new Command(alias) {
|
||||
@Override
|
||||
public boolean execute(CommandSender sender, String commandLabel, String[] args) {
|
||||
return executor.onCommand(sender, this, commandLabel, args);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public java.util.List<String> tabComplete(CommandSender sender, String alias, String[] args) throws IllegalArgumentException {
|
||||
if (executor instanceof org.bukkit.command.TabCompleter) {
|
||||
return ((org.bukkit.command.TabCompleter) executor).onTabComplete(sender, this, alias, args);
|
||||
public java.util.List<String> tabComplete(CommandSender sender, String label, String[] args) throws IllegalArgumentException {
|
||||
if (executor instanceof org.bukkit.command.TabCompleter completer) {
|
||||
return completer.onTabComplete(sender, this, label, args);
|
||||
}
|
||||
return super.tabComplete(sender, alias, args);
|
||||
return super.tabComplete(sender, label, args);
|
||||
}
|
||||
};
|
||||
aliasCmd.setPermission(executor.getPermission());
|
||||
|
||||
@@ -14,6 +14,8 @@ import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
import org.bukkit.persistence.PersistentDataType;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class BlocksMenuCommand extends BaseCommand implements Listener {
|
||||
|
||||
private static final int MENU_SIZE = 36;
|
||||
@@ -50,7 +52,7 @@ public class BlocksMenuCommand extends BaseCommand implements Listener {
|
||||
}
|
||||
|
||||
private void openMenu(Player player) {
|
||||
String title = plugin.getConfig().getString("blocks-menu.title", "&6&lEssentialsC &8- &e&l鍔熻兘鏂瑰潡鑿滃崟");
|
||||
String title = plugin.getConfig().getString("blocks-menu.title", "&6&lEssentialsC &8- &e&lBlocks Menu");
|
||||
Inventory menu = new BlocksMenuHolder(translateColor(title)).getInventory();
|
||||
|
||||
var itemsConfig = plugin.getConfig().getConfigurationSection("blocks-menu.items");
|
||||
@@ -76,7 +78,7 @@ public class BlocksMenuCommand extends BaseCommand implements Listener {
|
||||
}
|
||||
|
||||
String name = translateColor(section.getString("name", "&fItem"));
|
||||
java.util.List<String> lore = section.getStringList("lore").stream()
|
||||
List<String> lore = section.getStringList("lore").stream()
|
||||
.map(this::translateColor)
|
||||
.toList();
|
||||
|
||||
@@ -86,7 +88,7 @@ public class BlocksMenuCommand extends BaseCommand implements Listener {
|
||||
player.openInventory(menu);
|
||||
}
|
||||
|
||||
private void addItem(Inventory inv, int slot, Material material, String name, java.util.List<String> lore, String key) {
|
||||
private void addItem(Inventory inv, int slot, Material material, String name, List<String> lore, String key) {
|
||||
ItemStack item = new ItemStack(material);
|
||||
ItemMeta meta = item.getItemMeta();
|
||||
if (meta != null) {
|
||||
@@ -115,9 +117,10 @@ public class BlocksMenuCommand extends BaseCommand implements Listener {
|
||||
|
||||
ItemMeta meta = clicked.getItemMeta();
|
||||
String key = meta.getPersistentDataContainer().get(this.blockKey, PersistentDataType.STRING);
|
||||
if (key != null && HelpCommand.COMMAND_CACHE.containsKey(key)) {
|
||||
BaseCommand blockCommand = CommandRegistry.getCommand(key);
|
||||
if (blockCommand != null) {
|
||||
playBlockOpenSound(player, key);
|
||||
HelpCommand.COMMAND_CACHE.get(key).execute(player, new String[0]);
|
||||
blockCommand.execute(player, new String[0]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,111 @@
|
||||
package cn.infstar.essentialsC.commands;
|
||||
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
public final class CommandRegistry {
|
||||
|
||||
private static final Map<String, CommandSpec> COMMANDS = new LinkedHashMap<>();
|
||||
private static final Map<String, String> ALIAS_TO_COMMAND = new HashMap<>();
|
||||
private static final Map<String, BaseCommand> COMMAND_CACHE = new HashMap<>();
|
||||
private static final Set<String> UNAVAILABLE_COMMANDS = new java.util.HashSet<>();
|
||||
|
||||
static {
|
||||
register("workbench", "essentialsc.command.workbench", "cn.infstar.essentialsC.commands.WorkbenchCommand", "wb");
|
||||
register("anvil", "essentialsc.command.anvil", "cn.infstar.essentialsC.commands.AnvilCommand");
|
||||
register("cartographytable", "essentialsc.command.cartographytable", "cn.infstar.essentialsC.commands.CartographyTableCommand", "ct", "cartography");
|
||||
register("grindstone", "essentialsc.command.grindstone", "cn.infstar.essentialsC.commands.GrindstoneCommand", "gs");
|
||||
register("loom", "essentialsc.command.loom", "cn.infstar.essentialsC.commands.LoomCommand");
|
||||
register("smithingtable", "essentialsc.command.smithingtable", "cn.infstar.essentialsC.commands.SmithingTableCommand", "st", "smithing");
|
||||
register("stonecutter", "essentialsc.command.stonecutter", "cn.infstar.essentialsC.commands.StonecutterCommand", "sc");
|
||||
register("enderchest", "essentialsc.command.enderchest", "cn.infstar.essentialsC.commands.EnderChestCommand", "ec");
|
||||
register("blocks", "essentialsc.command.blocks", "cn.infstar.essentialsC.commands.BlocksMenuCommand");
|
||||
register("hat", "essentialsc.command.hat", "cn.infstar.essentialsC.commands.HatCommand");
|
||||
register("suicide", "essentialsc.command.suicide", "cn.infstar.essentialsC.commands.SuicideCommand", "die");
|
||||
register("fly", "essentialsc.command.fly", "cn.infstar.essentialsC.commands.FlyCommand");
|
||||
register("heal", "essentialsc.command.heal", "cn.infstar.essentialsC.commands.HealCommand");
|
||||
register("vanish", "essentialsc.command.vanish", "cn.infstar.essentialsC.commands.VanishCommand", "v");
|
||||
register("seen", "essentialsc.command.seen", "cn.infstar.essentialsC.commands.SeenCommand", "info");
|
||||
register("feed", "essentialsc.command.feed", "cn.infstar.essentialsC.commands.FeedCommand");
|
||||
register("repair", "essentialsc.command.repair", "cn.infstar.essentialsC.commands.RepairCommand", "rep");
|
||||
register("mobdrops", "essentialsc.mobdrops.enderman", "cn.infstar.essentialsC.commands.MobDropCommand");
|
||||
}
|
||||
|
||||
private CommandRegistry() {
|
||||
}
|
||||
|
||||
private static void register(String name, String permission, String className, String... aliases) {
|
||||
List<String> aliasList = List.of(aliases);
|
||||
CommandSpec spec = new CommandSpec(name, permission, className, aliasList);
|
||||
COMMANDS.put(name, spec);
|
||||
ALIAS_TO_COMMAND.put(name, name);
|
||||
for (String alias : aliasList) {
|
||||
ALIAS_TO_COMMAND.put(alias, name);
|
||||
}
|
||||
}
|
||||
|
||||
public static Collection<CommandSpec> getCommandSpecs() {
|
||||
return Collections.unmodifiableCollection(COMMANDS.values());
|
||||
}
|
||||
|
||||
public static String resolveCommandName(String input) {
|
||||
if (input == null) {
|
||||
return null;
|
||||
}
|
||||
return ALIAS_TO_COMMAND.get(input.toLowerCase());
|
||||
}
|
||||
|
||||
public static boolean isAvailable(String name) {
|
||||
return getCommand(name) != null;
|
||||
}
|
||||
|
||||
public static String getPermission(String name) {
|
||||
CommandSpec spec = COMMANDS.get(name);
|
||||
return spec == null ? null : spec.permission();
|
||||
}
|
||||
|
||||
public static BaseCommand getCommand(String name) {
|
||||
String resolvedName = resolveCommandName(name);
|
||||
if (resolvedName == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
BaseCommand cached = COMMAND_CACHE.get(resolvedName);
|
||||
if (cached != null) {
|
||||
return cached;
|
||||
}
|
||||
if (UNAVAILABLE_COMMANDS.contains(resolvedName)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
CommandSpec spec = COMMANDS.get(resolvedName);
|
||||
if (spec == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
Class<?> rawClass = Class.forName(spec.className());
|
||||
if (!BaseCommand.class.isAssignableFrom(rawClass)) {
|
||||
UNAVAILABLE_COMMANDS.add(resolvedName);
|
||||
return null;
|
||||
}
|
||||
|
||||
Constructor<? extends BaseCommand> constructor = rawClass.asSubclass(BaseCommand.class).getDeclaredConstructor();
|
||||
BaseCommand command = constructor.newInstance();
|
||||
COMMAND_CACHE.put(resolvedName, command);
|
||||
return command;
|
||||
} catch (ReflectiveOperationException | LinkageError ignored) {
|
||||
UNAVAILABLE_COMMANDS.add(resolvedName);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public record CommandSpec(String name, String permission, String className, List<String> aliases) {
|
||||
}
|
||||
}
|
||||
@@ -10,44 +10,21 @@ import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
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("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("blocks", new BlocksMenuCommand());
|
||||
COMMAND_CACHE.put("mobdrops", new MobDropCommand());
|
||||
}
|
||||
|
||||
|
||||
public HelpCommand() {
|
||||
super("essentialsc.command.help");
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected boolean execute(Player player, String[] args) {
|
||||
return handleCommand(player, player, args);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected boolean executeConsole(org.bukkit.command.CommandSender sender, String[] args) {
|
||||
protected boolean executeConsole(CommandSender sender, String[] args) {
|
||||
if (args.length > 0 && args[0].equalsIgnoreCase("reload")) {
|
||||
if (!sender.hasPermission("essentialsc.command.reload")) {
|
||||
sender.sendMessage(getLang().getString("messages.no-permission"));
|
||||
@@ -55,17 +32,17 @@ public class HelpCommand extends BaseCommand implements TabCompleter {
|
||||
}
|
||||
plugin.reloadConfig();
|
||||
EssentialsC.getLangManager().reload();
|
||||
sender.sendMessage(getLang().getString("prefix") + "§a配置已重载!");
|
||||
sender.sendMessage(getLang().getString("prefix") + "Configuration reloaded.");
|
||||
return true;
|
||||
}
|
||||
sender.sendMessage(getLang().getString("messages.player-only"));
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
private boolean handleCommand(CommandSender sender, Player player, String[] args) {
|
||||
if (args.length > 0) {
|
||||
String subCommand = args[0].toLowerCase();
|
||||
|
||||
|
||||
if (subCommand.equals("reload")) {
|
||||
if (!sender.hasPermission("essentialsc.command.reload")) {
|
||||
sender.sendMessage(getLang().getString("messages.no-permission"));
|
||||
@@ -73,167 +50,140 @@ public class HelpCommand extends BaseCommand implements TabCompleter {
|
||||
}
|
||||
plugin.reloadConfig();
|
||||
EssentialsC.getLangManager().reload();
|
||||
sender.sendMessage(getLang().getString("prefix") + "§a配置已重载!");
|
||||
sender.sendMessage(getLang().getString("prefix") + "Configuration reloaded.");
|
||||
return true;
|
||||
}
|
||||
// 功能方块和其他命令 - 使用别名映射
|
||||
|
||||
String actualCommand = getActualCommand(subCommand);
|
||||
if (actualCommand != null && COMMAND_CACHE.containsKey(actualCommand)) {
|
||||
String permission = getPermissionForCommand(actualCommand);
|
||||
if (!player.hasPermission(permission)) {
|
||||
BaseCommand targetCommand = CommandRegistry.getCommand(actualCommand);
|
||||
if (actualCommand != null && targetCommand != null) {
|
||||
String permission = CommandRegistry.getPermission(actualCommand);
|
||||
if (permission != null && !player.hasPermission(permission)) {
|
||||
player.sendMessage(getLang().getString("messages.no-permission"));
|
||||
return true;
|
||||
}
|
||||
|
||||
// seen 需要特殊处理参数
|
||||
|
||||
if (actualCommand.equals("seen")) {
|
||||
if (args.length < 2) {
|
||||
player.sendMessage(getLang().getString("prefix") + getLang().getString("messages.seen-usage-console"));
|
||||
return true;
|
||||
}
|
||||
COMMAND_CACHE.get("seen").execute(player, new String[]{args[1]});
|
||||
targetCommand.execute(player, new String[]{args[1]});
|
||||
} else {
|
||||
COMMAND_CACHE.get(actualCommand).execute(player, new String[]{});
|
||||
targetCommand.execute(player, new String[0]);
|
||||
}
|
||||
return true;
|
||||
} else if (subCommand.equals("version") || subCommand.equals("v")) {
|
||||
player.sendMessage(getLang().getString("prefix") + "§6EssentialsC §fv" + plugin.getDescription().getVersion());
|
||||
player.sendMessage(getLang().getString("prefix") + "§7运行在 Paper " + Bukkit.getVersion());
|
||||
return true;
|
||||
} else {
|
||||
player.sendMessage(getLang().getString("prefix") + getLang().getString("messages.unknown-subcommand",
|
||||
java.util.Map.of("command", subCommand)));
|
||||
player.sendMessage(getLang().getString("prefix") + getLang().getString("messages.help-usage"));
|
||||
}
|
||||
|
||||
if (subCommand.equals("version") || subCommand.equals("v")) {
|
||||
player.sendMessage(getLang().getString("prefix") + "EssentialsC v" + plugin.getDescription().getVersion());
|
||||
player.sendMessage(getLang().getString("prefix") + "Running on Paper " + Bukkit.getVersion());
|
||||
return true;
|
||||
}
|
||||
|
||||
player.sendMessage(getLang().getString("prefix") + getLang().getString("messages.unknown-subcommand",
|
||||
Map.of("command", subCommand)));
|
||||
player.sendMessage(getLang().getString("prefix") + getLang().getString("messages.help-usage"));
|
||||
return true;
|
||||
}
|
||||
|
||||
// 显示帮助
|
||||
|
||||
LangManager lang = getLang();
|
||||
String version = plugin.getDescription().getVersion();
|
||||
|
||||
|
||||
player.sendMessage(lang.getString("help.title"));
|
||||
player.sendMessage(lang.getString("help.version",
|
||||
java.util.Map.of("version", version)));
|
||||
player.sendMessage(lang.getString("help.version", Map.of("version", version)));
|
||||
player.sendMessage("");
|
||||
|
||||
// 功能方块命令(检查权限后显示)
|
||||
|
||||
boolean hasBlockCommands = false;
|
||||
StringBuilder blockCommands = new StringBuilder();
|
||||
|
||||
if (player.hasPermission("essentialsc.command.workbench")) {
|
||||
|
||||
if (CommandRegistry.isAvailable("workbench") && player.hasPermission("essentialsc.command.workbench")) {
|
||||
blockCommands.append(lang.getString("help.commands.workbench")).append("\n");
|
||||
hasBlockCommands = true;
|
||||
}
|
||||
if (player.hasPermission("essentialsc.command.anvil")) {
|
||||
if (CommandRegistry.isAvailable("anvil") && player.hasPermission("essentialsc.command.anvil")) {
|
||||
blockCommands.append(lang.getString("help.commands.anvil")).append("\n");
|
||||
hasBlockCommands = true;
|
||||
}
|
||||
if (player.hasPermission("essentialsc.command.cartographytable")) {
|
||||
if (CommandRegistry.isAvailable("cartographytable") && player.hasPermission("essentialsc.command.cartographytable")) {
|
||||
blockCommands.append(lang.getString("help.commands.cartographytable")).append("\n");
|
||||
hasBlockCommands = true;
|
||||
}
|
||||
if (player.hasPermission("essentialsc.command.grindstone")) {
|
||||
if (CommandRegistry.isAvailable("grindstone") && player.hasPermission("essentialsc.command.grindstone")) {
|
||||
blockCommands.append(lang.getString("help.commands.grindstone")).append("\n");
|
||||
hasBlockCommands = true;
|
||||
}
|
||||
if (player.hasPermission("essentialsc.command.loom")) {
|
||||
if (CommandRegistry.isAvailable("loom") && player.hasPermission("essentialsc.command.loom")) {
|
||||
blockCommands.append(lang.getString("help.commands.loom")).append("\n");
|
||||
hasBlockCommands = true;
|
||||
}
|
||||
if (player.hasPermission("essentialsc.command.smithingtable")) {
|
||||
if (CommandRegistry.isAvailable("smithingtable") && player.hasPermission("essentialsc.command.smithingtable")) {
|
||||
blockCommands.append(lang.getString("help.commands.smithingtable")).append("\n");
|
||||
hasBlockCommands = true;
|
||||
}
|
||||
if (player.hasPermission("essentialsc.command.stonecutter")) {
|
||||
if (CommandRegistry.isAvailable("stonecutter") && player.hasPermission("essentialsc.command.stonecutter")) {
|
||||
blockCommands.append(lang.getString("help.commands.stonecutter")).append("\n");
|
||||
hasBlockCommands = true;
|
||||
}
|
||||
if (player.hasPermission("essentialsc.command.enderchest")) {
|
||||
if (CommandRegistry.isAvailable("enderchest") && player.hasPermission("essentialsc.command.enderchest")) {
|
||||
blockCommands.append(lang.getString("help.commands.enderchest")).append("\n");
|
||||
hasBlockCommands = true;
|
||||
}
|
||||
|
||||
|
||||
if (hasBlockCommands) {
|
||||
player.sendMessage(lang.getString("help.section-blocks"));
|
||||
player.sendMessage(blockCommands.toString().trim());
|
||||
player.sendMessage("");
|
||||
}
|
||||
|
||||
// 其他命令(检查权限后显示)
|
||||
|
||||
boolean hasOtherCommands = false;
|
||||
StringBuilder otherCommands = new StringBuilder();
|
||||
|
||||
if (player.hasPermission("essentialsc.command.hat")) {
|
||||
|
||||
if (CommandRegistry.isAvailable("hat") && player.hasPermission("essentialsc.command.hat")) {
|
||||
otherCommands.append(lang.getString("help.commands.hat")).append("\n");
|
||||
hasOtherCommands = true;
|
||||
}
|
||||
if (player.hasPermission("essentialsc.command.suicide")) {
|
||||
if (CommandRegistry.isAvailable("suicide") && player.hasPermission("essentialsc.command.suicide")) {
|
||||
otherCommands.append(lang.getString("help.commands.suicide")).append("\n");
|
||||
hasOtherCommands = true;
|
||||
}
|
||||
if (player.hasPermission("essentialsc.command.fly")) {
|
||||
if (CommandRegistry.isAvailable("fly") && player.hasPermission("essentialsc.command.fly")) {
|
||||
otherCommands.append(lang.getString("help.commands.fly")).append("\n");
|
||||
hasOtherCommands = true;
|
||||
}
|
||||
if (player.hasPermission("essentialsc.command.heal")) {
|
||||
if (CommandRegistry.isAvailable("heal") && player.hasPermission("essentialsc.command.heal")) {
|
||||
otherCommands.append(lang.getString("help.commands.heal")).append("\n");
|
||||
hasOtherCommands = true;
|
||||
}
|
||||
if (player.hasPermission("essentialsc.command.vanish")) {
|
||||
if (CommandRegistry.isAvailable("vanish") && player.hasPermission("essentialsc.command.vanish")) {
|
||||
otherCommands.append(lang.getString("help.commands.vanish")).append("\n");
|
||||
hasOtherCommands = true;
|
||||
}
|
||||
if (player.hasPermission("essentialsc.command.seen")) {
|
||||
if (CommandRegistry.isAvailable("seen") && player.hasPermission("essentialsc.command.seen")) {
|
||||
otherCommands.append(lang.getString("help.commands.seen")).append("\n");
|
||||
hasOtherCommands = true;
|
||||
}
|
||||
|
||||
|
||||
if (hasOtherCommands) {
|
||||
player.sendMessage(lang.getString("help.section-other"));
|
||||
player.sendMessage(otherCommands.toString().trim());
|
||||
player.sendMessage("");
|
||||
}
|
||||
|
||||
|
||||
player.sendMessage(lang.getString("help.footer"));
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 将别名映射到实际命令名
|
||||
*/
|
||||
|
||||
private String getActualCommand(String alias) {
|
||||
return switch (alias) {
|
||||
case "wb" -> "workbench";
|
||||
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;
|
||||
};
|
||||
return CommandRegistry.resolveCommandName(alias);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取命令对应的权限节点
|
||||
*/
|
||||
private String getPermissionForCommand(String command) {
|
||||
if (command.equals("mobdrops")) {
|
||||
return "essentialsc.mobdrops.enderman";
|
||||
}
|
||||
return "essentialsc.command." + command;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public List<String> onTabComplete(CommandSender sender, Command command, String label, String[] args) {
|
||||
if (args.length == 1) {
|
||||
List<String> completions = new ArrayList<>();
|
||||
String partial = args[0].toLowerCase();
|
||||
|
||||
// 所有可能的子命令及其权限(包括别名)
|
||||
|
||||
String[][] subCommands = {
|
||||
{"reload", "essentialsc.command.reload"},
|
||||
{"blocks", "essentialsc.command.blocks"},
|
||||
@@ -269,17 +219,23 @@ public class HelpCommand extends BaseCommand implements TabCompleter {
|
||||
{"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]);
|
||||
}
|
||||
if (!subCmd[0].startsWith(partial)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
String actualCommand = getActualCommand(subCmd[0]);
|
||||
boolean available = actualCommand == null || CommandRegistry.isAvailable(actualCommand);
|
||||
if (available && (subCmd[1] == null || sender.hasPermission(subCmd[1]))) {
|
||||
completions.add(subCmd[0]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return completions;
|
||||
} else if (args.length == 2) {
|
||||
}
|
||||
|
||||
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<>();
|
||||
@@ -292,7 +248,7 @@ public class HelpCommand extends BaseCommand implements TabCompleter {
|
||||
return players;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return new ArrayList<>();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user