commit 805ec78a2e9773ae09ab9c0986d28d3f95176bab Author: carm Date: Thu Oct 21 20:59:27 2021 +0800 1.0.0 项目完成 diff --git a/.github/ISSUE_TEMPLATE/bugs_report.md b/.github/ISSUE_TEMPLATE/bugs_report.md new file mode 100644 index 0000000..e163a00 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bugs_report.md @@ -0,0 +1,30 @@ +--- +name: 问题提交 +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 new file mode 100644 index 0000000..b7e7f40 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_issues.md @@ -0,0 +1,20 @@ +--- +name: 功能需求 +about: 希望我们提供更多的功能。 +title: '' +labels: enhancement +assignees: '' + +--- + +**功能简述** +简单的描述一下你想要的功能 + +**需求来源** +简单的描述一下为什么需要这个功能。 + +**功能参考**(可选) +如果有相关功能的参考,如文本、截图,请提供给我们。 + +**附加内容** +如果有什么小细节需要重点注意,请在这里告诉我们。 diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml new file mode 100644 index 0000000..bdc7f2a --- /dev/null +++ b/.github/workflows/maven.yml @@ -0,0 +1,38 @@ +# This workflow will build a Java project with Maven, and cache/restore any dependencies to improve the workflow execution time +# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-maven + +name: Build + +on: + # 支持手动触发构建 + workflow_dispatch: + push: + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - name: "Set up JDK" + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + cache: maven + server-id: github + server-username: MAVEN_USERNAME + server-password: MAVEN_TOKEN + - name: "Package" + run: mvn -B package --file pom.xml + env: + MAVEN_USERNAME: ${{ secrets.MAVEN_USERNAME }} + MAVEN_TOKEN: ${{secrets.GITHUB_TOKEN}} + - name: "Target Stage" + run: mkdir staging && cp target/*.jar staging + - name: "Upload artifact" + uses: actions/upload-artifact@v2 + with: + name: artifact + path: staging \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8a6e898 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +/.idea/ +/*.iml +/*/*.iml +/target/ +/*/taget/ \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..819d9fe --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 Carm + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..cd7d660 --- /dev/null +++ b/README.md @@ -0,0 +1,89 @@ +# PlayerPrefix 玩家前缀管理 + +![CodeSize](https://img.shields.io/github/languages/code-size/CarmJos/PlayerPrefix) +[![License](https://img.shields.io/github/license/CarmJos/PlayerPrefix)](https://opensource.org/licenses/mit-license.php) +[![Build](https://github.com/CarmJos/PlayerPrefix/actions/workflows/maven.yml/badge.svg?branch=master)](https://github.com/CarmJos/PlayerPrefix/actions/workflows/maven.yml) +![Support](https://img.shields.io/badge/Minecraft-Java%201.12--Latest-yellow) +![](https://visitor-badge.glitch.me/badge?page_id=PlayerPrefix.readme) + +## 简介 + +本插件是一款轻量玩家前缀管理插件,支持以指令操作给不同的玩家发放称号、复制称号,并存储到本地yml文件中。 + +称号将只显示在玩家头顶上,玩家可选打开或关闭称号显示。 + +本插件基于Spigot实现,功能简单,运行稳定,**理论上支持全版本**。 + +本插件由 [桦木原Harmoland](https://www.mcbbs.net/thread-1028923-1-1.html) 请求本人开发,经过授权后开源。 + +## 依赖 + +- **[必须]** 插件本体基于 [Spigot-API](https://hub.spigotmc.org/stash/projects/SPIGOT) 、[BukkitAPI](http://bukkit.org/) 实现。 + +详细依赖列表可见 [Dependencies](https://github.com/CarmJos/PlayerPrefix/network/dependencies) 。 + +## 指令 + +### 玩家指令 + +```text +# /prefix list +- 列出所拥有的所有前缀 +# /prefix toggle +- 开关前缀显示 +# /prefix set +- 选择一个前缀并使用 +``` + +### 管理员指令 + +```text +# /prefix list <玩家名> +- 列出所有前缀 +# /prefix add <玩家名> <前缀> +- 添加一个前缀 +# /prefix remove <玩家名> +- 移除一个前缀 +# /prefix set <玩家名> +- 设置其使用的前缀 +# /prefix addAll <玩家名> <源玩家名> +- 添加所有源玩家的前缀到目标玩家 +# /prefix copy <玩家名> <源玩家名> +- 设置目标玩家的前缀列表为源玩家的前缀列表 +``` + +## [玩家数据文件](https://github.com/CarmJos/PlayerPrefix/blob/master/example/userdata.yml) 示例 + +```yaml +prefixs: + enable: true # 该玩家是否启用前缀 + using: 0 # 正在使用的前缀ID + list: #前缀内容列表 + 1: "&d&l可爱的&d" + 2: "&b&l帅气的&b" +``` + +## 支持与捐赠 + +若您觉得本插件做的不错,您可以捐赠支持我! + +感谢您成为开源项目的支持者! + + + +## 开源协议 + +本项目源码采用 [The MIT License](https://opensource.org/licenses/mit-license.php) 开源协议。 + +> ### 关于 MIT 协议 +> MIT 协议可能是几大开源协议中最宽松的一个,核心条款是: +> +> 该软件及其相关文档对所有人免费,可以任意处置,包括使用,复制,修改,合并,发表,分发,再授权,或者销售。唯一的限制是,软件中必须包含上述版 权和许可提示。 +> +> 这意味着: +> - 你可以自由使用,复制,修改,可以用于自己的项目。 +> - 可以免费分发或用来盈利。 +> - 唯一的限制是必须包含许可声明。 +> - MIT 协议是所有开源许可中最宽松的一个,除了必须包含许可声明外,再无任何限制。 +> +> *以上文字来自 [五种开源协议GPL,LGPL,BSD,MIT,Apache](https://www.oschina.net/question/54100_9455) 。* diff --git a/example/userdata.yml b/example/userdata.yml new file mode 100644 index 0000000..b71345a --- /dev/null +++ b/example/userdata.yml @@ -0,0 +1,6 @@ +prefixs: + enable: true + using: 0 + list: + 1: "测试" + 2: "爱你" \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..35a6cbc --- /dev/null +++ b/pom.xml @@ -0,0 +1,193 @@ + + + 4.0.0 + + com.harmoland + PlayerPrefix + 1.0.0 + jar + + + UTF-8 + 1.8 + 1.8 + + + 玩家前缀系统 + 指令操作的轻量玩家前缀管理插件。 + https://github.com/CarmJos/PlayerPrefix + + + GitHub Issues + https://github.com/CarmJos/PlayerPrefix/issues + + + + GitHub Actions + https://github.com/CarmJos/PlayerPrefix/actions/workflows/maven.yml + + + + + CarmJos + Carm Jos + carm@carm.cc + + Main Developer + + https://work.carm.cc + + + + + + GNU General Public License v3.0 + https://opensource.org/licenses/GPL-3.0 + + + + + + + spigot-repo + https://hub.spigotmc.org/nexus/content/repositories/snapshots/ + + + + placeholder-api-repo + https://repo.extendedclip.com/content/repositories/placeholderapi/ + + + + oss-repo + https://oss.sonatype.org/content/groups/public/ + + + + luck-repo + https://repo.lucko.me/ + + + + maven-central + https://repo1.maven.org/maven2/ + + + + github + GitHub Packages + https://maven.pkg.github.com/CarmJos/PlayerPrefix + + + + + + + org.spigotmc + spigot-api + 1.12.2-R0.1-SNAPSHOT + provided + + + + com.github.azbh111 + craftbukkit-1.12.2 + R + + + + me.clip + placeholderapi + 2.10.9 + provided + + + + junit + junit + 4.13 + test + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + 1.8 + 1.8 + UTF-8 + -parameters + + + + org.apache.maven.plugins + maven-jar-plugin + 3.2.0 + + + org.apache.maven.plugins + maven-source-plugin + 3.2.0 + + + package + + jar-no-fork + + + + + + org.apache.maven.plugins + maven-shade-plugin + 3.2.3 + + + package + + shade + + + false + + + + + + + *:* + + META-INF/MANIFEST.MF + META-INF/*.txt + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.22.1 + + false + + + + + + src/main/resources + true + + + + + + \ No newline at end of file diff --git a/src/main/java/cc/carm/plugin/playerprefix/Main.java b/src/main/java/cc/carm/plugin/playerprefix/Main.java new file mode 100644 index 0000000..2078448 --- /dev/null +++ b/src/main/java/cc/carm/plugin/playerprefix/Main.java @@ -0,0 +1,44 @@ +package cc.carm.plugin.playerprefix; + +import cc.carm.plugin.playerprefix.commands.PlayerPrefixCommand; +import cc.carm.plugin.playerprefix.listeners.PrefixListener; +import cc.carm.plugin.playerprefix.managers.UserPrefixManager; +import cc.carm.plugin.playerprefix.utils.MessageParser; +import org.bukkit.Bukkit; +import org.bukkit.plugin.java.JavaPlugin; + +public class Main extends JavaPlugin { + + private static Main instance; + + public static Main getInstance() { + return Main.instance; + } + + + @Override + public void onEnable() { + instance = this; + + log(getName() + " " + getDescription().getVersion() + " &7开始加载..."); + long startTime = System.currentTimeMillis(); + + log("启用前缀管理器..."); + UserPrefixManager.init(); + + log("注册指令..."); + this.getCommand("PlayerPrefix").setExecutor(new PlayerPrefixCommand()); + this.getCommand("PlayerPrefix").setTabCompleter(new PlayerPrefixCommand()); + + log("注册监听器..."); + Bukkit.getPluginManager().registerEvents(new PrefixListener(), this); + + log("加载完成 ,共耗时 " + (System.currentTimeMillis() - startTime) + " ms 。"); + + } + + public static void log(String message) { + Bukkit.getConsoleSender().sendMessage(MessageParser.parseColor("[" + getInstance().getName() + "] " + message)); + } + +} diff --git a/src/main/java/cc/carm/plugin/playerprefix/commands/PlayerPrefixCommand.java b/src/main/java/cc/carm/plugin/playerprefix/commands/PlayerPrefixCommand.java new file mode 100644 index 0000000..f7ab531 --- /dev/null +++ b/src/main/java/cc/carm/plugin/playerprefix/commands/PlayerPrefixCommand.java @@ -0,0 +1,306 @@ +package cc.carm.plugin.playerprefix.commands; + +import cc.carm.plugin.playerprefix.managers.UserPrefixManager; +import cc.carm.plugin.playerprefix.models.UserPrefixCache; +import cc.carm.plugin.playerprefix.utils.MessageParser; +import com.google.common.collect.ImmutableList; +import org.bukkit.Bukkit; +import org.bukkit.OfflinePlayer; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.TabCompleter; +import org.bukkit.entity.Player; +import org.bukkit.util.StringUtil; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +public class PlayerPrefixCommand implements CommandExecutor, TabCompleter { + + + @Override + public boolean onCommand(CommandSender sender, Command command, String s, String[] args) { + if (args.length == 1) { + String aim = args[0]; + if (aim.equalsIgnoreCase("list")) { + if (!(sender instanceof Player)) { + sender.sendMessage("只有玩家才可使用此指令!"); + return true; + } + + Player player = (Player) sender; + UserPrefixCache cache = UserPrefixManager.getData(player.getUniqueId()); + Map prefixs = cache.getPrefixes(); + if (prefixs.size() < 1) { + sender.sendMessage("§f抱歉,但您当前暂无前缀!"); + return true; + } + sender.sendMessage("§f您当前有以下前缀:"); + sender.sendMessage("§8| §70 §f(无)"); + prefixs.forEach((integer, s1) -> { + sender.sendMessage("§8| §7" + integer + " §f" + MessageParser.parseColor(s1)); + }); + sender.sendMessage("§f您可以输入 “§a/prefix set §f” 来更换您的前缀。"); + return true; + } else if (aim.equalsIgnoreCase("toggle")) { + if (!(sender instanceof Player)) { + sender.sendMessage("只有玩家才可使用此指令!"); + return true; + } + + Player player = (Player) sender; + UserPrefixCache cache = UserPrefixManager.getData(player.getUniqueId()); + cache.setEnablePrefix(!cache.isEnabledPrefix()); + if (cache.isEnabledPrefix()) { + UserPrefixManager.updatePrefix(player); + } else { + UserPrefixManager.clearPrefix(player); + } + sender.sendMessage("当前前缀显示状态: " + (cache.isEnabledPrefix() ? "§a开启" : "§c关闭")); + + } else if (aim.equalsIgnoreCase("admin")) { + if (sender.hasPermission("prefix.admin")) { + helpAdmin(sender); + } + return true; + } + } else if (args.length == 2) { + String aim = args[0]; + if (aim.equalsIgnoreCase("list")) { + if (!sender.hasPermission("prefix.admin")) { + return true; + } + + OfflinePlayer targetPlayer = Bukkit.getOfflinePlayer(args[1]); + UUID playerUUID = targetPlayer.getUniqueId(); + UserPrefixCache cache = UserPrefixManager.loadData(playerUUID); + sender.sendMessage("§f" + targetPlayer.getName() + "当前有以下前缀:"); + Map prefixs = cache.getPrefixes(); + prefixs.forEach((integer, s1) -> { + sender.sendMessage("§8| §7" + integer + " §f" + MessageParser.parseColor(s1)); + }); + UserPrefixManager.unloadData(playerUUID); + return true; + } else if (aim.equalsIgnoreCase("set")) { + if (!(sender instanceof Player)) { + sender.sendMessage("只有玩家才可使用此指令!"); + return true; + } + + int id; + try { + id = Integer.parseInt(args[1]); + } catch (Exception e) { + sender.sendMessage("提供的ID错误,请您输入/prefix list 查看您所拥有的前缀。"); + return true; + } + + Player player = (Player) sender; + UserPrefixCache cache = UserPrefixManager.getData(player.getUniqueId()); + + if (id == 0) { + cache.setUsingPrefix(id); + sender.sendMessage("您已摘下前缀。"); + UserPrefixManager.updatePrefix(player); + } else if (cache.getPrefixes().containsKey(id)) { + cache.setUsingPrefix(id); + sender.sendMessage("您当前的前缀已更新为:" + cache.getUsingPrefix()); + UserPrefixManager.updatePrefix(player); + } else { + sender.sendMessage("§c修改失败!§f您未拥有该ID的前缀。"); + sender.sendMessage("您可以输入/prefix list 查看您所拥有的前缀。"); + } + return true; + } else { + help(sender); + return true; + } + } else if (args.length == 3) { + if (!sender.hasPermission("prefix.admin")) { + return true; + } + + + String aim = args[0]; + if (aim.equalsIgnoreCase("add")) { + OfflinePlayer targetPlayer = Bukkit.getOfflinePlayer(args[1]); + UUID playerUUID = targetPlayer.getUniqueId(); + UserPrefixCache cache = UserPrefixManager.loadData(playerUUID); + cache.addPrefix(args[2]); + UserPrefixManager.unloadData(playerUUID); + sender.sendMessage("成功为玩家 " + targetPlayer.getPlayer() + " 添加前缀:" + args[2]); + return true; + + } else if (aim.equalsIgnoreCase("remove")) { + OfflinePlayer targetPlayer = Bukkit.getOfflinePlayer(args[1]); + UUID playerUUID = targetPlayer.getUniqueId(); + UserPrefixCache cache = UserPrefixManager.loadData(playerUUID); + + int id; + try { + id = Integer.parseInt(args[2]); + } catch (Exception e) { + sender.sendMessage("提供的ID错误,可以输入/prefix list <玩家名>查看该玩家所拥有的前缀。"); + return true; + } + + if (cache.getPrefixes().containsKey(id)) { + sender.sendMessage("已移除ID为 " + id + " 的前缀:" + cache.getPrefixes().get(id)); + cache.removePrefix(id); + if (targetPlayer.isOnline()) { + UserPrefixManager.updatePrefix(Bukkit.getPlayer(playerUUID)); + } + } else { + sender.sendMessage("§c移除失败!§f该玩家未拥有该前缀ID。"); + sender.sendMessage("您可以输入/prefix list <玩家名> 查看该玩家所拥有的前缀。"); + } + + UserPrefixManager.unloadData(playerUUID); + return true; + } else if (aim.equalsIgnoreCase("set")) { + OfflinePlayer targetPlayer = Bukkit.getOfflinePlayer(args[1]); + UUID playerUUID = targetPlayer.getUniqueId(); + UserPrefixCache cache = UserPrefixManager.loadData(playerUUID); + + int id; + try { + id = Integer.parseInt(args[2]); + } catch (Exception e) { + sender.sendMessage("提供的ID错误,可以输入/prefix list <玩家名>查看该玩家所拥有的前缀。"); + return true; + } + + if (cache.getPrefixes().containsKey(id)) { + sender.sendMessage("成功设置玩家 " + targetPlayer.getName() + " 的前缀为" + cache.getPrefixes().get(id)); + cache.setUsingPrefix(id); + if (targetPlayer.isOnline()) { + UserPrefixManager.updatePrefix(Bukkit.getPlayer(playerUUID)); + } + } else { + sender.sendMessage("§c设置失败!§f该玩家未拥有该前缀ID。"); + sender.sendMessage("您可以输入/prefix list <玩家名> 查看该玩家所拥有的前缀。"); + } + UserPrefixManager.unloadData(playerUUID); + return true; + } else if (aim.equalsIgnoreCase("copy")) { + OfflinePlayer targetPlayer = Bukkit.getOfflinePlayer(args[1]); + UUID playerUUID = targetPlayer.getUniqueId(); + UserPrefixCache cache = UserPrefixManager.loadData(playerUUID); + + + OfflinePlayer sourcePlayer = Bukkit.getOfflinePlayer(args[2]); + UUID sourceUUID = sourcePlayer.getUniqueId(); + UserPrefixCache sourceCache = UserPrefixManager.loadData(sourceUUID); + + if (sourceCache.getPrefixes().size() > 0) { + for (Integer prefixID : cache.getPrefixes().keySet()) { + cache.removePrefix(prefixID); + } + for (String value : sourceCache.getPrefixes().values()) { + cache.addPrefix(value); + } + sender.sendMessage("成功复制玩家 " + sourcePlayer.getName() + " 的前缀到" + targetPlayer.getPlayer()); + } else { + sender.sendMessage("§c复制失败!§f目标玩家的前缀列表为空。"); + } + UserPrefixManager.unloadData(playerUUID); + UserPrefixManager.unloadData(sourceUUID); + return true; + } else if (aim.equalsIgnoreCase("addall")) { + OfflinePlayer targetPlayer = Bukkit.getOfflinePlayer(args[1]); + UUID playerUUID = targetPlayer.getUniqueId(); + UserPrefixCache cache = UserPrefixManager.loadData(playerUUID); + + + OfflinePlayer sourcePlayer = Bukkit.getOfflinePlayer(args[2]); + UUID sourceUUID = sourcePlayer.getUniqueId(); + UserPrefixCache sourceCache = UserPrefixManager.loadData(sourceUUID); + + if (sourceCache.getPrefixes().size() > 0) { + for (String value : sourceCache.getPrefixes().values()) { + cache.addPrefix(value); + } + sender.sendMessage("成功添加玩家 " + sourcePlayer.getName() + " 的所有前缀到" + targetPlayer.getPlayer()); + } else { + sender.sendMessage("§c添加失败!§f目标玩家的前缀列表为空。"); + } + UserPrefixManager.unloadData(playerUUID); + UserPrefixManager.unloadData(sourceUUID); + return true; + } else { + helpAdmin(sender); + return true; + } + } else { + help(sender); + return true; + } + return true; + } + + + public static void help(CommandSender sender) { + sender.sendMessage("§a§l前缀系统 §f指令列表"); + sender.sendMessage("§f/prefix list §7列出所有前缀"); + sender.sendMessage("§f/prefix toggle §7开关前缀显示"); + sender.sendMessage("§f/prefix set §7设置使用的前缀"); + } + + public static void helpAdmin(CommandSender sender) { + sender.sendMessage("§a§l前缀系统 §f管理员指令列表"); + sender.sendMessage("§f/prefix list <玩家名> §7列出所有前缀"); + sender.sendMessage("§f/prefix add <玩家名> <前缀> §7添加一个前缀"); + sender.sendMessage("§f/prefix remove <玩家名> §7移除一个前缀"); + sender.sendMessage("§f/prefix set <玩家名> §7设置其使用的前缀"); + sender.sendMessage("§f/prefix addall <玩家名> <源玩家名>"); + sender.sendMessage("§8 - §7添加所有源玩家的前缀到目标玩家"); + sender.sendMessage("§f/prefix copy <玩家名> <源玩家名>"); + sender.sendMessage("§8 - §7设置目标玩家的前缀列表为源玩家的前缀列表"); + } + + @Override + public List onTabComplete(CommandSender sender, Command command, String alias, String[] args) { + switch (args.length) { + case 1: { + List completions = new ArrayList<>(); + List strings = new ArrayList<>(); + strings.add("list"); + strings.add("toggle"); + strings.add("set"); + if (sender.hasPermission("prefix.admin")) { + strings.add("add"); + strings.add("remove"); + strings.add("copy"); + strings.add("addall"); + } + for (String s : strings) { + if (StringUtil.startsWithIgnoreCase(s, args[0].toLowerCase())) { + completions.add(s); + } + } + return completions; + } + case 2: { + if (!sender.hasPermission("prefix.admin")) { + return ImmutableList.of(); + } + String aim = args[1]; + if (aim.equalsIgnoreCase("add") || aim.equalsIgnoreCase("remove") || aim.equalsIgnoreCase("list")) { + List completions = new ArrayList<>(); + for (Player pl : Bukkit.getOnlinePlayers()) { + if (StringUtil.startsWithIgnoreCase(pl.getName(), args[1].toLowerCase())) { + completions.add(pl.getName()); + } + } + return completions; + } + } + default: + return ImmutableList.of(); + } + } + +} diff --git a/src/main/java/cc/carm/plugin/playerprefix/listeners/PrefixListener.java b/src/main/java/cc/carm/plugin/playerprefix/listeners/PrefixListener.java new file mode 100644 index 0000000..5e76da9 --- /dev/null +++ b/src/main/java/cc/carm/plugin/playerprefix/listeners/PrefixListener.java @@ -0,0 +1,29 @@ +package cc.carm.plugin.playerprefix.listeners; + +import cc.carm.plugin.playerprefix.managers.UserPrefixManager; +import cc.carm.plugin.playerprefix.models.UserPrefixCache; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; + +public class PrefixListener implements Listener { + + @EventHandler + public void onJoin(PlayerJoinEvent event) { + Player player = event.getPlayer(); + + UserPrefixCache playerCache = UserPrefixManager.loadData(player.getUniqueId()); + UserPrefixManager.updatePrefix(player); + + } + + @EventHandler + public void onQuit(PlayerQuitEvent event) { + Player player = event.getPlayer(); + UserPrefixManager.clearPrefix(player); + UserPrefixManager.unloadData(player.getUniqueId()); + } + +} diff --git a/src/main/java/cc/carm/plugin/playerprefix/managers/UserPrefixManager.java b/src/main/java/cc/carm/plugin/playerprefix/managers/UserPrefixManager.java new file mode 100644 index 0000000..8b1b0d4 --- /dev/null +++ b/src/main/java/cc/carm/plugin/playerprefix/managers/UserPrefixManager.java @@ -0,0 +1,71 @@ +package cc.carm.plugin.playerprefix.managers; + +import cc.carm.plugin.playerprefix.Main; +import cc.carm.plugin.playerprefix.models.UserPrefixCache; +import cc.carm.plugin.playerprefix.utils.NamePrefix; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; + +import java.io.File; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +public class UserPrefixManager { + + + public static Map userDataCaches = new HashMap<>(); + + public static void init() { + File userdataFolder = new File(Main.getInstance().getDataFolder() + "/userdata"); + if (!userdataFolder.isDirectory() || !userdataFolder.exists()) { + userdataFolder.mkdir(); + } + } + + public static void updatePrefix(Player player) { + UserPrefixCache playerCache = UserPrefixManager.getData(player.getUniqueId()); + + for (Player onlinePlayer : Bukkit.getOnlinePlayers()) { + UserPrefixCache othersCache = UserPrefixManager.getData(onlinePlayer.getUniqueId()); + if (playerCache.isEnabledPrefix()) { + NamePrefix.set(player, onlinePlayer, othersCache.getUsingPrefix()); + } + if (othersCache.isEnabledPrefix()) { + NamePrefix.set(onlinePlayer, player, playerCache.getUsingPrefix()); + } + } + } + + public static void clearPrefix(Player player) { + + for (Player onlinePlayer : Bukkit.getOnlinePlayers()) { + NamePrefix.reset(onlinePlayer, player); + NamePrefix.reset(player, onlinePlayer); + } + } + + public static UserPrefixCache loadData(UUID uuid) { + UserPrefixCache prefixCache = new UserPrefixCache(uuid); + + userDataCaches.put(uuid, prefixCache); + + return prefixCache; + } + + public static void unloadData(UUID uuid) { + userDataCaches.remove(uuid); + } + + public static UserPrefixCache getData(UUID uuid) { + return userDataCaches.getOrDefault(uuid, loadData(uuid)); + } + + public static boolean hasData(UUID uuid) { + return userDataCaches.containsKey(uuid); + } + + public static Map getUserDataCaches() { + return userDataCaches; + } +} diff --git a/src/main/java/cc/carm/plugin/playerprefix/models/UserPrefixCache.java b/src/main/java/cc/carm/plugin/playerprefix/models/UserPrefixCache.java new file mode 100644 index 0000000..a2f4be0 --- /dev/null +++ b/src/main/java/cc/carm/plugin/playerprefix/models/UserPrefixCache.java @@ -0,0 +1,161 @@ +package cc.carm.plugin.playerprefix.models; + +import cc.carm.plugin.playerprefix.Main; +import cc.carm.plugin.playerprefix.utils.MessageParser; +import org.bukkit.Bukkit; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; + +import java.io.File; +import java.io.IOException; +import java.util.*; +import java.util.logging.Level; + +public class UserPrefixCache { + + UUID uuid; + + private final File datafile; + private FileConfiguration dataConfiguration; + + boolean fileLoaded; + + private final Map prefixes; + private int usingPrefix; + private boolean enablePrefix; + + + public UserPrefixCache(UUID uuid) { + this.uuid = uuid; + File userdataFolder = new File(Main.getInstance().getDataFolder() + "/userdata"); + if (!userdataFolder.isDirectory() || !userdataFolder.exists()) { + userdataFolder.mkdir(); + } + this.datafile = new File(userdataFolder, this.uuid + ".yml"); + + this.fileLoaded = datafile.exists(); + + + this.prefixes = new HashMap<>(); + this.usingPrefix = 0; + + if (!fileLoaded) { + checkFile(); + setEnablePrefix(true); + } else { + this.dataConfiguration = YamlConfiguration.loadConfiguration(datafile); + + readPrefix(); + } + + + } + + public Map getPrefixes() { + return prefixes; + } + + + public void readPrefix() { + try { + Set idString = getDataConfiguration().getConfigurationSection("prefixes.list").getKeys(false); + for (String s : idString) { + try { + int id = Integer.parseInt(s); + String prefix = getDataConfiguration().getString("prefixes.list." + s); + getPrefixes().put(id, prefix); + } catch (Exception e) { + Main.getInstance().getLogger().log(Level.WARNING, "前缀加载有误 " + uuid + ".yml -> prefixes.list." + s); + } + } + } catch (Exception ignore) { + } + + int usingPrefixData = getDataConfiguration().getInt("prefixes.using", 0); + + if (getPrefixes().containsKey(usingPrefixData)) { + this.usingPrefix = usingPrefixData; + } + + this.enablePrefix = getDataConfiguration().getBoolean("prefixes.enable", true); + + + } + + public String getUsingPrefix() { + return MessageParser.parseColor(getPrefixes().getOrDefault(this.usingPrefix, "")); + } + + public void setUsingPrefix(int id) { + if (getPrefixes().containsKey(id)) { + this.usingPrefix = id; + checkFile(); + getDataConfiguration().set("prefixes.using", id); + } else { + this.usingPrefix = 0; + checkFile(); + getDataConfiguration().set("prefixes.using", 0); + } + saveDatas(); + + } + + public void setEnablePrefix(boolean toggle) { + this.enablePrefix = toggle; + checkFile(); + getDataConfiguration().set("prefixes.enable", toggle); + saveDatas(); + } + + public boolean isEnabledPrefix() { + return this.enablePrefix; + } + + private void checkFile() { + if (!datafile.exists()) { + try { + datafile.createNewFile(); + } catch (IOException ex) { + Bukkit.getLogger().info("Could not load file " + "/userdata/" + "yml" + ex); + } + } + if (!fileLoaded) { + this.dataConfiguration = YamlConfiguration.loadConfiguration(datafile); + this.fileLoaded = true; + } + } + + public void addPrefix(String prefix) { + int id = getPrefixes().size() > 0 ? Collections.max(getPrefixes().keySet()) + 1 : 1; + getPrefixes().put(id, prefix); + checkFile(); + getDataConfiguration().set("prefixes.list." + id, prefix); + saveDatas(); + } + + public void removePrefix(int prefixID) { + if (this.usingPrefix == prefixID) { + setUsingPrefix(0); + } + getPrefixes().remove(prefixID); + checkFile(); + getDataConfiguration().set("prefixes.list." + prefixID, null); + saveDatas(); + } + + public boolean isFileLoaded() { + return fileLoaded; + } + + public FileConfiguration getDataConfiguration() { + return this.dataConfiguration; + } + + public void saveDatas() { + try { + getDataConfiguration().save(datafile); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/cc/carm/plugin/playerprefix/utils/MessageParser.java b/src/main/java/cc/carm/plugin/playerprefix/utils/MessageParser.java new file mode 100644 index 0000000..840b1ff --- /dev/null +++ b/src/main/java/cc/carm/plugin/playerprefix/utils/MessageParser.java @@ -0,0 +1,10 @@ +package cc.carm.plugin.playerprefix.utils; + +public class MessageParser { + + public static String parseColor(String text) { + return text.replaceAll("&", "§").replace("§§", "&"); + } + + +} diff --git a/src/main/java/cc/carm/plugin/playerprefix/utils/NamePrefix.java b/src/main/java/cc/carm/plugin/playerprefix/utils/NamePrefix.java new file mode 100644 index 0000000..ce0cb68 --- /dev/null +++ b/src/main/java/cc/carm/plugin/playerprefix/utils/NamePrefix.java @@ -0,0 +1,60 @@ +package cc.carm.plugin.playerprefix.utils; + +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.scoreboard.NameTagVisibility; +import org.bukkit.scoreboard.Scoreboard; +import org.bukkit.scoreboard.Team; + +public class NamePrefix { + + public static void set(Player viewer, Player target, String str) { + set(viewer, target, str, PSType.PREFIX); + } + + public static void set(Player viewer, Player target, String str, PSType type) { + Scoreboard sb = viewer.getScoreboard(); + if (Bukkit.getScoreboardManager().getMainScoreboard() == sb || sb == null) { + sb = Bukkit.getScoreboardManager().getNewScoreboard(); + viewer.setScoreboard(sb); + } + Team t = sb.getTeam("NP_" + target.getName().substring(0, Math.min(13, target.getName().length()))); + if (t == null) { + t = sb.registerNewTeam("NP_" + target.getName().substring(0, Math.min(13, target.getName().length()))); + t.setNameTagVisibility(NameTagVisibility.ALWAYS); + } + if (str.length() > 16) { + str = str.substring(0, 16); + } + switch (type) { + case PREFIX: + t.setPrefix(str); + break; + case SUFFIX: + t.setSuffix(str); + break; + default: + throw new AssertionError(type.name()); + } + if (!t.hasEntry(target.getName())) t.addEntry(target.getName()); + } + + public static void reset(Player viewer, Player target) { + Scoreboard sb = viewer.getScoreboard(); + if (Bukkit.getScoreboardManager().getMainScoreboard() == sb || sb == null) { + sb = Bukkit.getScoreboardManager().getNewScoreboard(); + viewer.setScoreboard(sb); + return; + } + Team t = sb.getTeam("NP_" + target.getName().substring(0, Math.min(13, target.getName().length()))); + if (t != null) { + t.unregister(); + } + } + + public enum PSType { + PREFIX, + SUFFIX; + } + +} diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml new file mode 100644 index 0000000..4792949 --- /dev/null +++ b/src/main/resources/plugin.yml @@ -0,0 +1,10 @@ +name: PlayerPrefix +main: cc.carm.plugin.playerprefix.Main +version: ${project} +author: CarmJos +depend: [ ProtocolLib ] +website: "https://github.com/CarmJos/PlayerPrefix" +commands: + PlayerPrefix: + aliases: + - prefix \ No newline at end of file