1
mirror of https://github.com/CarmJos/PlayerPrefix.git synced 2026-06-04 18:08:18 +08: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
@@ -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));
}
}
@@ -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();
}
}
}
@@ -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());
}
}
@@ -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;
}
}
@@ -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();
}
}
}
@@ -0,0 +1,10 @@
package cc.carm.plugin.playerprefix.utils;
public class MessageParser {
public static String parseColor(String text) {
return text.replaceAll("&", "§").replace("§§", "&");
}
}
@@ -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;
}
}
+10
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