feat: 完善维护模式与运行期功能管理

This commit is contained in:
2026-06-12 00:08:40 +08:00
parent 113ae24afe
commit 061c3be2b1
20 changed files with 686 additions and 181 deletions
@@ -33,19 +33,17 @@ public abstract class BaseCommand implements CommandExecutor {
}
protected void playBlockShortcutSound(Player player, Material material, Sound fallbackSound) {
Sound sound = resolvePlaceSound(material);
Sound sound = fallbackSound;
if (sound == null) {
sound = fallbackSound;
sound = resolvePlaceSound(material);
}
if (sound != null) {
player.playSound(player.getLocation(), sound, 1.0F, 1.0F);
}
playShortcutSound(player, sound);
}
protected void playShortcutSound(Player player, Sound sound) {
if (sound != null) {
player.playSound(player.getLocation(), sound, 1.0F, 1.0F);
player.playSound(player.getLocation(), sound, 0.65F, 1.0F);
}
}
@@ -4,6 +4,7 @@ import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.NamespacedKey;
import org.bukkit.Sound;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
@@ -70,6 +71,7 @@ public class BlocksMenuCommand extends BaseCommand implements Listener {
return;
}
player.openInventory(menu);
playShortcutSound(player, Sound.UI_BUTTON_CLICK);
return;
}
@@ -85,6 +87,7 @@ public class BlocksMenuCommand extends BaseCommand implements Listener {
}
player.openInventory(menu);
playShortcutSound(player, Sound.UI_BUTTON_CLICK);
}
private int renderSections(Inventory menu, Player player, org.bukkit.configuration.ConfigurationSection sectionsConfig) {
@@ -2,8 +2,6 @@ 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;
import org.bukkit.command.CommandSender;
@@ -37,17 +35,7 @@ public class HelpCommand extends BaseCommand implements TabCompleter {
EssentialsC.getLangManager().reload();
plugin.getModuleManager().reload();
CommandRegistry.clearCache();
if (plugin.getMaintenanceManager() != null && plugin.getModuleManager().isEnabled(ModuleManager.MAINTENANCE)) {
plugin.getMaintenanceManager().reload();
}
TpsBarService tpsBarService = plugin.getTpsBarManager();
if (tpsBarService != null) {
if (plugin.getModuleManager().isEnabled(ModuleManager.TPSBAR)) {
tpsBarService.reloadSettings();
} else {
tpsBarService.shutdown();
}
}
plugin.reloadRuntimeModules();
sender.sendMessage(getLang().getPrefixedString("messages.config-reloaded"));
return true;
}
@@ -68,17 +56,7 @@ public class HelpCommand extends BaseCommand implements TabCompleter {
EssentialsC.getLangManager().reload();
plugin.getModuleManager().reload();
CommandRegistry.clearCache();
if (plugin.getMaintenanceManager() != null && plugin.getModuleManager().isEnabled(ModuleManager.MAINTENANCE)) {
plugin.getMaintenanceManager().reload();
}
TpsBarService tpsBarService = plugin.getTpsBarManager();
if (tpsBarService != null) {
if (plugin.getModuleManager().isEnabled(ModuleManager.TPSBAR)) {
tpsBarService.reloadSettings();
} else {
tpsBarService.shutdown();
}
}
plugin.reloadRuntimeModules();
sender.sendMessage(getLang().getPrefixedString("messages.config-reloaded"));
return true;
}
@@ -360,7 +338,7 @@ public class HelpCommand extends BaseCommand implements TabCompleter {
private List<String> completeMaintenanceArgs(String partialInput) {
List<String> completions = new ArrayList<>();
String partial = partialInput.toLowerCase();
for (String option : List.of("on", "off", "status", "reload")) {
for (String option : List.of("on", "off", "status", "reload", "add", "remove", "list")) {
if (option.startsWith(partial)) {
completions.add(option);
}
@@ -8,6 +8,8 @@ import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
public class MaintenanceCommand extends BaseCommand implements TabCompleter {
@@ -37,7 +39,7 @@ public class MaintenanceCommand extends BaseCommand implements TabCompleter {
return true;
}
switch (args[0].toLowerCase()) {
switch (args[0].toLowerCase(Locale.ROOT)) {
case "on", "enable", "enabled" -> {
maintenanceManager.setEnabled(true);
sender.sendMessage(getLang().getPrefixedString("maintenance.messages.enabled"));
@@ -53,6 +55,42 @@ public class MaintenanceCommand extends BaseCommand implements TabCompleter {
sender.sendMessage(getLang().getPrefixedString("maintenance.messages.reloaded"));
return true;
}
case "add" -> {
if (args.length < 2) {
sender.sendMessage(getLang().getPrefixedString("maintenance.messages.add-usage"));
return true;
}
String target = args[1];
if (maintenanceManager.addWhitelistEntry(target)) {
sender.sendMessage(getLang().getPrefixedString("maintenance.messages.whitelist-added",
Map.of("player", target)));
} else {
sender.sendMessage(getLang().getPrefixedString("maintenance.messages.whitelist-exists",
Map.of("player", target)));
}
return true;
}
case "remove" -> {
if (args.length < 2) {
sender.sendMessage(getLang().getPrefixedString("maintenance.messages.remove-usage"));
return true;
}
String target = args[1];
if (maintenanceManager.removeWhitelistEntry(target)) {
sender.sendMessage(getLang().getPrefixedString("maintenance.messages.whitelist-removed",
Map.of("player", target)));
} else {
sender.sendMessage(getLang().getPrefixedString("maintenance.messages.whitelist-missing",
Map.of("player", target)));
}
return true;
}
case "list" -> {
sendWhitelist(sender, maintenanceManager);
return true;
}
default -> {
sender.sendMessage(getLang().getPrefixedString("maintenance.messages.usage"));
return true;
@@ -65,19 +103,58 @@ public class MaintenanceCommand extends BaseCommand implements TabCompleter {
? "maintenance.status.enabled"
: "maintenance.status.disabled");
sender.sendMessage(getLang().getPrefixedString("maintenance.messages.status",
java.util.Map.of("status", status)));
Map.of(
"status", status,
"whitelist_count", String.valueOf(maintenanceManager.getWhitelistCount())
)));
}
private void sendWhitelist(CommandSender sender, MaintenanceManager maintenanceManager) {
List<String> entries = maintenanceManager.getWhitelistEntries();
if (entries.isEmpty()) {
sender.sendMessage(getLang().getPrefixedString("maintenance.messages.whitelist-empty"));
return;
}
sender.sendMessage(getLang().getPrefixedString("maintenance.messages.whitelist-list",
Map.of(
"count", String.valueOf(entries.size()),
"entries", String.join(", ", entries)
)));
}
@Override
public List<String> onTabComplete(CommandSender sender, Command command, String label, String[] args) {
if (args.length != 1 || !sender.hasPermission(getPermission())) {
if (!sender.hasPermission(getPermission())) {
return List.of();
}
String partial = args[0].toLowerCase();
if (args.length == 1) {
return complete(args[0], List.of("on", "off", "status", "reload", "add", "remove", "list"));
}
if (args.length == 2 && args[0].equalsIgnoreCase("add")) {
return complete(args[1], plugin.getServer().getOnlinePlayers().stream()
.map(Player::getName)
.toList());
}
if (args.length == 2 && args[0].equalsIgnoreCase("remove")) {
MaintenanceManager maintenanceManager = plugin.getMaintenanceManager();
if (maintenanceManager == null) {
return List.of();
}
return complete(args[1], maintenanceManager.getWhitelistEntries());
}
return List.of();
}
private List<String> complete(String input, List<String> options) {
String partial = input.toLowerCase(Locale.ROOT);
List<String> completions = new ArrayList<>();
for (String option : List.of("on", "off", "status", "reload")) {
if (option.startsWith(partial)) {
for (String option : options) {
if (option.toLowerCase(Locale.ROOT).startsWith(partial)) {
completions.add(option);
}
}
@@ -1,5 +1,6 @@
package cn.infstar.essentialsC.commands;
import cn.infstar.essentialsC.EssentialsC;
import org.bukkit.entity.Player;
import java.util.HashSet;
@@ -20,17 +21,38 @@ public class VanishCommand extends BaseCommand {
if (vanishedPlayers.contains(uuid)) {
vanishedPlayers.remove(uuid);
showPlayerToAll(player);
showPlayerToAll(plugin, player);
player.sendMessage(getLang().getPrefixedString("messages.vanish-disabled"));
} else {
vanishedPlayers.add(uuid);
hidePlayerFromAll(player);
hidePlayerFromAll(plugin, player);
player.sendMessage(getLang().getPrefixedString("messages.vanish-enabled"));
}
return true;
}
private void hidePlayerFromAll(Player player) {
public static void hideVanishedPlayersFrom(EssentialsC plugin, Player observer) {
for (Player vanished : plugin.getServer().getOnlinePlayers()) {
if (!observer.equals(vanished) && isVanished(vanished)) {
observer.hidePlayer(plugin, vanished);
}
}
}
public static void removeVanished(Player player) {
vanishedPlayers.remove(player.getUniqueId());
}
public static void clearAll(EssentialsC plugin) {
for (Player player : plugin.getServer().getOnlinePlayers()) {
if (isVanished(player)) {
showPlayerToAll(plugin, player);
}
}
vanishedPlayers.clear();
}
private static void hidePlayerFromAll(EssentialsC plugin, Player player) {
for (Player online : player.getServer().getOnlinePlayers()) {
if (online != player) {
online.hidePlayer(plugin, player);
@@ -38,7 +60,7 @@ public class VanishCommand extends BaseCommand {
}
}
private void showPlayerToAll(Player player) {
private static void showPlayerToAll(EssentialsC plugin, Player player) {
for (Player online : player.getServer().getOnlinePlayers()) {
if (online != player) {
online.showPlayer(plugin, player);
@@ -13,7 +13,7 @@ public class WorkbenchCommand extends BaseCommand {
@Override
protected boolean execute(Player player, String[] args) {
player.openWorkbench(null, true);
playBlockShortcutSound(player, Material.CRAFTING_TABLE, Sound.BLOCK_CRAFTER_CRAFT);
playBlockShortcutSound(player, Material.CRAFTING_TABLE, Sound.UI_BUTTON_CLICK);
return true;
}
}