feat: 添加 SkinBridge 皮肤兼容并发布 1.7.0
This commit is contained in:
@@ -50,6 +50,7 @@ public final class CommandRegistry {
|
||||
register("mobdrops", "essentialsc.mobdrops.enderman", ModuleManager.MOB_DROPS, "cn.infstar.essentialsC.commands.MobDropCommand");
|
||||
register("maintenance", "essentialsc.command.maintenance", ModuleManager.MAINTENANCE, "cn.infstar.essentialsC.commands.MaintenanceCommand", "maint");
|
||||
registerSubCommand("admin", "essentialsc.command.admin", ModuleManager.ADMIN_MODE, "cn.infstar.essentialsC.commands.AdminCommand");
|
||||
registerSubCommand("skin", "essentialsc.command.skin", ModuleManager.SKIN_BRIDGE, "cn.infstar.essentialsC.commands.SkinBridgeCommand");
|
||||
}
|
||||
|
||||
private CommandRegistry() {
|
||||
|
||||
@@ -202,6 +202,10 @@ public class HelpCommand extends BaseCommand implements TabCompleter {
|
||||
otherCommands.append(lang.getString("help.commands.tpignore")).append("\n");
|
||||
hasOtherCommands = true;
|
||||
}
|
||||
if (CommandRegistry.isAvailable("skin") && player.hasPermission("essentialsc.command.skin")) {
|
||||
otherCommands.append(lang.getString("help.commands.skin")).append("\n");
|
||||
hasOtherCommands = true;
|
||||
}
|
||||
if (CommandRegistry.isAvailable("admin") && player.hasPermission("essentialsc.command.admin")) {
|
||||
otherCommands.append(lang.getString("help.commands.admin")).append("\n");
|
||||
hasOtherCommands = true;
|
||||
@@ -293,6 +297,7 @@ public class HelpCommand extends BaseCommand implements TabCompleter {
|
||||
{"tpdecline", "essentialsc.command.tpdeny"},
|
||||
{"tpno", "essentialsc.command.tpdeny"},
|
||||
{"tpignore", "essentialsc.command.tpignore"},
|
||||
{"skin", "essentialsc.command.skin"},
|
||||
{"tpsbar", "essentialsc.command.tpsbar"},
|
||||
{"maintenance", "essentialsc.command.maintenance"},
|
||||
{"maint", "essentialsc.command.maintenance"},
|
||||
@@ -345,6 +350,13 @@ public class HelpCommand extends BaseCommand implements TabCompleter {
|
||||
return manager == null ? List.of() : manager.getIncomingRequesterNames(completionPlayer, args[1]);
|
||||
}
|
||||
|
||||
if (subCmd.equals("skin") && sender.hasPermission("essentialsc.command.skin")) {
|
||||
String partial = args[1].toLowerCase();
|
||||
return List.of("status", "refresh").stream()
|
||||
.filter(option -> option.startsWith(partial))
|
||||
.toList();
|
||||
}
|
||||
|
||||
if ((subCmd.equals("nightvision") || subCmd.equals("nv")) && sender.hasPermission("essentialsc.command.nightvision")) {
|
||||
return completeToggleArgs(args[1]);
|
||||
}
|
||||
@@ -370,6 +382,19 @@ public class HelpCommand extends BaseCommand implements TabCompleter {
|
||||
}
|
||||
}
|
||||
|
||||
if (args.length == 3 && args[0].equalsIgnoreCase("skin")
|
||||
&& (args[1].equalsIgnoreCase("status") || args[1].equalsIgnoreCase("refresh"))
|
||||
&& sender.hasPermission("essentialsc.command.skin")) {
|
||||
List<String> players = new ArrayList<>();
|
||||
String partial = args[2].toLowerCase();
|
||||
for (Player player : Bukkit.getOnlinePlayers()) {
|
||||
if (player.getName().toLowerCase().startsWith(partial)) {
|
||||
players.add(player.getName());
|
||||
}
|
||||
}
|
||||
return players;
|
||||
}
|
||||
|
||||
return new ArrayList<>();
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,127 @@
|
||||
package cn.infstar.essentialsC.commands;
|
||||
|
||||
import cn.infstar.essentialsC.skinbridge.SkinBridgeManager;
|
||||
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 java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
|
||||
public final class SkinBridgeCommand extends BaseCommand implements TabCompleter {
|
||||
|
||||
public SkinBridgeCommand() {
|
||||
super("essentialsc.command.skin");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean execute(Player player, String[] args) {
|
||||
return executeCommand(player, args, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean executeConsole(CommandSender sender, String[] args) {
|
||||
return executeCommand(sender, args, true);
|
||||
}
|
||||
|
||||
private boolean executeCommand(CommandSender sender, String[] args, boolean console) {
|
||||
if (args.length < 1 || args.length > 2) {
|
||||
sender.sendMessage(getLang().getPrefixedString("skin-bridge.messages.usage"));
|
||||
return true;
|
||||
}
|
||||
|
||||
SkinBridgeManager manager = plugin.getSkinBridgeManager();
|
||||
if (manager == null) {
|
||||
sender.sendMessage(getLang().getPrefixedString("messages.module-disabled"));
|
||||
return true;
|
||||
}
|
||||
|
||||
Player target = console ? null : (Player) sender;
|
||||
if (args.length == 2) {
|
||||
target = Bukkit.getPlayerExact(args[1]);
|
||||
if (target == null || !target.isOnline()) {
|
||||
sender.sendMessage(getLang().getPrefixedString("messages.player-not-found", Map.of("player", args[1])));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
if (target == null) {
|
||||
sender.sendMessage(getLang().getPrefixedString("skin-bridge.messages.usage"));
|
||||
return true;
|
||||
}
|
||||
|
||||
String action = args[0].toLowerCase(Locale.ROOT);
|
||||
if (action.equals("status")) {
|
||||
sendStatus(sender, target, manager);
|
||||
return true;
|
||||
}
|
||||
if (action.equals("refresh")) {
|
||||
sendRefreshResult(sender, target, manager.queueSync(target, true));
|
||||
return true;
|
||||
}
|
||||
|
||||
sender.sendMessage(getLang().getPrefixedString("skin-bridge.messages.usage"));
|
||||
return true;
|
||||
}
|
||||
|
||||
private void sendStatus(CommandSender sender, Player target, SkinBridgeManager manager) {
|
||||
if (!manager.isEnabled()) {
|
||||
sender.sendMessage(getLang().getPrefixedString("skin-bridge.messages.feature-disabled"));
|
||||
return;
|
||||
}
|
||||
if (!manager.isSkinGatewayAvailable()) {
|
||||
sender.sendMessage(getLang().getPrefixedString("skin-bridge.messages.dependency-missing"));
|
||||
return;
|
||||
}
|
||||
if (manager.getProviderCount() == 0) {
|
||||
sender.sendMessage(getLang().getPrefixedString("skin-bridge.messages.no-providers"));
|
||||
return;
|
||||
}
|
||||
|
||||
SkinBridgeManager.Status status = manager.getStatus(target);
|
||||
Map<String, String> placeholders = Map.of("player", target.getName(), "provider", String.valueOf(status.providerId()));
|
||||
switch (status.state()) {
|
||||
case EXTERNAL -> sender.sendMessage(getLang().getPrefixedString("skin-bridge.messages.status-external", placeholders));
|
||||
case NOT_EXTERNAL -> sender.sendMessage(getLang().getPrefixedString("skin-bridge.messages.status-not-external", placeholders));
|
||||
case PENDING -> sender.sendMessage(getLang().getPrefixedString("skin-bridge.messages.status-pending", placeholders));
|
||||
case UNKNOWN -> sender.sendMessage(getLang().getPrefixedString("skin-bridge.messages.status-unknown", placeholders));
|
||||
}
|
||||
}
|
||||
|
||||
private void sendRefreshResult(CommandSender sender, Player target, SkinBridgeManager.SyncResult result) {
|
||||
Map<String, String> placeholders = Map.of("player", target.getName());
|
||||
String messagePath = switch (result) {
|
||||
case QUEUED -> "skin-bridge.messages.refresh-queued";
|
||||
case CACHED -> "skin-bridge.messages.refresh-cached";
|
||||
case ALREADY_RUNNING -> "skin-bridge.messages.refresh-running";
|
||||
case FEATURE_DISABLED -> "skin-bridge.messages.feature-disabled";
|
||||
case DEPENDENCY_MISSING -> "skin-bridge.messages.dependency-missing";
|
||||
case NO_PROVIDERS -> "skin-bridge.messages.no-providers";
|
||||
};
|
||||
sender.sendMessage(getLang().getPrefixedString(messagePath, placeholders));
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> onTabComplete(CommandSender sender, Command command, String label, String[] args) {
|
||||
if (args.length == 1) {
|
||||
String partial = args[0].toLowerCase(Locale.ROOT);
|
||||
return List.of("status", "refresh").stream()
|
||||
.filter(option -> option.startsWith(partial))
|
||||
.toList();
|
||||
}
|
||||
if (args.length == 2 && (args[0].equalsIgnoreCase("status") || args[0].equalsIgnoreCase("refresh"))) {
|
||||
String partial = args[1].toLowerCase(Locale.ROOT);
|
||||
List<String> players = new ArrayList<>();
|
||||
for (Player onlinePlayer : Bukkit.getOnlinePlayers()) {
|
||||
if (onlinePlayer.getName().toLowerCase(Locale.ROOT).startsWith(partial)) {
|
||||
players.add(onlinePlayer.getName());
|
||||
}
|
||||
}
|
||||
return players;
|
||||
}
|
||||
return List.of();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user