diff --git a/.github/ISSUE_TEMPLATE/bugs_report.md b/.github/ISSUE_TEMPLATE/bugs_report.md index e163a00..6821b43 100644 --- a/.github/ISSUE_TEMPLATE/bugs_report.md +++ b/.github/ISSUE_TEMPLATE/bugs_report.md @@ -1,30 +1,30 @@ --- name: 问题提交 -about: 提交并描述问题,帮助我们对其进行检查与修复。 +about: 描述问题并提交,帮助我们对其进行检查与修复。 title: '' labels: bug assignees: '' --- -**问题简述** +### **问题简述** 用简短的话语描述一下大概问题。 -**问题来源** +### **问题来源** 描述一下通过哪些操作才发现的问题,如: 1. 打开 '...' 2. 点击了 '....' 3. 出现了报错 '....' -**预期结果**(可选) +### **预期结果**(可选) 如果问题不发生,应该是什么情况 -**问题截图/问题报错** +### **问题截图/问题报错** 如果有报错或输出,请提供截图。 -**操作环境** +### **操作环境** 请在后台输入 `version` 并复制相关输出。 -**其他补充** +### **其他补充** 如有其他补充,可以在这里描述。 diff --git a/.github/ISSUE_TEMPLATE/feature_issues.md b/.github/ISSUE_TEMPLATE/feature_issues.md index b7e7f40..9407bad 100644 --- a/.github/ISSUE_TEMPLATE/feature_issues.md +++ b/.github/ISSUE_TEMPLATE/feature_issues.md @@ -7,14 +7,14 @@ assignees: '' --- -**功能简述** +### **功能简述** 简单的描述一下你想要的功能 -**需求来源** +### **需求来源** 简单的描述一下为什么需要这个功能。 -**功能参考**(可选) +### **功能参考**(可选) 如果有相关功能的参考,如文本、截图,请提供给我们。 -**附加内容** +### **附加内容** 如果有什么小细节需要重点注意,请在这里告诉我们。 diff --git a/README-en.md b/README-en.md index a801d23..81210ae 100644 --- a/README-en.md +++ b/README-en.md @@ -37,16 +37,22 @@ For development dependencies, please see [Dependencies](https://github.com/Carm - **Theoretically** support ALL MineCraft Versions. - Reloading the configuration will automatically refresh the prefix of all players. -- Real-time judgment and feedback to the player when permissions are changed. [✈](https://github.com/CarmJos/UserPrefix/blob/master/src/main/java/cc/carm/plugin/userprefix/listener/processor/UserNodeUpdateProcessor.java) +- Real-time judgment and feedback to the player when permissions are + changed. [✈](https://github.com/CarmJos/UserPrefix/blob/master/src/main/java/cc/carm/plugin/userprefix/listener/processor/UserNodeUpdateProcessor.java) - Configurable sounds and messages. - The prefix icon can be configured as "Selected", "Has Permission" and “No Permission”. - Item configuration is natively configured through ItemStack, which supports all MC settings! - TabList is automatically sorted according to the weight of the prefix (if there is a conflict, it can be turned off) -- The prefix display on the player name (can be turned off if there is a conflict) [✈](https://github.com/CarmJos/UserPrefix/blob/master/src/main/java/cc/carm/plugin/userprefix/nametag/UserNameTag.java) -- Simple Chat Format Placeholder support. (Not Recommended) [✈](https://github.com/CarmJos/UserPrefix/blob/master/src/main/java/cc/carm/plugin/userprefix/listener/ChatListener.java) -- GUI with automatic sorting and page turning! [✈](https://github.com/CarmJos/UserPrefix/blob/master/src/main/java/cc/carm/plugin/userprefix/ui/PrefixSelectGUI.java) -- Support PlaceholderAPI variables! [✈](https://github.com/CarmJos/UserPrefix/blob/master/src/main/java/cc/carm/plugin/userprefix/hooker/UserPrefixExpansion.java) -- Support [Hex Color](https://www.hexcolortool.com/)! (Version 1.16 and above) `&(#Color)` [✈](https://github.com/CarmJos/UserPrefix/blob/master/src/main/java/cc/carm/plugin/userprefix/util/ColorParser.java) +- The prefix display on the player name (can be turned off if there is a + conflict) [✈](https://github.com/CarmJos/UserPrefix/blob/master/src/main/java/cc/carm/plugin/userprefix/nametag/UserNameTag.java) +- Simple Chat Format Placeholder support. (Not + Recommended) [✈](https://github.com/CarmJos/UserPrefix/blob/master/src/main/java/cc/carm/plugin/userprefix/listener/ChatListener.java) +- GUI with automatic sorting and page + turning! [✈](https://github.com/CarmJos/UserPrefix/blob/master/src/main/java/cc/carm/plugin/userprefix/ui/PrefixSelectGUI.java) +- Support PlaceholderAPI + variables! [✈](https://github.com/CarmJos/UserPrefix/blob/master/src/main/java/cc/carm/plugin/userprefix/hooker/UserPrefixExpansion.java) +- Support [Hex Color](https://www.hexcolortool.com/)! (Version 1.16 and + above) `&(#Color)` [✈](https://github.com/CarmJos/UserPrefix/blob/master/src/main/java/cc/carm/plugin/userprefix/util/ColorParser.java) - Example: LightSlateBlue `&(#8470FF)` 、 DarkSlateBlue `&(#483D8B)` ## Notice @@ -112,7 +118,6 @@ the [English Version here](https://github.com/CarmJos/UserPrefix/blob/master/src
Click to see plugin configuration - ```yaml version: ${project.version} # DO NOT EDIT IT @@ -124,7 +129,7 @@ custom-storage: # Support absolute file path , such as "/etc/minecraft/configurations/prefixes/" enable: false path: "prefixes/" # Must be a folder! - + GUI: title: "&f&lMy Prefixes List" # Title of the GUI items: @@ -212,6 +217,8 @@ selected: expired: - "&7Your prefix &f%(oldName) &7has expired," - "&7Now the prefix is changed to &f%(newName) &7." +removed: + - "&7Your using prefix has been removed, now the prefix is changed to &f%(newName) &7." reload: - "&a&lReload completed!&7costs &f%(time)ms&7." help: diff --git a/README.md b/README.md index 1671e8c..2c07162 100644 --- a/README.md +++ b/README.md @@ -199,6 +199,8 @@ selected: expired: - "&7您先前使用的前缀 &f%(oldName) &7已到期。" - "&7现在已为您重新调整为 &f%(newName) &7。" +removed: + - "&7您先前使用的前缀已被移除,现在已为您重新调整为 &f%(newName) &7。" reload: - "&a&l重载完成!&7共耗时 &f%(time)ms&7。" help: diff --git a/pom.xml b/pom.xml index 41feef9..065026f 100644 --- a/pom.xml +++ b/pom.xml @@ -4,9 +4,16 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 + + 8 + 8 + UTF-8 + UTF-8 + + cc.carm.plugin userprefix - 2.2.1 + 2.3.0 UserPrefix 轻便、高效、实时的用户前缀系统。 @@ -46,13 +53,6 @@ - - 8 - 8 - UTF-8 - UTF-8 - - diff --git a/src/main/java/cc/carm/plugin/userprefix/Main.java b/src/main/java/cc/carm/plugin/userprefix/Main.java index 877a41b..42ff7ab 100644 --- a/src/main/java/cc/carm/plugin/userprefix/Main.java +++ b/src/main/java/cc/carm/plugin/userprefix/Main.java @@ -2,7 +2,7 @@ package cc.carm.plugin.userprefix; import cc.carm.plugin.userprefix.command.UserPrefixAdminCommand; import cc.carm.plugin.userprefix.command.UserPrefixCommand; -import cc.carm.plugin.userprefix.configuration.PrefixConfig; +import cc.carm.plugin.userprefix.configuration.PluginConfig; import cc.carm.plugin.userprefix.hooker.UserPrefixExpansion; import cc.carm.plugin.userprefix.listener.ChatListener; import cc.carm.plugin.userprefix.listener.UserListener; @@ -30,7 +30,6 @@ import org.jetbrains.annotations.Nullable; public class Main extends JavaPlugin { private static Main instance; - private static Metrics metrics; @Override public void onEnable() { @@ -60,11 +59,11 @@ public class Main extends JavaPlugin { log("若您想使用变量进行前缀的显示,请安装PlaceholderAPI!"); } - if (PrefixConfig.METRICS.get()) { + if (PluginConfig.METRICS.get()) { log("启用统计数据..."); - metrics = new Metrics(this, 13776); + Metrics metrics = new Metrics(this, 13776); metrics.addCustomChart(new SingleLineChart("active_prefixes", () -> PrefixManager.getPrefixes().size())); - metrics.addCustomChart(new SimplePie("custom_storage", () -> PrefixConfig.CustomStorage.ENABLE.get() ? "ENABLE" : "DISABLE")); + metrics.addCustomChart(new SimplePie("custom_storage", () -> PluginConfig.CustomStorage.ENABLE.get() ? "ENABLE" : "DISABLE")); metrics.addCustomChart(new SimplePie("lp_version", () -> ServiceManager.getService().getPluginMetadata().getVersion())); metrics.addCustomChart(new SimplePie("papi_version", () -> { Plugin plugin = Bukkit.getPluginManager().getPlugin("PlaceholderAPI"); @@ -113,7 +112,7 @@ public class Main extends JavaPlugin { } public static void debug(String message) { - if (PrefixConfig.DEBUG.get()) { + if (PluginConfig.DEBUG.get()) { log("[DEBUG] " + message); } } diff --git a/src/main/java/cc/carm/plugin/userprefix/command/UserPrefixAdminCommand.java b/src/main/java/cc/carm/plugin/userprefix/command/UserPrefixAdminCommand.java index 3e87a63..4605acd 100644 --- a/src/main/java/cc/carm/plugin/userprefix/command/UserPrefixAdminCommand.java +++ b/src/main/java/cc/carm/plugin/userprefix/command/UserPrefixAdminCommand.java @@ -1,6 +1,6 @@ package cc.carm.plugin.userprefix.command; -import cc.carm.plugin.userprefix.configuration.PrefixConfig; +import cc.carm.plugin.userprefix.configuration.PluginConfig; import cc.carm.plugin.userprefix.manager.ConfigManager; import cc.carm.plugin.userprefix.manager.PrefixManager; import cc.carm.plugin.userprefix.manager.UserManager; @@ -22,10 +22,10 @@ public class UserPrefixAdminCommand implements CommandExecutor { if (args.length == 1) { String aim = args[0]; if (aim.equalsIgnoreCase("list")) { - MessageUtil.sendWithPlaceholders(sender, PrefixConfig.Messages.LIST_TITLE.get()); + MessageUtil.sendWithPlaceholders(sender, PluginConfig.Messages.LIST_TITLE.get()); for (ConfiguredPrefix value : PrefixManager.getPrefixes().values()) { MessageUtil.sendWithPlaceholders( - sender, PrefixConfig.Messages.LIST_VALUE.get(), + sender, PluginConfig.Messages.LIST_VALUE.get(), new String[]{ "%(weight)", "%(identifier)", "%(name)", "%(permission)", @@ -54,7 +54,7 @@ public class UserPrefixAdminCommand implements CommandExecutor { UserManager.updatePrefixView(onlinePlayer, false); } MessageUtil.sendWithPlaceholders( - sender, PrefixConfig.Messages.RELOAD.get(), + sender, PluginConfig.Messages.RELOAD.get(), new String[]{"%(time)"}, new Object[]{(System.currentTimeMillis() - s1)} ); return true; @@ -65,7 +65,7 @@ public class UserPrefixAdminCommand implements CommandExecutor { } public static boolean help(CommandSender sender) { - MessageUtil.send(sender, PrefixConfig.Messages.HELP.get()); + MessageUtil.send(sender, PluginConfig.Messages.HELP.get()); return true; } diff --git a/src/main/java/cc/carm/plugin/userprefix/configuration/PrefixConfig.java b/src/main/java/cc/carm/plugin/userprefix/configuration/PluginConfig.java similarity index 96% rename from src/main/java/cc/carm/plugin/userprefix/configuration/PrefixConfig.java rename to src/main/java/cc/carm/plugin/userprefix/configuration/PluginConfig.java index 34116c8..cdef3e9 100644 --- a/src/main/java/cc/carm/plugin/userprefix/configuration/PrefixConfig.java +++ b/src/main/java/cc/carm/plugin/userprefix/configuration/PluginConfig.java @@ -7,7 +7,7 @@ import cc.carm.plugin.userprefix.util.ItemStackFactory; import org.bukkit.Material; import org.bukkit.inventory.ItemStack; -public class PrefixConfig { +public class PluginConfig { public static ConfigValue DEBUG = new ConfigValue<>("debug", Boolean.class, false); @@ -62,12 +62,14 @@ public class PrefixConfig { public static ConfigMessageList SELECTED = new ConfigMessageList("selected"); public static ConfigMessageList EXPIRED = new ConfigMessageList("expired"); + public static ConfigMessageList REMOVED = new ConfigMessageList("removed"); public static ConfigMessageList RELOAD = new ConfigMessageList("reload"); public static ConfigMessageList HELP = new ConfigMessageList("help"); public static ConfigMessageList LIST_TITLE = new ConfigMessageList("list-title"); public static ConfigMessageList LIST_VALUE = new ConfigMessageList("list-value"); + } public static class Sounds { diff --git a/src/main/java/cc/carm/plugin/userprefix/event/UserPrefixChangeEvent.java b/src/main/java/cc/carm/plugin/userprefix/event/UserPrefixChangeEvent.java new file mode 100644 index 0000000..9ea91e0 --- /dev/null +++ b/src/main/java/cc/carm/plugin/userprefix/event/UserPrefixChangeEvent.java @@ -0,0 +1,55 @@ +package cc.carm.plugin.userprefix.event; + +import cc.carm.plugin.userprefix.model.ConfiguredPrefix; +import org.bukkit.entity.Player; +import org.bukkit.event.Cancellable; +import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class UserPrefixChangeEvent extends UserPrefixEvent implements Cancellable { + + public static HandlerList handler = new HandlerList(); + + private boolean cancelled; + + private final @Nullable ConfiguredPrefix before; + private @NotNull ConfiguredPrefix after; + + public UserPrefixChangeEvent(@NotNull Player who, + @Nullable ConfiguredPrefix before, + @NotNull ConfiguredPrefix after) { + super(who); + this.before = before; + this.after = after; + } + + public @Nullable ConfiguredPrefix getBefore() { + return before; + } + + public @NotNull ConfiguredPrefix getAfter() { + return after; + } + + public void setAfter(@NotNull ConfiguredPrefix after) { + this.after = after; + } + + @Override + public boolean isCancelled() { + if (before == null) return false; //Could not be cancelled when prefix is null. + else return this.cancelled; + } + + @Override + public void setCancelled(boolean cancel) { + this.cancelled = cancel; + } + + @NotNull + @Override + public HandlerList getHandlers() { + return handler; + } +} diff --git a/src/main/java/cc/carm/plugin/userprefix/event/UserPrefixEvent.java b/src/main/java/cc/carm/plugin/userprefix/event/UserPrefixEvent.java new file mode 100644 index 0000000..71a498e --- /dev/null +++ b/src/main/java/cc/carm/plugin/userprefix/event/UserPrefixEvent.java @@ -0,0 +1,13 @@ +package cc.carm.plugin.userprefix.event; + +import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerEvent; +import org.jetbrains.annotations.NotNull; + +public abstract class UserPrefixEvent extends PlayerEvent { + + public UserPrefixEvent(@NotNull Player who) { + super(who); + } + +} diff --git a/src/main/java/cc/carm/plugin/userprefix/event/UserPrefixExpireEvent.java b/src/main/java/cc/carm/plugin/userprefix/event/UserPrefixExpireEvent.java new file mode 100644 index 0000000..5babe0e --- /dev/null +++ b/src/main/java/cc/carm/plugin/userprefix/event/UserPrefixExpireEvent.java @@ -0,0 +1,30 @@ +package cc.carm.plugin.userprefix.event; + +import cc.carm.plugin.userprefix.model.ConfiguredPrefix; +import org.bukkit.entity.Player; +import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; + +public class UserPrefixExpireEvent extends UserPrefixEvent { + + public static HandlerList handler = new HandlerList(); + + + public final @NotNull ConfiguredPrefix expiredPrefix; + + public UserPrefixExpireEvent(@NotNull Player who, + @NotNull ConfiguredPrefix expiredPrefix) { + super(who); + this.expiredPrefix = expiredPrefix; + } + + public @NotNull ConfiguredPrefix getExpiredPrefix() { + return expiredPrefix; + } + + @NotNull + @Override + public HandlerList getHandlers() { + return handler; + } +} diff --git a/src/main/java/cc/carm/plugin/userprefix/listener/ChatListener.java b/src/main/java/cc/carm/plugin/userprefix/listener/ChatListener.java index 571594d..5b3ab29 100644 --- a/src/main/java/cc/carm/plugin/userprefix/listener/ChatListener.java +++ b/src/main/java/cc/carm/plugin/userprefix/listener/ChatListener.java @@ -1,7 +1,7 @@ package cc.carm.plugin.userprefix.listener; import cc.carm.plugin.userprefix.Main; -import cc.carm.plugin.userprefix.configuration.PrefixConfig; +import cc.carm.plugin.userprefix.configuration.PluginConfig; import cc.carm.plugin.userprefix.util.MessageUtil; import me.clip.placeholderapi.PlaceholderAPI; import org.bukkit.event.EventHandler; @@ -12,8 +12,8 @@ public class ChatListener implements Listener { @EventHandler public void onChat(AsyncPlayerChatEvent event) { - if (!PrefixConfig.Functions.Chat.ENABLE.get()) return; - String format = PrefixConfig.Functions.Chat.FORMAT.get(); + if (!PluginConfig.Functions.Chat.ENABLE.get()) return; + String format = PluginConfig.Functions.Chat.FORMAT.get(); if (format == null || format.length() < 1) return; if (!MessageUtil.hasPlaceholderAPI()) 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 6caf8e0..749dad3 100644 --- a/src/main/java/cc/carm/plugin/userprefix/manager/PrefixManager.java +++ b/src/main/java/cc/carm/plugin/userprefix/manager/PrefixManager.java @@ -1,7 +1,7 @@ package cc.carm.plugin.userprefix.manager; import cc.carm.plugin.userprefix.Main; -import cc.carm.plugin.userprefix.configuration.PrefixConfig; +import cc.carm.plugin.userprefix.configuration.PluginConfig; import cc.carm.plugin.userprefix.model.ConfiguredPrefix; import cc.carm.plugin.userprefix.util.ItemStackFactory; import org.bukkit.Material; @@ -36,6 +36,7 @@ public class PrefixManager { loadConfiguredPrefixes(); } + @SuppressWarnings("ResultOfMethodCallIgnored") public static void loadConfiguredPrefixes() { File prefixDataFolder = getStorageFolder(); @@ -159,8 +160,8 @@ public class PrefixManager { } private static File getStorageFolder() { - if (PrefixConfig.CustomStorage.ENABLE.get()) { - return new File(PrefixConfig.CustomStorage.PATH.get()); + if (PluginConfig.CustomStorage.ENABLE.get()) { + return new File(PluginConfig.CustomStorage.PATH.get()); } else { return new File(Main.getInstance().getDataFolder() + File.separator + FOLDER_NAME); } diff --git a/src/main/java/cc/carm/plugin/userprefix/manager/UserManager.java b/src/main/java/cc/carm/plugin/userprefix/manager/UserManager.java index a0fe025..1cabbd4 100644 --- a/src/main/java/cc/carm/plugin/userprefix/manager/UserManager.java +++ b/src/main/java/cc/carm/plugin/userprefix/manager/UserManager.java @@ -1,11 +1,12 @@ package cc.carm.plugin.userprefix.manager; import cc.carm.plugin.userprefix.Main; -import cc.carm.plugin.userprefix.configuration.PrefixConfig; +import cc.carm.plugin.userprefix.configuration.PluginConfig; +import cc.carm.plugin.userprefix.event.UserPrefixChangeEvent; +import cc.carm.plugin.userprefix.event.UserPrefixExpireEvent; import cc.carm.plugin.userprefix.model.ConfiguredPrefix; import cc.carm.plugin.userprefix.nametag.UserNameTag; import cc.carm.plugin.userprefix.ui.PrefixSelectGUI; -import cc.carm.plugin.userprefix.util.MessageUtil; import cc.carm.plugin.userprefix.util.gui.GUI; import net.luckperms.api.model.user.User; import net.luckperms.api.node.NodeType; @@ -20,247 +21,270 @@ import java.util.stream.Collectors; public class UserManager { - public static HashMap nameTags = new HashMap<>(); + public static HashMap nameTags = new HashMap<>(); - public static HashSet checkingPlayers = new HashSet<>(); + public static HashSet checkingPlayers = new HashSet<>(); - @Nullable - public static UserNameTag getNameTag(Player player) { - if (PrefixConfig.Functions.NAME_PREFIX.get()) { - if (nameTags.containsKey(player.getUniqueId())) { - return nameTags.get(player.getUniqueId()); - } else { - return createNameTag(player); - } - } else { - return null; - } - } + @Nullable + public static UserNameTag getNameTag(Player player) { + if (PluginConfig.Functions.NAME_PREFIX.get()) { + if (nameTags.containsKey(player.getUniqueId())) { + return nameTags.get(player.getUniqueId()); + } else { + return createNameTag(player); + } + } else { + return null; + } + } - @NotNull - public static UserNameTag createNameTag(Player player) { - if (nameTags.containsKey(player.getUniqueId())) return nameTags.get(player.getUniqueId()); - UserNameTag nameTag = new UserNameTag(player); - nameTags.put(player.getUniqueId(), nameTag); - return nameTag; - } + @NotNull + public static UserNameTag createNameTag(Player player) { + if (nameTags.containsKey(player.getUniqueId())) return nameTags.get(player.getUniqueId()); + UserNameTag nameTag = new UserNameTag(player); + nameTags.put(player.getUniqueId(), nameTag); + return nameTag; + } - public static void initPlayer(Player player) { - UserManager.checkPrefix(player, false); - if (PrefixConfig.Functions.NAME_PREFIX.get()) { - UserManager.createNameTag(player); - UserManager.updatePrefixView(player, true); - } - } + public static void initPlayer(Player player) { + UserManager.checkPrefix(player, false); + if (PluginConfig.Functions.NAME_PREFIX.get()) { + UserManager.createNameTag(player); + UserManager.updatePrefixView(player, true); + } + } - public static void unloadPlayer(Player player) { - PrefixSelectGUI.removeOpening(player); - UserManager.unloadNameTag(player.getUniqueId()); - UserManager.checkingPlayers.remove(player.getUniqueId()); - GUI.removeOpenedGUI(player); // 清空打开过的GUI缓存 (用于记录物品点击的 - } + public static void unloadPlayer(Player player) { + PrefixSelectGUI.removeOpening(player); + UserManager.unloadNameTag(player.getUniqueId()); + UserManager.checkingPlayers.remove(player.getUniqueId()); + GUI.removeOpenedGUI(player); // 清空打开过的GUI缓存 (用于记录物品点击的 + } - /** - * 更新前缀显示效果 - * - * @param player 玩家 - * @param loadOthers 是否为玩家更新其他人的前缀(一般用于加入游戏) - */ - public static void updatePrefixView(Player player, boolean loadOthers) { - if (!PrefixConfig.Functions.NAME_PREFIX.get()) return; //未启用的情况下,不需要进行任何操作。 - ConfiguredPrefix playerPrefix = UserManager.getPrefix(player); + /** + * 更新前缀显示效果 + * + * @param player 玩家 + * @param loadOthers 是否为玩家更新其他人的前缀(一般用于加入游戏) + */ + public static void updatePrefixView(Player player, boolean loadOthers) { + if (!PluginConfig.Functions.NAME_PREFIX.get()) return; //未启用的情况下,不需要进行任何操作。 + UserNameTag tag = getNameTag(player); + if (tag == null) return; //未启用的情况下,不需要进行任何操作。 - UserNameTag tag = getNameTag(player); + ConfiguredPrefix playerPrefix = UserManager.getPrefix(player); - tag.setPrefix(playerPrefix.getContent()); - tag.setOrder(playerPrefix.getWeight()); + tag.setPrefix(playerPrefix.getContent()); + tag.setOrder(playerPrefix.getWeight()); - Main.debug("为玩家 " + player.getName() + " 设置了 " + player.getName() + "的前缀为 #" + playerPrefix.getWeight() + " " + playerPrefix.getName()); + Main.debug("为玩家 " + player.getName() + " 设置了 " + player.getName() + "的前缀为 #" + playerPrefix.getWeight() + " " + playerPrefix.getName()); - for (Player onlinePlayer : Bukkit.getOnlinePlayers()) { - if (onlinePlayer.equals(player)) continue; - UserNameTag onlinePlayerTag = getNameTag(onlinePlayer); - if (onlinePlayerTag != null) { - onlinePlayerTag.setPrefix(player, playerPrefix.getContent()); - onlinePlayerTag.setOrder(player, playerPrefix.getWeight()); - Main.debug("为玩家 " + onlinePlayer.getName() + " 设置了 " + player.getName() + "的前缀为 #" + playerPrefix.getWeight() + " " + playerPrefix.getName()); + for (Player onlinePlayer : Bukkit.getOnlinePlayers()) { + if (onlinePlayer.equals(player)) continue; + UserNameTag onlinePlayerTag = getNameTag(onlinePlayer); + if (onlinePlayerTag != null) { + onlinePlayerTag.setPrefix(player, playerPrefix.getContent()); + onlinePlayerTag.setOrder(player, playerPrefix.getWeight()); + Main.debug("为玩家 " + onlinePlayer.getName() + " 设置了 " + player.getName() + "的前缀为 #" + playerPrefix.getWeight() + " " + playerPrefix.getName()); - } + } - if (loadOthers) { - ConfiguredPrefix onlinePlayerPrefix = UserManager.getPrefix(onlinePlayer); - tag.setPrefix(onlinePlayer, onlinePlayerPrefix.getContent()); - tag.setOrder(onlinePlayer, onlinePlayerPrefix.getWeight()); - Main.debug("为玩家 " + player.getName() + " 设置了 " + onlinePlayer.getName() + "的前缀为 #" + onlinePlayerPrefix.getWeight() + " " + onlinePlayerPrefix.getName()); - } - } - } + if (loadOthers) { + ConfiguredPrefix onlinePlayerPrefix = UserManager.getPrefix(onlinePlayer); + tag.setPrefix(onlinePlayer, onlinePlayerPrefix.getContent()); + tag.setOrder(onlinePlayer, onlinePlayerPrefix.getWeight()); + Main.debug("为玩家 " + player.getName() + " 设置了 " + onlinePlayer.getName() + "的前缀为 #" + onlinePlayerPrefix.getWeight() + " " + onlinePlayerPrefix.getName()); + } + } + } - /** - * 检查玩家的前缀的使用权 - * - * @param player 玩家 - * @param updateView 是否更新头顶与TabList中的前缀 - */ - public static void checkPrefix(Player player, boolean updateView) { - if (checkingPlayers.contains(player.getUniqueId())) { - /* - * 这里为了避免极短时间内的重复触发导致多次判断且结果相同误导玩家, - * 故没有采用同步锁,而是采用添加到一个临时Set中,对Set中玩家跳过判断。 - */ - return; - } - checkingPlayers.add(player.getUniqueId()); - String currentPrefixIdentifier = UserManager.getPrefixData(player); - ConfiguredPrefix currentPrefix = PrefixManager.getPrefix(currentPrefixIdentifier); - if (!UserManager.isPrefixUsable(player, currentPrefixIdentifier)) { - ConfiguredPrefix newPrefix = UserManager.getHighestPrefix(player); - // 更新前缀 - UserManager.setPrefix(player, newPrefix, updateView); - // 发送消息 - MessageUtil.sendWithPlaceholders(player, PrefixConfig.Messages.EXPIRED.get(), - new String[]{"%(newName)", "%(oldName)"}, - new Object[]{newPrefix.getName(), currentPrefix != null ? currentPrefix.getName() : currentPrefixIdentifier} - ); - // 播放声音 - PrefixConfig.Sounds.PREFIX_EXPIRED.play(player); - } - checkingPlayers.remove(player.getUniqueId()); - } + /** + * 检查玩家的前缀的使用权 + * + * @param player 玩家 + * @param updateView 是否更新头顶与TabList中的前缀 + */ + public static void checkPrefix(Player player, boolean updateView) { + if (checkingPlayers.contains(player.getUniqueId())) { + /* + * 这里为了避免极短时间内的重复触发导致多次判断且结果相同误导玩家, + * 故没有采用同步锁,而是采用添加到一个临时Set中,对Set中玩家跳过判断。 + */ + return; + } + checkingPlayers.add(player.getUniqueId()); + String currentPrefixData = UserManager.getPrefixData(player); - public static void unloadNameTag(UUID uuid) { - nameTags.remove(uuid); - } + if (!UserManager.isPrefixUsable(player, currentPrefixData)) { + ConfiguredPrefix currentPrefix = PrefixManager.getPrefix(currentPrefixData); + ConfiguredPrefix newPrefix = UserManager.getHighestPrefix(player); - /** - * 得到玩家的前缀。 - * 该方法会自动判断玩家当前的前缀是否可用,并返回最终可用的前缀。 - * - * @param player 玩家 - * @return 前缀配置 - */ - @NotNull - public static ConfiguredPrefix getPrefix(Player player) { - String identifier = getPrefixData(player); - if (identifier == null || !isPrefixUsable(player, identifier)) { - return getHighestPrefix(player); - } else { - ConfiguredPrefix prefix = PrefixManager.getPrefix(identifier); - return prefix == null ? PrefixManager.getDefaultPrefix() : prefix; - } - } + if (currentPrefix != null) { + //当前前缀不为空,则代表属于前缀过期的情况 + Bukkit.getPluginManager().callEvent(new UserPrefixExpireEvent(player, currentPrefix)); - /** - * 设定玩家前缀 - * - * @param player 玩家 - * @param prefix 前缀配置 - * @param updateView 是否更新头顶上、TabList的前缀 - */ - public static void setPrefix(Player player, ConfiguredPrefix prefix, boolean updateView) { - setPrefixData(player, prefix.getIdentifier()); - if (updateView) updatePrefixView(player, false); - } + // 发送消息 + PluginConfig.Messages.EXPIRED.sendWithPlaceholders(player, + new String[]{"%(newName)", "%(oldName)"}, + new Object[]{newPrefix.getName(), currentPrefix.getName()} + ); - /** - * 得到玩家所有可用的前缀 - * - * @param player 玩家 - * @return 可用前缀列表 - */ - @NotNull - public static List getUsablePrefixes(Player player) { - return PrefixManager.getPrefixes().values().stream() - .filter(configuredPrefix -> isPrefixUsable(player, configuredPrefix)) //过滤出玩家可用的前缀 - .sorted(Comparator.comparingInt(ConfiguredPrefix::getWeight)) // 以前缀排序 - .collect(Collectors.toList()); // 返回集合 - } + // 播放声音 + PluginConfig.Sounds.PREFIX_EXPIRED.play(player); + } else { + // 当前前缀为空,则代表是旧的前缀不存在了, + PluginConfig.Messages.REMOVED.sendWithPlaceholders(player, + new String[]{"%(newName)", "%(oldName)"}, + new Object[]{newPrefix.getName(), currentPrefixData} + ); + } + + UserPrefixChangeEvent event = new UserPrefixChangeEvent(player, currentPrefix, newPrefix); + Bukkit.getPluginManager().callEvent(event); + + if (!event.isCancelled()) { + // 更新前缀 + UserManager.setPrefix(player, event.getAfter(), updateView); + } + + } + + checkingPlayers.remove(player.getUniqueId()); + } + + public static void unloadNameTag(UUID uuid) { + nameTags.remove(uuid); + } + + /** + * 得到玩家的前缀。 + * 该方法会自动判断玩家当前的前缀是否可用,并返回最终可用的前缀。 + * + * @param player 玩家 + * @return 前缀配置 + */ + @NotNull + public static ConfiguredPrefix getPrefix(Player player) { + String identifier = getPrefixData(player); + if (identifier == null || !isPrefixUsable(player, identifier)) { + return getHighestPrefix(player); + } else { + ConfiguredPrefix prefix = PrefixManager.getPrefix(identifier); + return prefix == null ? PrefixManager.getDefaultPrefix() : prefix; + } + } + + /** + * 设定玩家前缀 + * + * @param player 玩家 + * @param prefix 前缀配置 + * @param updateView 是否更新头顶上、TabList的前缀 + */ + public static void setPrefix(Player player, ConfiguredPrefix prefix, boolean updateView) { + setPrefixData(player, prefix.getIdentifier()); + if (updateView) updatePrefixView(player, false); + } + + /** + * 得到玩家所有可用的前缀 + * + * @param player 玩家 + * @return 可用前缀列表 + */ + @NotNull + public static List getUsablePrefixes(Player player) { + return PrefixManager.getPrefixes().values().stream() + .filter(configuredPrefix -> isPrefixUsable(player, configuredPrefix)) //过滤出玩家可用的前缀 + .sorted(Comparator.comparingInt(ConfiguredPrefix::getWeight)) // 以前缀排序 + .collect(Collectors.toList()); // 返回集合 + } - /** - * 得到玩家可使用的最高权重的权限 - * 注意:若配置文件中关闭了 “autoUsePrefix” ,则会返回默认前缀。 - * - * @param player 玩家 - * @return 权限内容 - */ - @NotNull - public static ConfiguredPrefix getHighestPrefix(Player player) { - if (PrefixConfig.Functions.AUTO_USE.get()) { - // 关闭了自动选择,就直接给默认的前缀,让玩家自己去设置吧~ - return PrefixManager.getDefaultPrefix(); - } - return getUsablePrefixes(player).stream() - .max(Comparator.comparingInt(ConfiguredPrefix::getWeight)) // 取权重最大 - .orElseGet(PrefixManager::getDefaultPrefix); // 啥都没有? 返回默认前缀。 - } + /** + * 得到玩家可使用的最高权重的权限 + * 注意:若配置文件中关闭了 “autoUsePrefix” ,则会返回默认前缀。 + * + * @param player 玩家 + * @return 权限内容 + */ + @NotNull + public static ConfiguredPrefix getHighestPrefix(Player player) { + if (PluginConfig.Functions.AUTO_USE.get()) { + // 关闭了自动选择,就直接给默认的前缀,让玩家自己去设置吧~ + return PrefixManager.getDefaultPrefix(); + } + return getUsablePrefixes(player).stream() + .max(Comparator.comparingInt(ConfiguredPrefix::getWeight)) // 取权重最大 + .orElseGet(PrefixManager::getDefaultPrefix); // 啥都没有? 返回默认前缀。 + } - /** - * 判断一个前缀对某玩家是否可用 - * - * @param player 玩家 - * @param prefixIdentifier 前缀标识 - * @return 若前缀标识不存在,则返回false;若前缀为默认前缀,或该前缀无权限,或玩家有该前缀的权限,则返回true。 - */ - public static boolean isPrefixUsable(Player player, String prefixIdentifier) { - if (prefixIdentifier == null || prefixIdentifier.equalsIgnoreCase("default")) return true; - ConfiguredPrefix prefix = PrefixManager.getPrefix(prefixIdentifier); - if (prefix == null) return false; - return isPrefixUsable(player, prefix); - } + /** + * 判断一个前缀对某玩家是否可用 + * + * @param player 玩家 + * @param prefixIdentifier 前缀标识 + * @return 若前缀标识不存在,则返回false;若前缀为默认前缀,或该前缀无权限,或玩家有该前缀的权限,则返回true。 + */ + public static boolean isPrefixUsable(Player player, String prefixIdentifier) { + if (prefixIdentifier == null || prefixIdentifier.equalsIgnoreCase("default")) return true; + ConfiguredPrefix prefix = PrefixManager.getPrefix(prefixIdentifier); + if (prefix == null) return false; + return isPrefixUsable(player, prefix); + } - /** - * 判断一个前缀对某玩家是否可用 - * - * @param player 玩家 - * @param configuredPrefix 前缀配置 - * @return 若前缀标识不存在,则返回false;若前缀为默认前缀,或该前缀无权限,或玩家有该前缀的权限,则返回true。 - */ - public static boolean isPrefixUsable(Player player, ConfiguredPrefix configuredPrefix) { - return configuredPrefix.isPublic() - || ServiceManager.hasPermission(ServiceManager.getUser(player), configuredPrefix.getPermission()); - } + /** + * 判断一个前缀对某玩家是否可用 + * + * @param player 玩家 + * @param configuredPrefix 前缀配置 + * @return 若前缀标识不存在,则返回false;若前缀为默认前缀,或该前缀无权限,或玩家有该前缀的权限,则返回true。 + */ + public static boolean isPrefixUsable(Player player, ConfiguredPrefix configuredPrefix) { + return configuredPrefix.isPublic() + || ServiceManager.hasPermission(ServiceManager.getUser(player), configuredPrefix.getPermission()); + } - /** - * 得到用户当前正在使用的前缀Identifier。 - * 该方法通过LuckPerms的MetaData实现,因此可以通过指令去操作。 - * - * @param player 玩家 - * @return 正在使用的前缀Identifier(若不存在则返回null) - */ - @Nullable - public static String getPrefixData(Player player) { - return ServiceManager.getAPI().getMetaData(player) - .getMetaValue("userprefix", String::valueOf) - .orElse(null); - } + /** + * 得到用户当前正在使用的前缀Identifier。 + * 该方法通过LuckPerms的MetaData实现,因此可以通过指令去操作。 + * + * @param player 玩家 + * @return 正在使用的前缀Identifier(若不存在则返回null, 代表未设置前缀) + */ + @Nullable + public static String getPrefixData(Player player) { + return ServiceManager.getAPI().getMetaData(player) + .getMetaValue("userprefix", String::valueOf) + .orElse(null); + } - /** - * 设定用户所使用的的prefix。 - * 该方法通过LuckPerms的MetaData实现,因此可以通过指令去操作。 - * - * @param player 玩家 - * @param prefixIdentifier 前缀的标识 - */ - public static void setPrefixData(Player player, String prefixIdentifier) { - User user = ServiceManager.getUser(player); - clearPrefixData(player); // 清除掉旧的数据,LuckPerms不会去覆盖一个Meta,需要手动清除。 - if (prefixIdentifier != null) { - user.data().add(MetaNode.builder("userprefix", prefixIdentifier).build()); - ServiceManager.getService().getUserManager().saveUser(user); // 保存数据 - } - } + /** + * 设定用户所使用的的prefix。 + * 该方法通过LuckPerms的MetaData实现,因此可以通过指令去操作。 + * + * @param player 玩家 + * @param prefixIdentifier 前缀的标识 + */ + public static void setPrefixData(Player player, String prefixIdentifier) { + User user = ServiceManager.getUser(player); + clearPrefixData(player); // 清除掉旧的数据,LuckPerms不会去覆盖一个Meta,需要手动清除。 + if (prefixIdentifier != null) { + user.data().add(MetaNode.builder("userprefix", prefixIdentifier).build()); + ServiceManager.getService().getUserManager().saveUser(user); // 保存数据 + } + } - /** - * 清除玩家所选择的前缀数据 - * - * @param player 玩家 - */ - public static void clearPrefixData(Player player) { - User user = ServiceManager.getUser(player); - // LuckPerms竟然会把所有的metaKey全部转换为小写... 那我这里就直接写成小写吧~ - user.data().clear(NodeType.META.predicate(mn -> mn.getMetaKey().equals("userprefix"))); - } + /** + * 清除玩家所选择的前缀数据 + * + * @param player 玩家 + */ + public static void clearPrefixData(Player player) { + User user = ServiceManager.getUser(player); + // LuckPerms竟然会把所有的metaKey全部转换为小写... 那我这里就直接写成小写吧~ + user.data().clear(NodeType.META.predicate(mn -> mn.getMetaKey().equals("userprefix"))); + } } 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 e7de41d..e7965cb 100644 --- a/src/main/java/cc/carm/plugin/userprefix/ui/PrefixSelectGUI.java +++ b/src/main/java/cc/carm/plugin/userprefix/ui/PrefixSelectGUI.java @@ -1,6 +1,6 @@ package cc.carm.plugin.userprefix.ui; -import cc.carm.plugin.userprefix.configuration.PrefixConfig; +import cc.carm.plugin.userprefix.configuration.PluginConfig; import cc.carm.plugin.userprefix.manager.PrefixManager; import cc.carm.plugin.userprefix.manager.UserManager; import cc.carm.plugin.userprefix.model.ConfiguredPrefix; @@ -17,80 +17,81 @@ import java.util.List; public class PrefixSelectGUI extends AutoPagedGUI { - public static HashSet openingUsers = new HashSet<>(); + public static HashSet openingUsers = new HashSet<>(); - Player player; + Player player; - public PrefixSelectGUI(Player player) { - super(GUIType.SIXBYNINE, PrefixConfig.GUI.TITLE.get(), 10, 43); - this.player = player; + public PrefixSelectGUI(Player player) { + super(GUIType.SIXBYNINE, PluginConfig.GUI.TITLE.get(), 10, 43); + this.player = player; - setPreviousPageSlot(18); - setNextPageSlot(26); + setPreviousPageSlot(18); + setNextPageSlot(26); - loadItems(); - } + loadItems(); + } - public Player getPlayer() { - return player; - } + public Player getPlayer() { + return player; + } - public void loadItems() { - List prefixList = new ArrayList<>(); - prefixList.add(PrefixManager.getDefaultPrefix()); - prefixList.addAll(PrefixManager.getVisiblePrefix()); //只需要读取看得见的 + public void loadItems() { + List prefixList = new ArrayList<>(); + prefixList.add(PrefixManager.getDefaultPrefix()); + prefixList.addAll(PrefixManager.getVisiblePrefix()); //只需要读取看得见的 - ConfiguredPrefix usingPrefix = UserManager.getPrefix(getPlayer()); + ConfiguredPrefix usingPrefix = UserManager.getPrefix(getPlayer()); - for (ConfiguredPrefix prefix : prefixList) { - if (prefix.getIdentifier().equals(usingPrefix.getIdentifier())) { - addItem(new GUIItem(prefix.getItemWhenUsing(player) != null ? prefix.getItemWhenUsing(player) : prefix.getItemHasPermission(player))); - } else if (UserManager.isPrefixUsable(player, prefix)) { - addItem(new GUIItem(prefix.getItemHasPermission(player)) { - @Override - public void onClick(ClickType type) { - //再次检查,防止打开GUI后、选择前的时间段内权限消失 - if (UserManager.isPrefixUsable(player, prefix)) { - player.closeInventory(); - UserManager.setPrefix(player, prefix, true); + for (ConfiguredPrefix prefix : prefixList) { + if (prefix.getIdentifier().equals(usingPrefix.getIdentifier())) { + addItem(new GUIItem(prefix.getItemWhenUsing(player) != null ? prefix.getItemWhenUsing(player) : prefix.getItemHasPermission(player))); + } else if (UserManager.isPrefixUsable(player, prefix)) { + addItem(new GUIItem(prefix.getItemHasPermission(player)) { + @Override + public void onClick(ClickType type) { + //再次检查,防止打开GUI后、选择前的时间段内权限消失 + if (UserManager.isPrefixUsable(player, prefix)) { + player.closeInventory(); + UserManager.setPrefix(player, prefix, true); - PrefixConfig.Sounds.PREFIX_CHANGE.play(player); - MessageUtil.sendWithPlaceholders(player, PrefixConfig.Messages.SELECTED.get(), - new String[]{"%(name)"}, - new Object[]{prefix.getName()}); + PluginConfig.Sounds.PREFIX_CHANGE.play(player); + MessageUtil.sendWithPlaceholders(player, PluginConfig.Messages.SELECTED.get(), + new String[]{"%(name)"}, + new Object[]{prefix.getName()}); - } - } - }); - } else { - addItem(new GUIItem(prefix.getItemNoPermission(player))); - } - } + } + } + }); + } else { + addItem(new GUIItem(prefix.getItemNoPermission(player))); + } + } - } + } - @Override - public void onClose() { - removeOpening(player); - } + @Override + public void onClose() { + removeOpening(player); + } - public static void removeOpening(Player player) { - openingUsers.remove(player); - } + public static void removeOpening(Player player) { + openingUsers.remove(player); + } - public static void closeAll() { - for (Player player : new HashSet<>(openingUsers)) { - player.closeInventory(); - } - openingUsers.clear(); - } + public static void closeAll() { + for (Player player : new HashSet<>(openingUsers)) { + player.closeInventory(); + } + openingUsers.clear(); + } - public static void open(Player player) { - PrefixConfig.Sounds.GUI_OPEN.play(player); - new PrefixSelectGUI(player).openGUI(player); - openingUsers.add(player); - } + public static void open(Player player) { + player.closeInventory(); // 防止冲突 + PluginConfig.Sounds.GUI_OPEN.play(player); + new PrefixSelectGUI(player).openGUI(player); + openingUsers.add(player); + } } diff --git a/src/main/java/cc/carm/plugin/userprefix/util/gui/AutoPagedGUI.java b/src/main/java/cc/carm/plugin/userprefix/util/gui/AutoPagedGUI.java index f38f148..f532daf 100644 --- a/src/main/java/cc/carm/plugin/userprefix/util/gui/AutoPagedGUI.java +++ b/src/main/java/cc/carm/plugin/userprefix/util/gui/AutoPagedGUI.java @@ -1,6 +1,6 @@ package cc.carm.plugin.userprefix.util.gui; -import cc.carm.plugin.userprefix.configuration.PrefixConfig; +import cc.carm.plugin.userprefix.configuration.PluginConfig; import org.bukkit.entity.Player; import org.bukkit.event.inventory.ClickType; import org.bukkit.inventory.ItemStack; @@ -51,7 +51,7 @@ public class AutoPagedGUI extends CommonPagedGUI { public void openGUI(Player user) { if (previousPageSlot >= 0) if (hasPreviousPage()) { - setItem(previousPageSlot, new GUIItem(previousPageUI == null ? PrefixConfig.GUI.Items.PREVIOUS_PAGE.get() : previousPageUI) { + setItem(previousPageSlot, new GUIItem(previousPageUI == null ? PluginConfig.GUI.Items.PREVIOUS_PAGE.get() : previousPageUI) { @Override public void onClick(ClickType type) { if (type == ClickType.RIGHT) { @@ -59,7 +59,7 @@ public class AutoPagedGUI extends CommonPagedGUI { } else { goPreviousPage(); } - PrefixConfig.Sounds.GUI_CLICK.play(user); + PluginConfig.Sounds.GUI_CLICK.play(user); openGUI(user); } }); @@ -67,7 +67,7 @@ public class AutoPagedGUI extends CommonPagedGUI { if (nextPageSlot >= 0) if (hasNextPage()) { - setItem(nextPageSlot, new GUIItem(nextPageUI == null ? PrefixConfig.GUI.Items.NEXT_PAGE.get() : nextPageUI) { + setItem(nextPageSlot, new GUIItem(nextPageUI == null ? PluginConfig.GUI.Items.NEXT_PAGE.get() : nextPageUI) { @Override public void onClick(ClickType type) { if (type == ClickType.RIGHT) { @@ -75,7 +75,7 @@ public class AutoPagedGUI extends CommonPagedGUI { } else { goNextPage(); } - PrefixConfig.Sounds.GUI_CLICK.play(user); + PluginConfig.Sounds.GUI_CLICK.play(user); openGUI(user); } }); diff --git a/src/main/resources/en_US/messages.yml b/src/main/resources/en_US/messages.yml index a07997d..9faba7f 100644 --- a/src/main/resources/en_US/messages.yml +++ b/src/main/resources/en_US/messages.yml @@ -3,6 +3,8 @@ selected: expired: - "&7Your prefix &f%(oldName) &7has expired," - "&7Now the prefix is changed to &f%(newName) &7." +removed: + - "&7Your using prefix has been removed, now the prefix is changed to &f%(newName) &7." reload: - "&a&lReload completed!&7costs &f%(time)ms&7." help: diff --git a/src/main/resources/messages.yml b/src/main/resources/messages.yml index 46068ff..f84dd38 100644 --- a/src/main/resources/messages.yml +++ b/src/main/resources/messages.yml @@ -3,6 +3,8 @@ selected: expired: - "&7您先前使用的前缀 &f%(oldName) &7已到期。" - "&7现在已为您重新调整为 &f%(newName) &7。" +removed: + - "&7您先前使用的前缀已被移除,现在已为您重新调整为 &f%(newName) &7。" reload: - "&a&l重载完成!&7共耗时 &f%(time)ms&7。" help: