diff --git a/README.md b/README.md index 21ec95b..666cc6f 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ ![BANNER](https://raw.githubusercontent.com/CarmJos/UserPrefix/master/img/banner.png) + # 用户前缀系统插件 + [![CodeFactor](https://www.codefactor.io/repository/github/carmjos/userprefix/badge?s=b76fec1f64726b5f19989aace6adb5f85fdab840)](https://www.codefactor.io/repository/github/carmjos/userprefix) [![Java CI with Maven](https://github.com/CarmJos/UserPrefix/actions/workflows/maven.yml/badge.svg?branch=master)](https://github.com/CarmJos/UserPrefix/actions/workflows/maven.yml) ![](https://visitor-badge.glitch.me/badge?page_id=userprefix.readme) @@ -11,9 +13,11 @@ 本插件已在 [MCBBS](https://www.mcbbs.net/forum.php?mod=viewthread&tid=1261503) 上发布。 ## 示例 + ![example](https://raw.githubusercontent.com/CarmJos/UserPrefix/master/img/using-example.png) ## 依赖 + - **[必须]** 插件本体基于 [Spigot-API](https://hub.spigotmc.org/stash/projects/SPIGOT)、[BukkitAPI](http://bukkit.org/) 实现。 - **[必须]** 数据部分基于 [LuckPerms](https://www.spigotmc.org/resources/luckperms.28140/) 实现。 - **[推荐]** 变量部分基于 [PlaceholderAPI](https://www.spigotmc.org/resources/6245/) 实现。 @@ -31,8 +35,10 @@ - 具体的设定请参考其他文档哦~ - TabList自动按照前缀的权重排序 (如有冲突可关掉) - 玩家头顶前缀显示 (如有冲突可关掉) -- 自动排序,且可翻页的GUI -- 支持PlaceholderAPI变量 +- 自动排序,且可翻页的GUI! +- 支持PlaceholderAPI变量!(凡支持的都可以使用,如BungeeTabListPlus) +- 支持Hex颜色!(1.16以上版本) 格式 `&(#颜色代码)` + - 示例: LightSlateBlue `&(#8470FF)` 、 DarkSlateBlue `&(#483D8B)` ## 注意事项 @@ -49,6 +55,7 @@ 如有冲突导致其他插件的计分板无法显示,请关掉配置文件中`functions.OnNamePrefix`。 ### 3. 物品图标配置问题 + 物品相关均通过Bukkit提供的ItemStack序列化方法读取,相关配置方式请参考[ItemStack Serialization(物品序列化)](https://www.spigotmc.org/wiki/itemstack-serialization/)。 ## 指令 @@ -138,7 +145,7 @@ prefixes: content: "§b§lPro §b" # [必须] 显示在名字前面的内容 weight: 1 # [必须] 权重,用于GUI里面的排序(越大显示在越后面)和自动前缀显示 permission: "yc.pro" # [非必须] 检测的权限,如果没有就是人人都能用,也代表不用配置“itemNoPermission”了(因为压根不可能显示没权限时候的物品) - itemHasPermission: + itemHasPermission: # [必须] 当有权限的时候会显示这个Item ==: org.bukkit.inventory.ItemStack type: DIAMOND @@ -153,7 +160,7 @@ prefixes: - "§f您将获得多种特权与更好的游戏体验。" - "" - "§a➥ 点击切换到该前缀" - itemUsing: + itemUsing: # [非必需] 当有权限的时候会显示这个Item,如果没有这个配置就自动显示“itemHasPermission”的。 ==: org.bukkit.inventory.ItemStack type: DIAMOND @@ -170,7 +177,7 @@ prefixes: - "§f您将获得多种特权与更好的游戏体验。" - "" - "§a✔ 您正在使用该前缀" - itemNoPermission: + itemNoPermission: # [非必需] 如果没有权限就会显示这个item。如果不配置该物品,则玩家没有使用权限时不会显示在GUI里面。 ==: org.bukkit.inventory.ItemStack type: INK_SACK @@ -190,6 +197,7 @@ prefixes: ``` ## 支持与捐赠 + 本项目由 [YourCraft(你的世界)](https://www.ycraft.cn) 团队提供长期支持与维护。 ![TeamLogo](https://raw.githubusercontent.com/CarmJos/UserPrefix/master/img/team-logo.png) @@ -200,5 +208,6 @@ prefixes: ## 开源协议 + 本项目源码采用 [GNU General Public License v3.0](https://opensource.org/licenses/GPL-3.0) 开源协议。 diff --git a/pom.xml b/pom.xml index 2d85f9a..6b14482 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ cc.carm.plugin UserPrefix - 1.2.2 + 1.2.3 8 diff --git a/src/main/java/cc/carm/plugin/userprefix/Main.java b/src/main/java/cc/carm/plugin/userprefix/Main.java index a473bea..cc105bc 100644 --- a/src/main/java/cc/carm/plugin/userprefix/Main.java +++ b/src/main/java/cc/carm/plugin/userprefix/Main.java @@ -83,12 +83,12 @@ public class Main extends JavaPlugin { } public static void log(String message) { - Bukkit.getConsoleSender().sendMessage(ColorParser.parseColor("[" + getInstance().getName() + "] " + message)); + Bukkit.getConsoleSender().sendMessage(ColorParser.parse("[" + getInstance().getName() + "] " + message)); } public static void debug(String message) { if (PrefixConfig.DEBUG.get()) { - log("[DEBUG] " + ColorParser.parseColor(message)); + 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 7b3b6f3..8113179 100644 --- a/src/main/java/cc/carm/plugin/userprefix/command/UserPrefixAdminCommand.java +++ b/src/main/java/cc/carm/plugin/userprefix/command/UserPrefixAdminCommand.java @@ -5,7 +5,7 @@ import cc.carm.plugin.userprefix.manager.PrefixManager; import cc.carm.plugin.userprefix.manager.UserManager; import cc.carm.plugin.userprefix.model.ConfiguredPrefix; import cc.carm.plugin.userprefix.ui.PrefixSelectGUI; -import cc.carm.plugin.userprefix.util.ColorParser; +import cc.carm.plugin.userprefix.util.MessageUtil; import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; @@ -21,11 +21,11 @@ public class UserPrefixAdminCommand implements CommandExecutor { if (args.length == 1) { String aim = args[0]; if (aim.equalsIgnoreCase("list")) { - sender.sendMessage(ColorParser.parseColor("&3&l用户前缀系统 &f前缀列表")); + MessageUtil.send(sender, "&3&l用户前缀系统 &f前缀列表"); for (ConfiguredPrefix value : PrefixManager.getPrefixes().values()) { - sender.sendMessage(ColorParser.parseColor("&8#" + value.getWeight() + " &f" + value.getIdentifier())); - sender.sendMessage(ColorParser.parseColor("&8- &7显示名 &r" + value.getName() + " &7权限&r " + value.getPermission())); - sender.sendMessage(ColorParser.parseColor("&8- &7内容示例&r " + value.getContent() + sender.getName())); + MessageUtil.send(sender, "&8#" + value.getWeight() + " &f" + value.getIdentifier()); + MessageUtil.send(sender, "&8- &7显示名 &r" + value.getName() + " &7权限&r " + value.getPermission()); + MessageUtil.send(sender, "&8- &7内容示例&r " + value.getContent() + sender.getName()); } return true; } else if (aim.equalsIgnoreCase("reload")) { @@ -42,7 +42,7 @@ public class UserPrefixAdminCommand implements CommandExecutor { */ UserManager.updatePrefixView(onlinePlayer, false); } - sender.sendMessage(ColorParser.parseColor("&a&l重载完成!&7共耗时 &f" + (System.currentTimeMillis() - s1) + " ms&7。")); + MessageUtil.send(sender, "&a&l重载完成!&7共耗时 &f" + (System.currentTimeMillis() - s1) + " ms&7。"); return true; } return help(sender); @@ -51,11 +51,11 @@ public class UserPrefixAdminCommand implements CommandExecutor { } public static boolean help(CommandSender sender) { - sender.sendMessage(ColorParser.parseColor("&3&l用户前缀系统 &f帮助")); - sender.sendMessage(ColorParser.parseColor("&8#&f list")); - sender.sendMessage(ColorParser.parseColor("&8- &7查看当前前缀列表。")); - sender.sendMessage(ColorParser.parseColor("&8#&f reload")); - sender.sendMessage(ColorParser.parseColor("&8- &7重载前缀配置。")); + MessageUtil.send(sender, "&3&l用户前缀系统 &f帮助"); + MessageUtil.send(sender, "&8#&f list"); + MessageUtil.send(sender, "&8- &7查看当前前缀列表。"); + MessageUtil.send(sender, "&8#&f reload"); + MessageUtil.send(sender, "&8- &7重载前缀配置。"); return true; } diff --git a/src/main/java/cc/carm/plugin/userprefix/model/ConfiguredPrefix.java b/src/main/java/cc/carm/plugin/userprefix/model/ConfiguredPrefix.java index 586a06f..1f9e825 100644 --- a/src/main/java/cc/carm/plugin/userprefix/model/ConfiguredPrefix.java +++ b/src/main/java/cc/carm/plugin/userprefix/model/ConfiguredPrefix.java @@ -38,7 +38,7 @@ public class ConfiguredPrefix { } public String getContent() { - return ColorParser.parseColor(content); + return ColorParser.parse(content); } public int getWeight() { diff --git a/src/main/java/cc/carm/plugin/userprefix/util/ColorParser.java b/src/main/java/cc/carm/plugin/userprefix/util/ColorParser.java index b891d30..057fe28 100644 --- a/src/main/java/cc/carm/plugin/userprefix/util/ColorParser.java +++ b/src/main/java/cc/carm/plugin/userprefix/util/ColorParser.java @@ -1,10 +1,33 @@ package cc.carm.plugin.userprefix.util; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + public class ColorParser { + public static String parse(String text) { + text = parseHexColor(text); + return parseColor(text); + } + public static String parseColor(final String text) { return text.replaceAll("&", "§").replace("§§", "&"); } + public static String parseHexColor(String text) { + Pattern pattern = Pattern.compile("&\\((&?#[0-9a-fA-F]{6})\\)"); + Matcher matcher = pattern.matcher(text); + while (matcher.find()) { + String hexColor = text.substring(matcher.start() + 2, matcher.end() - 1); + hexColor = hexColor.replace("&", ""); + StringBuilder bukkitColorCode = new StringBuilder('§' + "x"); + for (int i = 1; i < hexColor.length(); i++) { + bukkitColorCode.append('§').append(hexColor.charAt(i)); + } + text = text.replaceAll("&\\(" + hexColor + "\\)", bukkitColorCode.toString().toLowerCase()); + matcher.reset(text); + } + return text; + } } diff --git a/src/main/java/cc/carm/plugin/userprefix/util/ItemStackFactory.java b/src/main/java/cc/carm/plugin/userprefix/util/ItemStackFactory.java index dc6f9fd..31022dd 100644 --- a/src/main/java/cc/carm/plugin/userprefix/util/ItemStackFactory.java +++ b/src/main/java/cc/carm/plugin/userprefix/util/ItemStackFactory.java @@ -60,7 +60,7 @@ public class ItemStackFactory { public ItemStackFactory setDisplayName(@NotNull String name) { ItemMeta im = this.item.getItemMeta(); if (im != null) { - im.setDisplayName(ColorParser.parseColor(name)); + im.setDisplayName(ColorParser.parse(name)); this.item.setItemMeta(im); } return this; @@ -71,7 +71,7 @@ public class ItemStackFactory { if (im != null) { im.setLore( loreList.stream() - .map(ColorParser::parseColor) + .map(ColorParser::parse) .collect(Collectors.toList()) ); this.item.setItemMeta(im); @@ -83,7 +83,7 @@ public class ItemStackFactory { ItemMeta im = this.item.getItemMeta(); if (im != null) { List lore = im.getLore() != null ? im.getLore() : new ArrayList<>(); - lore.add(ColorParser.parseColor(s)); + lore.add(ColorParser.parse(s)); im.setLore(lore); this.item.setItemMeta(im); } diff --git a/src/main/java/cc/carm/plugin/userprefix/util/MessageUtil.java b/src/main/java/cc/carm/plugin/userprefix/util/MessageUtil.java index 77171a6..8de2d23 100644 --- a/src/main/java/cc/carm/plugin/userprefix/util/MessageUtil.java +++ b/src/main/java/cc/carm/plugin/userprefix/util/MessageUtil.java @@ -2,6 +2,7 @@ package cc.carm.plugin.userprefix.util; import me.clip.placeholderapi.PlaceholderAPI; import org.bukkit.Bukkit; +import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import java.util.*; @@ -12,34 +13,34 @@ public class MessageUtil { return Bukkit.getPluginManager().getPlugin("PlaceholderAPI") != null; } - public static void send(Player player, List messages) { + public static void send(CommandSender sender, List messages) { for (String s : messages) { - player.sendMessage(ColorParser.parseColor(s)); + sender.sendMessage(ColorParser.parse(s)); } } - public static void send(Player player, String... messages) { - send(player, Arrays.asList(messages)); + public static void send(CommandSender sender, String... messages) { + send(sender, Arrays.asList(messages)); } - public static void sendWithPlaceholders(Player player, String... messages) { - sendWithPlaceholders(player, Arrays.asList(messages)); + public static void sendWithPlaceholders(CommandSender sender, String... messages) { + sendWithPlaceholders(sender, Arrays.asList(messages)); } - public static void sendWithPlaceholders(Player player, List messages) { - if (hasPlaceholderAPI()) { - send(player, PlaceholderAPI.setPlaceholders(player, messages)); + public static void sendWithPlaceholders(CommandSender sender, List messages) { + if (hasPlaceholderAPI() && sender instanceof Player) { + send(sender, PlaceholderAPI.setPlaceholders((Player) sender, messages)); } else { - send(player, messages); + send(sender, messages); } } - public static void sendWithPlaceholders(Player player, List messages, String param, Object value) { - sendWithPlaceholders(player, messages, new String[]{param}, new Object[]{value}); + public static void sendWithPlaceholders(CommandSender sender, List messages, String param, Object value) { + sendWithPlaceholders(sender, messages, new String[]{param}, new Object[]{value}); } - public static void sendWithPlaceholders(Player player, List messages, String[] params, Object[] values) { - sendWithPlaceholders(player, setCustomParams(messages, params, values)); + public static void sendWithPlaceholders(CommandSender sender, List messages, String[] params, Object[] values) { + sendWithPlaceholders(sender, setCustomParams(messages, params, values)); } public static List setCustomParams(List messages, String param, Object value) { diff --git a/src/main/java/cc/carm/plugin/userprefix/util/gui/GUI.java b/src/main/java/cc/carm/plugin/userprefix/util/gui/GUI.java index 4274c54..4c428f1 100644 --- a/src/main/java/cc/carm/plugin/userprefix/util/gui/GUI.java +++ b/src/main/java/cc/carm/plugin/userprefix/util/gui/GUI.java @@ -38,7 +38,7 @@ public class GUI { public GUI(GUIType type, String name) { this.type = type; - this.name = ColorParser.parseColor(name); + this.name = ColorParser.parse(name); switch (type) { case ONEBYNINE: this.items = new GUIItem[9]; diff --git a/src/test/java/ColorParseTest.java b/src/test/java/ColorParseTest.java new file mode 100644 index 0000000..1b3d693 --- /dev/null +++ b/src/test/java/ColorParseTest.java @@ -0,0 +1,14 @@ +import cc.carm.plugin.userprefix.util.ColorParser; +import org.junit.Test; + +public class ColorParseTest { + + + @Test + public void onTest() { + String testString = "&f爱的人永远不爱我,为何付出得到的只有&(#aaaaaa)背叛。"; + + System.out.println(ColorParser.parseHexColor(testString)); + } + +}