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);
+ }
}