1
mirror of https://github.com/CarmJos/PlayerPrefix.git synced 2024-09-19 21:25:45 +00:00

1.0.0 项目完成

This commit is contained in:
carm 2021-10-21 20:59:27 +08:00
commit 805ec78a2e
16 changed files with 1093 additions and 0 deletions

30
.github/ISSUE_TEMPLATE/bugs_report.md vendored Normal file
View File

@ -0,0 +1,30 @@
---
name: 问题提交
about: 提交并描述问题,帮助我们对其进行检查与修复。
title: ''
labels: bug
assignees: ''
---
**问题简述**
用简短的话语描述一下大概问题。
**问题来源**
描述一下通过哪些操作才发现的问题,如:
1. 打开 '...'
2. 点击了 '....'
3. 出现了报错 '....'
**预期结果**(可选)
如果问题不发生,应该是什么情况
**问题截图/问题报错**
如果有报错或输出,请提供截图。
**操作环境**
请在后台输入 `version` 并复制相关输出。
**其他补充**
如有其他补充,可以在这里描述。

View File

@ -0,0 +1,20 @@
---
name: 功能需求
about: 希望我们提供更多的功能。
title: ''
labels: enhancement
assignees: ''
---
**功能简述**
简单的描述一下你想要的功能
**需求来源**
简单的描述一下为什么需要这个功能。
**功能参考**(可选)
如果有相关功能的参考,如文本、截图,请提供给我们。
**附加内容**
如果有什么小细节需要重点注意,请在这里告诉我们。

38
.github/workflows/maven.yml vendored Normal file
View File

@ -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

5
.gitignore vendored Normal file
View File

@ -0,0 +1,5 @@
/.idea/
/*.iml
/*/*.iml
/target/
/*/taget/

21
LICENSE Normal file
View File

@ -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.

89
README.md Normal file
View File

@ -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 <ID>
- 选择一个前缀并使用
```
### 管理员指令
```text
# /prefix list <玩家名>
- 列出所有前缀
# /prefix add <玩家名> <前缀>
- 添加一个前缀
# /prefix remove <玩家名> <ID>
- 移除一个前缀
# /prefix set <玩家名> <ID>
- 设置其使用的前缀
# /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"
```
## 支持与捐赠
若您觉得本插件做的不错,您可以捐赠支持我!
感谢您成为开源项目的支持者!
<img height=25% width=25% src="https://raw.githubusercontent.com/CarmJos/UserPrefix/master/img/PAY.jpg" />
## 开源协议
本项目源码采用 [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) 。*

6
example/userdata.yml Normal file
View File

@ -0,0 +1,6 @@
prefixs:
enable: true
using: 0
list:
1: "测试"
2: "爱你"

193
pom.xml Normal file
View File

@ -0,0 +1,193 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.harmoland</groupId>
<artifactId>PlayerPrefix</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<name>玩家前缀系统</name>
<description>指令操作的轻量玩家前缀管理插件。</description>
<url>https://github.com/CarmJos/PlayerPrefix</url>
<issueManagement>
<system>GitHub Issues</system>
<url>https://github.com/CarmJos/PlayerPrefix/issues</url>
</issueManagement>
<ciManagement>
<system>GitHub Actions</system>
<url>https://github.com/CarmJos/PlayerPrefix/actions/workflows/maven.yml</url>
</ciManagement>
<developers>
<developer>
<id>CarmJos</id>
<name>Carm Jos</name>
<email>carm@carm.cc</email>
<roles>
<role>Main Developer</role>
</roles>
<url>https://work.carm.cc</url>
</developer>
</developers>
<licenses>
<license>
<name>GNU General Public License v3.0</name>
<url>https://opensource.org/licenses/GPL-3.0</url>
</license>
</licenses>
<repositories>
<repository>
<id>spigot-repo</id>
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
</repository>
<repository>
<id>placeholder-api-repo</id>
<url>https://repo.extendedclip.com/content/repositories/placeholderapi/</url>
</repository>
<repository>
<id>oss-repo</id>
<url>https://oss.sonatype.org/content/groups/public/</url>
</repository>
<repository>
<id>luck-repo</id>
<url>https://repo.lucko.me/</url>
</repository>
<repository>
<id>maven-central</id>
<url>https://repo1.maven.org/maven2/</url>
</repository>
<repository>
<id>github</id>
<name>GitHub Packages</name>
<url>https://maven.pkg.github.com/CarmJos/PlayerPrefix</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<version>1.12.2-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.github.azbh111</groupId>
<artifactId>craftbukkit-1.12.2</artifactId>
<version>R</version>
</dependency>
<dependency>
<groupId>me.clip</groupId>
<artifactId>placeholderapi</artifactId>
<version>2.10.9</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
<compilerArgument>-parameters</compilerArgument>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.0</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.2.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.3</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
</configuration>
</execution>
</executions>
<configuration>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/MANIFEST.MF</exclude>
<exclude>META-INF/*.txt</exclude>
</excludes>
</filter>
</filters>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
<configuration>
<useSystemClassLoader>false</useSystemClassLoader>
</configuration>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
</project>

View File

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

View File

@ -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<Integer, String> 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 <ID> §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<Integer, String> 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 <ID> §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 <玩家名> <ID> §7移除一个前缀");
sender.sendMessage("§f/prefix set <玩家名> <ID> §7设置其使用的前缀");
sender.sendMessage("§f/prefix addall <玩家名> <源玩家名>");
sender.sendMessage("§8 - §7添加所有源玩家的前缀到目标玩家");
sender.sendMessage("§f/prefix copy <玩家名> <源玩家名>");
sender.sendMessage("§8 - §7设置目标玩家的前缀列表为源玩家的前缀列表");
}
@Override
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
switch (args.length) {
case 1: {
List<String> completions = new ArrayList<>();
List<String> 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<String> 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();
}
}
}

View File

@ -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());
}
}

View File

@ -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<UUID, UserPrefixCache> 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<UUID, UserPrefixCache> getUserDataCaches() {
return userDataCaches;
}
}

View File

@ -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<Integer, String> 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<Integer, String> getPrefixes() {
return prefixes;
}
public void readPrefix() {
try {
Set<String> 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();
}
}
}

View File

@ -0,0 +1,10 @@
package cc.carm.plugin.playerprefix.utils;
public class MessageParser {
public static String parseColor(String text) {
return text.replaceAll("&", "§").replace("§§", "&");
}
}

View File

@ -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;
}
}

View File

@ -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