refactor: 改为运行期模块开关并简化构建
This commit is contained in:
@@ -16,15 +16,23 @@ import java.lang.reflect.Field;
|
||||
public final class EssentialsC extends JavaPlugin {
|
||||
|
||||
private static LangManager langManager;
|
||||
private ModuleManager moduleManager;
|
||||
private AdminModeManager adminModeManager;
|
||||
private TpsBarService tpsBarManager;
|
||||
|
||||
@Override
|
||||
public void onEnable() {
|
||||
langManager = new LangManager(this);
|
||||
adminModeManager = new AdminModeManager(this);
|
||||
getServer().getPluginManager().registerEvents(adminModeManager, this);
|
||||
tpsBarManager = createOptionalService("cn.infstar.essentialsC.tpsbar.TpsBarManager", TpsBarService.class);
|
||||
moduleManager = new ModuleManager(this);
|
||||
|
||||
if (moduleManager.isEnabled(ModuleManager.ADMIN_MODE)) {
|
||||
adminModeManager = new AdminModeManager(this);
|
||||
getServer().getPluginManager().registerEvents(adminModeManager, this);
|
||||
}
|
||||
|
||||
if (moduleManager.isEnabled(ModuleManager.TPSBAR)) {
|
||||
tpsBarManager = createOptionalService("cn.infstar.essentialsC.tpsbar.TpsBarManager", TpsBarService.class);
|
||||
}
|
||||
if (tpsBarManager instanceof Listener listener) {
|
||||
getServer().getPluginManager().registerEvents(listener, this);
|
||||
}
|
||||
@@ -32,7 +40,7 @@ public final class EssentialsC extends JavaPlugin {
|
||||
registerListeners();
|
||||
registerCommands();
|
||||
|
||||
getLogger().info("EssentialsC enabled. Version: " + getDescription().getVersion());
|
||||
getLogger().info("EssentialsC 已启用,版本: " + getDescription().getVersion());
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -43,7 +51,7 @@ public final class EssentialsC extends JavaPlugin {
|
||||
if (adminModeManager != null) {
|
||||
adminModeManager.shutdown();
|
||||
}
|
||||
getLogger().info("EssentialsC disabled.");
|
||||
getLogger().info("EssentialsC 已禁用。");
|
||||
}
|
||||
|
||||
public static LangManager getLangManager() {
|
||||
@@ -54,28 +62,38 @@ public final class EssentialsC extends JavaPlugin {
|
||||
return adminModeManager;
|
||||
}
|
||||
|
||||
public ModuleManager getModuleManager() {
|
||||
return moduleManager;
|
||||
}
|
||||
|
||||
public TpsBarService getTpsBarManager() {
|
||||
return tpsBarManager;
|
||||
}
|
||||
|
||||
private void registerPluginChannels() {
|
||||
if (!moduleManager.isEnabled(ModuleManager.JEI_SYNC)) {
|
||||
return;
|
||||
}
|
||||
org.bukkit.plugin.messaging.Messenger messenger = getServer().getMessenger();
|
||||
messenger.registerOutgoingPluginChannel(this, "fabric:recipe_sync");
|
||||
messenger.registerOutgoingPluginChannel(this, "neoforge:recipe_content");
|
||||
}
|
||||
|
||||
private void registerListeners() {
|
||||
if (registerListener("cn.infstar.essentialsC.listeners.ShulkerBoxListener")) {
|
||||
getLogger().info("- Shulker box module");
|
||||
if (moduleManager.isEnabled(ModuleManager.BLOCKS)
|
||||
&& registerListener("cn.infstar.essentialsC.listeners.ShulkerBoxListener")) {
|
||||
getLogger().info("- 潜影盒模块");
|
||||
}
|
||||
|
||||
if (registerListener("cn.infstar.essentialsC.listeners.JeiRecipeSyncListener")) {
|
||||
getLogger().info("- JEI recipe sync");
|
||||
if (moduleManager.isEnabled(ModuleManager.JEI_SYNC)
|
||||
&& registerListener("cn.infstar.essentialsC.listeners.JeiRecipeSyncListener")) {
|
||||
getLogger().info("- JEI 配方同步");
|
||||
}
|
||||
|
||||
if (registerListener("cn.infstar.essentialsC.listeners.MobDropListener")) {
|
||||
if (moduleManager.isEnabled(ModuleManager.MOB_DROPS)
|
||||
&& registerListener("cn.infstar.essentialsC.listeners.MobDropListener")) {
|
||||
createOptionalInstance("cn.infstar.essentialsC.listeners.MobDropMenuListener");
|
||||
getLogger().info("- Mob drop control");
|
||||
getLogger().info("- 生物掉落控制");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -127,7 +145,7 @@ public final class EssentialsC extends JavaPlugin {
|
||||
|
||||
registerCommandWithAliases(commandMap, "essentialsc", new HelpCommand(), "essc");
|
||||
} catch (Exception e) {
|
||||
getLogger().severe("Failed to register commands: " + e.getMessage());
|
||||
getLogger().severe("注册命令失败: " + e.getMessage());
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
@@ -136,6 +154,10 @@ public final class EssentialsC extends JavaPlugin {
|
||||
Command command = new Command(name) {
|
||||
@Override
|
||||
public boolean execute(CommandSender sender, String commandLabel, String[] args) {
|
||||
if (CommandRegistry.resolveCommandName(name) != null && !CommandRegistry.isAvailable(name)) {
|
||||
sender.sendMessage(EssentialsC.getLangManager().getPrefixedString("messages.module-disabled"));
|
||||
return true;
|
||||
}
|
||||
return executor.onCommand(sender, this, commandLabel, args);
|
||||
}
|
||||
|
||||
@@ -155,6 +177,10 @@ public final class EssentialsC extends JavaPlugin {
|
||||
Command aliasCmd = new Command(alias) {
|
||||
@Override
|
||||
public boolean execute(CommandSender sender, String commandLabel, String[] args) {
|
||||
if (CommandRegistry.resolveCommandName(name) != null && !CommandRegistry.isAvailable(name)) {
|
||||
sender.sendMessage(EssentialsC.getLangManager().getPrefixedString("messages.module-disabled"));
|
||||
return true;
|
||||
}
|
||||
return executor.onCommand(sender, this, commandLabel, args);
|
||||
}
|
||||
|
||||
|
||||
@@ -38,7 +38,7 @@ public class LangManager {
|
||||
public String getString(String path) {
|
||||
String value = langFile.getString(path);
|
||||
if (value == null) {
|
||||
return translateColorCodes("&cMissing translation: " + path);
|
||||
return translateColorCodes("&c缺少语言文本: " + path);
|
||||
}
|
||||
return translateColorCodes(value);
|
||||
}
|
||||
@@ -58,7 +58,7 @@ public class LangManager {
|
||||
public List<String> getStringList(String path) {
|
||||
List<String> values = langFile.getStringList(path);
|
||||
if (values.isEmpty()) {
|
||||
values = List.of("&cMissing translation: " + path);
|
||||
values = List.of("&c缺少语言文本: " + path);
|
||||
}
|
||||
|
||||
List<String> translated = new ArrayList<>();
|
||||
@@ -92,7 +92,7 @@ public class LangManager {
|
||||
try {
|
||||
config.save(configFile);
|
||||
} catch (Exception e) {
|
||||
plugin.getLogger().severe("Failed to save config.yml: " + e.getMessage());
|
||||
plugin.getLogger().severe("保存 config.yml 失败: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -115,10 +115,10 @@ public class LangManager {
|
||||
newConfig.set("language", language);
|
||||
newConfig.save(configFile);
|
||||
|
||||
plugin.getLogger().info("Migrated config.yml from version " + existingVersion
|
||||
+ " to " + CURRENT_CONFIG_VERSION + ". Backup saved to " + backupFile.getName());
|
||||
plugin.getLogger().info("已将 config.yml 从版本 " + existingVersion
|
||||
+ " 迁移到 " + CURRENT_CONFIG_VERSION + ",备份文件: " + backupFile.getName());
|
||||
} catch (IOException e) {
|
||||
plugin.getLogger().severe("Failed to migrate config.yml: " + e.getMessage());
|
||||
plugin.getLogger().severe("迁移 config.yml 失败: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -127,7 +127,7 @@ public class LangManager {
|
||||
|
||||
File langFolder = new File(plugin.getDataFolder(), "lang");
|
||||
if (!langFolder.exists() && !langFolder.mkdirs()) {
|
||||
plugin.getLogger().warning("Failed to create language folder: " + langFolder.getAbsolutePath());
|
||||
plugin.getLogger().warning("创建语言文件夹失败: " + langFolder.getAbsolutePath());
|
||||
}
|
||||
|
||||
File langFileObj = new File(langFolder, currentLanguage + ".yml");
|
||||
@@ -135,7 +135,7 @@ public class LangManager {
|
||||
if (plugin.getResource("lang/" + currentLanguage + ".yml") != null) {
|
||||
plugin.saveResource("lang/" + currentLanguage + ".yml", false);
|
||||
} else {
|
||||
plugin.getLogger().warning("Language file not found: " + currentLanguage + ".yml, falling back to en_US");
|
||||
plugin.getLogger().warning("未找到语言文件: " + currentLanguage + ".yml,已回退到 en_US");
|
||||
currentLanguage = "en_US";
|
||||
plugin.saveResource("lang/en_US.yml", false);
|
||||
langFileObj = new File(langFolder, "en_US.yml");
|
||||
|
||||
@@ -0,0 +1,76 @@
|
||||
package cn.infstar.essentialsC;
|
||||
|
||||
import org.bukkit.configuration.file.FileConfiguration;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public final class ModuleManager {
|
||||
|
||||
private static final int CURRENT_CONFIG_VERSION = 1;
|
||||
|
||||
public static final String BLOCKS = "blocks";
|
||||
public static final String PLAYER = "player";
|
||||
public static final String ADMIN_MODE = "admin-mode";
|
||||
public static final String TPSBAR = "tpsbar";
|
||||
public static final String JEI_SYNC = "jei-sync";
|
||||
public static final String MOB_DROPS = "mob-drops";
|
||||
|
||||
private static final Map<String, Boolean> DEFAULT_MODULES = new LinkedHashMap<>();
|
||||
|
||||
static {
|
||||
DEFAULT_MODULES.put(BLOCKS, true);
|
||||
DEFAULT_MODULES.put(PLAYER, true);
|
||||
DEFAULT_MODULES.put(ADMIN_MODE, true);
|
||||
DEFAULT_MODULES.put(TPSBAR, true);
|
||||
DEFAULT_MODULES.put(JEI_SYNC, true);
|
||||
DEFAULT_MODULES.put(MOB_DROPS, false);
|
||||
}
|
||||
|
||||
private final JavaPlugin plugin;
|
||||
private final File modulesFile;
|
||||
private FileConfiguration modulesConfig;
|
||||
|
||||
public ModuleManager(JavaPlugin plugin) {
|
||||
this.plugin = plugin;
|
||||
this.modulesFile = new File(plugin.getDataFolder(), "modules.yml");
|
||||
reload();
|
||||
}
|
||||
|
||||
public void reload() {
|
||||
if (!modulesFile.exists()) {
|
||||
plugin.saveResource("modules.yml", false);
|
||||
}
|
||||
|
||||
modulesConfig = YamlConfiguration.loadConfiguration(modulesFile);
|
||||
modulesConfig.addDefault("config-version", CURRENT_CONFIG_VERSION);
|
||||
for (Map.Entry<String, Boolean> module : DEFAULT_MODULES.entrySet()) {
|
||||
modulesConfig.addDefault(path(module.getKey()), module.getValue());
|
||||
}
|
||||
modulesConfig.options().copyDefaults(true);
|
||||
save();
|
||||
}
|
||||
|
||||
public boolean isEnabled(String moduleKey) {
|
||||
if (moduleKey == null || moduleKey.isBlank()) {
|
||||
return true;
|
||||
}
|
||||
return modulesConfig.getBoolean(path(moduleKey), true);
|
||||
}
|
||||
|
||||
private String path(String moduleKey) {
|
||||
return "modules." + moduleKey + ".enabled";
|
||||
}
|
||||
|
||||
private void save() {
|
||||
try {
|
||||
modulesConfig.save(modulesFile);
|
||||
} catch (IOException e) {
|
||||
plugin.getLogger().warning("保存 modules.yml 失败: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -328,7 +328,7 @@ public final class AdminModeManager implements Listener {
|
||||
try {
|
||||
data.save(dataFile);
|
||||
} catch (IOException e) {
|
||||
plugin.getLogger().warning("Failed to save admin-mode.yml: " + e.getMessage());
|
||||
plugin.getLogger().warning("保存 admin-mode.yml 失败: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -10,6 +10,10 @@ public class AdminCommand extends BaseCommand {
|
||||
|
||||
@Override
|
||||
protected boolean execute(Player player, String[] args) {
|
||||
if (plugin.getAdminModeManager() == null) {
|
||||
player.sendMessage(getLang().getPrefixedString("messages.module-disabled"));
|
||||
return true;
|
||||
}
|
||||
plugin.getAdminModeManager().toggle(player);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package cn.infstar.essentialsC.commands;
|
||||
|
||||
import cn.infstar.essentialsC.EssentialsC;
|
||||
import cn.infstar.essentialsC.ModuleManager;
|
||||
import cn.infstar.essentialsC.tpsbar.TpsBarService;
|
||||
|
||||
import java.lang.reflect.Constructor;
|
||||
@@ -20,44 +21,44 @@ public final class CommandRegistry {
|
||||
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("nightvision", "essentialsc.command.nightvision", "cn.infstar.essentialsC.commands.NightVisionCommand", "nv");
|
||||
register("glow", "essentialsc.command.glow", "cn.infstar.essentialsC.commands.GlowCommand");
|
||||
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("tpsbar", "essentialsc.command.tpsbar", "cn.infstar.essentialsC.commands.TpsBarCommand");
|
||||
register("mobdrops", "essentialsc.mobdrops.enderman", "cn.infstar.essentialsC.commands.MobDropCommand");
|
||||
registerSubCommand("admin", "essentialsc.command.admin", "cn.infstar.essentialsC.commands.AdminCommand");
|
||||
register("workbench", "essentialsc.command.workbench", ModuleManager.BLOCKS, "cn.infstar.essentialsC.commands.WorkbenchCommand", "wb");
|
||||
register("anvil", "essentialsc.command.anvil", ModuleManager.BLOCKS, "cn.infstar.essentialsC.commands.AnvilCommand");
|
||||
register("cartographytable", "essentialsc.command.cartographytable", ModuleManager.BLOCKS, "cn.infstar.essentialsC.commands.CartographyTableCommand", "ct", "cartography");
|
||||
register("grindstone", "essentialsc.command.grindstone", ModuleManager.BLOCKS, "cn.infstar.essentialsC.commands.GrindstoneCommand", "gs");
|
||||
register("loom", "essentialsc.command.loom", ModuleManager.BLOCKS, "cn.infstar.essentialsC.commands.LoomCommand");
|
||||
register("smithingtable", "essentialsc.command.smithingtable", ModuleManager.BLOCKS, "cn.infstar.essentialsC.commands.SmithingTableCommand", "st", "smithing");
|
||||
register("stonecutter", "essentialsc.command.stonecutter", ModuleManager.BLOCKS, "cn.infstar.essentialsC.commands.StonecutterCommand", "sc");
|
||||
register("enderchest", "essentialsc.command.enderchest", ModuleManager.BLOCKS, "cn.infstar.essentialsC.commands.EnderChestCommand", "ec");
|
||||
register("blocks", "essentialsc.command.blocks", ModuleManager.BLOCKS, "cn.infstar.essentialsC.commands.BlocksMenuCommand");
|
||||
register("hat", "essentialsc.command.hat", ModuleManager.PLAYER, "cn.infstar.essentialsC.commands.HatCommand");
|
||||
register("suicide", "essentialsc.command.suicide", ModuleManager.PLAYER, "cn.infstar.essentialsC.commands.SuicideCommand", "die");
|
||||
register("fly", "essentialsc.command.fly", ModuleManager.PLAYER, "cn.infstar.essentialsC.commands.FlyCommand");
|
||||
register("nightvision", "essentialsc.command.nightvision", ModuleManager.PLAYER, "cn.infstar.essentialsC.commands.NightVisionCommand", "nv");
|
||||
register("glow", "essentialsc.command.glow", ModuleManager.PLAYER, "cn.infstar.essentialsC.commands.GlowCommand");
|
||||
register("heal", "essentialsc.command.heal", ModuleManager.PLAYER, "cn.infstar.essentialsC.commands.HealCommand");
|
||||
register("vanish", "essentialsc.command.vanish", ModuleManager.PLAYER, "cn.infstar.essentialsC.commands.VanishCommand", "v");
|
||||
register("seen", "essentialsc.command.seen", ModuleManager.PLAYER, "cn.infstar.essentialsC.commands.SeenCommand", "info");
|
||||
register("feed", "essentialsc.command.feed", ModuleManager.PLAYER, "cn.infstar.essentialsC.commands.FeedCommand");
|
||||
register("repair", "essentialsc.command.repair", ModuleManager.PLAYER, "cn.infstar.essentialsC.commands.RepairCommand", "rep");
|
||||
register("tpsbar", "essentialsc.command.tpsbar", ModuleManager.TPSBAR, "cn.infstar.essentialsC.commands.TpsBarCommand");
|
||||
register("mobdrops", "essentialsc.mobdrops.enderman", ModuleManager.MOB_DROPS, "cn.infstar.essentialsC.commands.MobDropCommand");
|
||||
registerSubCommand("admin", "essentialsc.command.admin", ModuleManager.ADMIN_MODE, "cn.infstar.essentialsC.commands.AdminCommand");
|
||||
}
|
||||
|
||||
private CommandRegistry() {
|
||||
}
|
||||
|
||||
private static void register(String name, String permission, String className, String... aliases) {
|
||||
register(name, permission, className, true, aliases);
|
||||
private static void register(String name, String permission, String moduleKey, String className, String... aliases) {
|
||||
register(name, permission, moduleKey, className, true, aliases);
|
||||
}
|
||||
|
||||
private static void registerSubCommand(String name, String permission, String className, String... aliases) {
|
||||
register(name, permission, className, false, aliases);
|
||||
private static void registerSubCommand(String name, String permission, String moduleKey, String className, String... aliases) {
|
||||
register(name, permission, moduleKey, className, false, aliases);
|
||||
}
|
||||
|
||||
private static void register(String name, String permission, String className, boolean standalone, String... aliases) {
|
||||
private static void register(String name, String permission, String moduleKey, String className, boolean standalone, String... aliases) {
|
||||
List<String> aliasList = List.of(aliases);
|
||||
CommandSpec spec = new CommandSpec(name, permission, className, aliasList, standalone);
|
||||
CommandSpec spec = new CommandSpec(name, permission, moduleKey, className, aliasList, standalone);
|
||||
COMMANDS.put(name, spec);
|
||||
ALIAS_TO_COMMAND.put(name, name);
|
||||
for (String alias : aliasList) {
|
||||
@@ -91,6 +92,10 @@ public final class CommandRegistry {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (isRuntimeDisabled(resolvedName)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
BaseCommand cached = COMMAND_CACHE.get(resolvedName);
|
||||
if (cached != null) {
|
||||
return cached;
|
||||
@@ -98,9 +103,6 @@ public final class CommandRegistry {
|
||||
if (UNAVAILABLE_COMMANDS.contains(resolvedName)) {
|
||||
return null;
|
||||
}
|
||||
if (isRuntimeDisabled(resolvedName)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
CommandSpec spec = COMMANDS.get(resolvedName);
|
||||
if (spec == null) {
|
||||
@@ -125,6 +127,21 @@ public final class CommandRegistry {
|
||||
}
|
||||
|
||||
private static boolean isRuntimeDisabled(String resolvedName) {
|
||||
CommandSpec spec = COMMANDS.get(resolvedName);
|
||||
if (spec == null) {
|
||||
return true;
|
||||
}
|
||||
|
||||
try {
|
||||
EssentialsC plugin = EssentialsC.getPlugin(EssentialsC.class);
|
||||
ModuleManager moduleManager = plugin.getModuleManager();
|
||||
if (moduleManager != null && !moduleManager.isEnabled(spec.moduleKey())) {
|
||||
return true;
|
||||
}
|
||||
} catch (IllegalStateException ignored) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!"tpsbar".equals(resolvedName)) {
|
||||
return false;
|
||||
}
|
||||
@@ -138,6 +155,11 @@ public final class CommandRegistry {
|
||||
}
|
||||
}
|
||||
|
||||
public record CommandSpec(String name, String permission, String className, List<String> aliases, boolean standalone) {
|
||||
public static void clearCache() {
|
||||
COMMAND_CACHE.clear();
|
||||
UNAVAILABLE_COMMANDS.clear();
|
||||
}
|
||||
|
||||
public record CommandSpec(String name, String permission, String moduleKey, String className, List<String> aliases, boolean standalone) {
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package cn.infstar.essentialsC.commands;
|
||||
|
||||
import cn.infstar.essentialsC.EssentialsC;
|
||||
import cn.infstar.essentialsC.LangManager;
|
||||
import cn.infstar.essentialsC.ModuleManager;
|
||||
import cn.infstar.essentialsC.tpsbar.TpsBarService;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.command.Command;
|
||||
@@ -34,9 +35,15 @@ public class HelpCommand extends BaseCommand implements TabCompleter {
|
||||
}
|
||||
plugin.reloadConfig();
|
||||
EssentialsC.getLangManager().reload();
|
||||
plugin.getModuleManager().reload();
|
||||
CommandRegistry.clearCache();
|
||||
TpsBarService tpsBarService = plugin.getTpsBarManager();
|
||||
if (tpsBarService != null) {
|
||||
tpsBarService.reloadSettings();
|
||||
if (plugin.getModuleManager().isEnabled(ModuleManager.TPSBAR)) {
|
||||
tpsBarService.reloadSettings();
|
||||
} else {
|
||||
tpsBarService.shutdown();
|
||||
}
|
||||
}
|
||||
sender.sendMessage(getLang().getPrefixedString("messages.config-reloaded"));
|
||||
return true;
|
||||
@@ -56,9 +63,15 @@ public class HelpCommand extends BaseCommand implements TabCompleter {
|
||||
}
|
||||
plugin.reloadConfig();
|
||||
EssentialsC.getLangManager().reload();
|
||||
plugin.getModuleManager().reload();
|
||||
CommandRegistry.clearCache();
|
||||
TpsBarService tpsBarService = plugin.getTpsBarManager();
|
||||
if (tpsBarService != null) {
|
||||
tpsBarService.reloadSettings();
|
||||
if (plugin.getModuleManager().isEnabled(ModuleManager.TPSBAR)) {
|
||||
tpsBarService.reloadSettings();
|
||||
} else {
|
||||
tpsBarService.shutdown();
|
||||
}
|
||||
}
|
||||
sender.sendMessage(getLang().getPrefixedString("messages.config-reloaded"));
|
||||
return true;
|
||||
|
||||
@@ -30,26 +30,26 @@ public class SeenCommand extends BaseCommand {
|
||||
|
||||
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
||||
StringBuilder info = new StringBuilder();
|
||||
info.append(getLang().getPrefix()).append(ChatColor.GOLD).append("Player info: ")
|
||||
info.append(getLang().getPrefix()).append(ChatColor.GOLD).append("玩家信息: ")
|
||||
.append(ChatColor.WHITE).append(target.getName()).append("\n");
|
||||
|
||||
if (target.isOnline()) {
|
||||
info.append(ChatColor.GRAY).append("Status: ").append(ChatColor.GREEN).append("Online").append("\n");
|
||||
info.append(ChatColor.GRAY).append("状态: ").append(ChatColor.GREEN).append("在线").append("\n");
|
||||
Player onlinePlayer = target.getPlayer();
|
||||
if (onlinePlayer != null) {
|
||||
info.append(ChatColor.GRAY).append("World: ").append(ChatColor.WHITE)
|
||||
info.append(ChatColor.GRAY).append("所在世界: ").append(ChatColor.WHITE)
|
||||
.append(onlinePlayer.getWorld().getName()).append("\n");
|
||||
}
|
||||
} else {
|
||||
info.append(ChatColor.GRAY).append("Status: ").append(ChatColor.RED).append("Offline").append("\n");
|
||||
info.append(ChatColor.GRAY).append("状态: ").append(ChatColor.RED).append("离线").append("\n");
|
||||
long lastSeen = target.getLastSeen();
|
||||
if (lastSeen > 0) {
|
||||
info.append(ChatColor.GRAY).append("Last seen: ").append(ChatColor.WHITE)
|
||||
info.append(ChatColor.GRAY).append("最后在线: ").append(ChatColor.WHITE)
|
||||
.append(format.format(new Date(lastSeen))).append("\n");
|
||||
}
|
||||
}
|
||||
|
||||
info.append(ChatColor.GRAY).append("First joined: ").append(ChatColor.WHITE)
|
||||
info.append(ChatColor.GRAY).append("首次加入: ").append(ChatColor.WHITE)
|
||||
.append(format.format(new Date(target.getFirstPlayed())));
|
||||
|
||||
player.sendMessage(info.toString());
|
||||
|
||||
@@ -22,7 +22,7 @@ public class TpsBarCommand extends BaseCommand implements TabCompleter {
|
||||
protected boolean execute(Player player, String[] args) {
|
||||
TpsBarService tpsBarService = plugin.getTpsBarManager();
|
||||
if (tpsBarService == null) {
|
||||
player.sendMessage(getLang().getPrefixedString("messages.player-only"));
|
||||
player.sendMessage(getLang().getPrefixedString("messages.module-disabled"));
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -274,12 +274,12 @@ public class ShulkerBoxListener implements Listener {
|
||||
|
||||
private void writeInventoryBack(ItemStack shulkerItem, ItemStack[] contents) {
|
||||
if (!(shulkerItem.getItemMeta() instanceof BlockStateMeta blockStateMeta)) {
|
||||
plugin.getLogger().warning("Failed to save shulker box contents: missing BlockStateMeta.");
|
||||
plugin.getLogger().warning("保存潜影盒内容失败: 缺少 BlockStateMeta。");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!(blockStateMeta.getBlockState() instanceof ShulkerBox shulkerBox)) {
|
||||
plugin.getLogger().warning("Failed to save shulker box contents: block state is not a ShulkerBox.");
|
||||
plugin.getLogger().warning("保存潜影盒内容失败: 方块状态不是 ShulkerBox。");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user