diff --git a/pom.xml b/pom.xml index d6205ac..4e3e1cb 100644 --- a/pom.xml +++ b/pom.xml @@ -19,7 +19,7 @@ cc.carm.plugin userprefix - 3.3.1 + 3.4.0 UserPrefix 轻便、高效、实时的用户前缀系统。 diff --git a/src/main/java/cc/carm/plugin/userprefix/command/UserCommand.java b/src/main/java/cc/carm/plugin/userprefix/command/UserCommand.java index 83fac6b..a33e080 100644 --- a/src/main/java/cc/carm/plugin/userprefix/command/UserCommand.java +++ b/src/main/java/cc/carm/plugin/userprefix/command/UserCommand.java @@ -15,14 +15,17 @@ public class UserCommand implements CommandExecutor { @Override public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String s, @NotNull String[] strings) { if (sender instanceof Player) { - PrefixSelectGUI.open((Player) sender); + Player player = (Player) sender; + String group = strings.length > 0 ? strings[0] : null; + PrefixSelectGUI.open(player, group); } else { - if (strings.length != 1) { + if (strings.length < 1) { PluginMessages.COMMAND_USAGE.CONSOLE.sendTo(sender); } else { Player player = Bukkit.getPlayer(strings[0]); if (player != null) { - PrefixSelectGUI.open(player); + String group = strings.length > 1 ? strings[1] : null; + PrefixSelectGUI.open(player, group); } } } diff --git a/src/main/java/cc/carm/plugin/userprefix/conf/prefix/PrefixConfig.java b/src/main/java/cc/carm/plugin/userprefix/conf/prefix/PrefixConfig.java index 0a159a7..ecc7196 100644 --- a/src/main/java/cc/carm/plugin/userprefix/conf/prefix/PrefixConfig.java +++ b/src/main/java/cc/carm/plugin/userprefix/conf/prefix/PrefixConfig.java @@ -35,6 +35,8 @@ public class PrefixConfig { protected final @Nullable String permission; + protected final @Nullable String group; + protected final @NotNull List actions; protected final @NotNull ItemStack itemHasPermission; @@ -76,6 +78,21 @@ public class PrefixConfig { @NotNull ItemStack itemHasPermission, @Nullable ItemStack itemWhenUsing, @Nullable ItemStack itemNoPermission) { + this( + identifier, name, description, + content, period, weight, permission, null, actions, + itemHasPermission, itemWhenUsing, itemNoPermission + ); + } + + public PrefixConfig(@NotNull String identifier, + @NotNull String name, @NotNull List description, + @NotNull List content, long period, + int weight, @Nullable String permission, @Nullable String group, + @NotNull List actions, + @NotNull ItemStack itemHasPermission, + @Nullable ItemStack itemWhenUsing, + @Nullable ItemStack itemNoPermission) { this.identifier = identifier; this.name = name; this.description = description; @@ -83,6 +100,7 @@ public class PrefixConfig { this.period = period; this.weight = weight; this.permission = permission; + this.group = group; this.actions = actions; this.itemHasPermission = itemHasPermission; this.itemNoPermission = itemNoPermission; @@ -104,6 +122,11 @@ public class PrefixConfig { return ColorParser.parse(description); } + @Nullable + public String getGroup() { + return group; + } + @NotNull public String getContent(CommandSender viewer) { if (content.isEmpty()) return "?"; diff --git a/src/main/java/cc/carm/plugin/userprefix/manager/PrefixManager.java b/src/main/java/cc/carm/plugin/userprefix/manager/PrefixManager.java index c63d81d..da463b8 100644 --- a/src/main/java/cc/carm/plugin/userprefix/manager/PrefixManager.java +++ b/src/main/java/cc/carm/plugin/userprefix/manager/PrefixManager.java @@ -38,41 +38,65 @@ public class PrefixManager { File prefixDataFolder = getStorageFolder(); if (!prefixDataFolder.isDirectory() || !prefixDataFolder.exists()) { - prefixDataFolder.mkdir(); + prefixDataFolder.mkdirs(); } - String[] filesList = prefixDataFolder.list(); - if (filesList == null || filesList.length < 1) { + List files = new ArrayList<>(); + collectYamlFiles(prefixDataFolder, files); + + if (files.isEmpty()) { Main.severe("配置文件夹中暂无任何前缀配置问,请检查。"); Main.severe("There's no configured prefix."); Main.severe("Path: " + prefixDataFolder.getAbsolutePath()); return; } - List files = Arrays.stream(filesList) - .map(s -> new File(prefixDataFolder, s)) - .filter(File::isFile) - .collect(Collectors.toList()); - HashMap loaded = new HashMap<>(); - if (files.size() > 0) { - for (File file : files) { - try { - PrefixConfig prefix = addPrefix(file); - Main.debugging("完成前缀加载 " + prefix.getIdentifier() + " : " + prefix.getName()); - loaded.put(prefix.getIdentifier(), prefix); - } catch (Exception ex) { - Main.severe("在加载前缀 " + file.getAbsolutePath() + " 时出错,请检查配置!"); - Main.severe("Error occurred when loading prefix #" + file.getAbsolutePath() + " !"); - ex.printStackTrace(); - } + for (File file : files) { + try { + PrefixConfig prefix = addPrefix(file); + Main.debugging("完成前缀加载 " + prefix.getIdentifier() + " : " + prefix.getName()); + loaded.put(prefix.getIdentifier(), prefix); + } catch (Exception ex) { + Main.severe("在加载前缀 " + file.getAbsolutePath() + " 时出错,请检查配置!"); + Main.severe("Error occurred when loading prefix #" + file.getAbsolutePath() + " !"); + ex.printStackTrace(); } } this.prefixes = loaded; } + /** + * 递归收集文件夹下的所有YAML文件 + * + * @param folder 目标文件夹 + * @param files 文件列表 + */ + private void collectYamlFiles(@NotNull File folder, @NotNull List files) { + File[] children = folder.listFiles(); + if (children == null) return; + for (File child : children) { + if (child.isDirectory()) { + collectYamlFiles(child, files); + } else if (child.isFile() && isYamlFile(child)) { + files.add(child); + } + } + } + + /** + * 判断文件是否为YAML文件 + * + * @param file 文件 + * @return 如果是.yml或.yaml文件返回true + */ + private boolean isYamlFile(@NotNull File file) { + String name = file.getName().toLowerCase(); + return name.endsWith(".yml") || name.endsWith(".yaml"); + } + public void loadDefaultPrefix() { this.defaultPrefix = new PrefixConfig( "default", @@ -96,6 +120,36 @@ public class PrefixManager { .collect(Collectors.toList()); } + /** + * 根据group获取可见的前缀列表 + * + * @param player 玩家 + * @param group 分组名称,为null时返回所有前缀 + * @return 过滤后的前缀列表 + */ + public List getVisiblePrefix(Player player, @Nullable String group) { + if (group == null || group.isEmpty()) { + return getVisiblePrefix(player); + } + return getPrefixes().values().stream() + .filter(c -> c.isVisible(player)) + .filter(c -> group.equalsIgnoreCase(c.getGroup())) + .sorted(Comparator.comparingInt(PrefixConfig::getWeight)) + .collect(Collectors.toList()); + } + + /** + * 获取所有已配置的group列表 + * + * @return group名称集合 + */ + public Set getGroups() { + return getPrefixes().values().stream() + .map(PrefixConfig::getGroup) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + } + @NotNull public PrefixConfig getDefaultPrefix() { return defaultPrefix; @@ -152,6 +206,7 @@ public class PrefixManager { conf.getLong("period", -1L), conf.getInt("weight", 1), conf.getString("permission"), + conf.getString("group"), readActions(conf.getStringList("actions")), readItem( conf.getConfigurationSection("item.has-perm"), diff --git a/src/main/java/cc/carm/plugin/userprefix/ui/PrefixSelectGUI.java b/src/main/java/cc/carm/plugin/userprefix/ui/PrefixSelectGUI.java index 7b922d2..5320090 100644 --- a/src/main/java/cc/carm/plugin/userprefix/ui/PrefixSelectGUI.java +++ b/src/main/java/cc/carm/plugin/userprefix/ui/PrefixSelectGUI.java @@ -10,6 +10,7 @@ import cc.carm.plugin.userprefix.conf.prefix.PrefixConfig; import cc.carm.plugin.userprefix.event.UserPrefixChangeEvent; import org.bukkit.entity.Player; import org.bukkit.event.inventory.ClickType; +import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.HashSet; @@ -20,11 +21,17 @@ public class PrefixSelectGUI extends AutoPagedGUI { public static HashSet openingUsers = new HashSet<>(); - protected final Player player; + protected final Player player; + protected final @Nullable String group; public PrefixSelectGUI(Player player) { + this(player, null); + } + + public PrefixSelectGUI(Player player, @Nullable String group) { super(GUIType.SIX_BY_NINE, PluginConfig.GUI.TITLE.get(), 10, 43); this.player = player; + this.group = group; setPreviousPageSlot(18); setNextPageSlot(26); @@ -37,6 +44,11 @@ public class PrefixSelectGUI extends AutoPagedGUI { return player; } + @Nullable + public String getGroup() { + return group; + } + public void loadExtraIcons() { PluginConfig.GUI.ITEMS.getNotNull().getItems().values().forEach(v -> v.setupItems(player, this)); } @@ -44,7 +56,7 @@ public class PrefixSelectGUI extends AutoPagedGUI { public void loadItems() { List prefixList = new ArrayList<>(); prefixList.add(UserPrefixAPI.getPrefixManager().getDefaultPrefix()); - prefixList.addAll(UserPrefixAPI.getPrefixManager().getVisiblePrefix(player)); //只需要读取看得见的 + prefixList.addAll(UserPrefixAPI.getPrefixManager().getVisiblePrefix(player, group)); PrefixConfig usingPrefix = UserPrefixAPI.getUserManager().getPrefix(getPlayer()); @@ -60,10 +72,7 @@ public class PrefixSelectGUI extends AutoPagedGUI { @Override public void onClick(Player clicker, ClickType type) { player.closeInventory(); - //再次检查,防止打开GUI后、选择前的时间段内权限消失 if (prefix.checkPermission(player)) { - - // 发送消息与提示 PluginConfig.SOUNDS.PREFIX_CHANGE.playTo(player); PluginMessages.SELECTED.sendTo(player, prefix.getName()); @@ -86,8 +95,6 @@ public class PrefixSelectGUI extends AutoPagedGUI { }); } } - - } @Override @@ -107,11 +114,12 @@ public class PrefixSelectGUI extends AutoPagedGUI { } public static void open(Player player) { -// player.closeInventory(); // 防止冲突 - PluginConfig.SOUNDS.GUI_OPEN.playTo(player); - new PrefixSelectGUI(player).openGUI(player); - openingUsers.add(player); + open(player, null); } - + public static void open(Player player, @Nullable String group) { + PluginConfig.SOUNDS.GUI_OPEN.playTo(player); + new PrefixSelectGUI(player, group).openGUI(player); + openingUsers.add(player); + } }