1
mirror of https://github.com/CarmJos/UserPrefix.git synced 2026-06-05 00:35:02 +08:00

1.2.1-SNAPSHOT 修复一些小问题

1. 添加了更多的注释
2. 修复了玩家GUI缓存未清空的问题。
3. 添加了@Nullable与@NotNull的标识,便于后续代码更新维护。
This commit is contained in:
carm
2021-09-08 18:36:16 +08:00
parent 6c175816ce
commit 7af506362b
7 changed files with 102 additions and 177 deletions
+1 -1
View File
@@ -6,7 +6,7 @@
<groupId>cc.carm.plugin</groupId> <groupId>cc.carm.plugin</groupId>
<artifactId>UserPrefix</artifactId> <artifactId>UserPrefix</artifactId>
<version>1.2.0-SNAPSHOT</version> <version>1.2.1-SNAPSHOT</version>
<properties> <properties>
<maven.compiler.source>8</maven.compiler.source> <maven.compiler.source>8</maven.compiler.source>
@@ -8,6 +8,8 @@ import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.enchantments.Enchantment; import org.bukkit.enchantments.Enchantment;
import org.bukkit.inventory.ItemFlag; import org.bukkit.inventory.ItemFlag;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Comparator; import java.util.Comparator;
import java.util.HashMap; import java.util.HashMap;
@@ -113,16 +115,21 @@ public class PrefixManager {
.collect(Collectors.toList()); .collect(Collectors.toList());
} }
@NotNull
public static ConfiguredPrefix getDefaultPrefix() { public static ConfiguredPrefix getDefaultPrefix() {
return defaultPrefix; return defaultPrefix;
} }
@NotNull
public static HashMap<String, ConfiguredPrefix> getPrefixes() { public static HashMap<String, ConfiguredPrefix> getPrefixes() {
return prefixes; return prefixes;
} }
@Nullable
public static ConfiguredPrefix getPrefix(String identifier) { public static ConfiguredPrefix getPrefix(String identifier) {
if (identifier == null || identifier.equalsIgnoreCase("default")) { if (identifier == null) {
return null;
} else if (identifier.equalsIgnoreCase("default")) {
return getDefaultPrefix(); return getDefaultPrefix();
} else { } else {
return getPrefixes().get(identifier); return getPrefixes().get(identifier);
@@ -6,11 +6,14 @@ import cc.carm.plugin.userprefix.model.ConfiguredPrefix;
import cc.carm.plugin.userprefix.nametag.UserNameTag; import cc.carm.plugin.userprefix.nametag.UserNameTag;
import cc.carm.plugin.userprefix.ui.PrefixSelectGUI; import cc.carm.plugin.userprefix.ui.PrefixSelectGUI;
import cc.carm.plugin.userprefix.util.MessageUtil; 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.model.user.User;
import net.luckperms.api.node.NodeType; import net.luckperms.api.node.NodeType;
import net.luckperms.api.node.types.MetaNode; import net.luckperms.api.node.types.MetaNode;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@@ -43,6 +46,7 @@ public class UserManager {
PrefixSelectGUI.removeOpening(player); PrefixSelectGUI.removeOpening(player);
UserManager.unloadNameTag(player.getUniqueId()); UserManager.unloadNameTag(player.getUniqueId());
UserManager.checkingPlayers.remove(player.getUniqueId()); UserManager.checkingPlayers.remove(player.getUniqueId());
GUI.removeOpenedGUI(player); // 清空打开过的GUI缓存 (用于记录物品点击的
} }
/** /**
@@ -73,11 +77,9 @@ public class UserManager {
if (loadOthers) { if (loadOthers) {
ConfiguredPrefix onlinePlayerPrefix = UserManager.getPrefix(onlinePlayer); ConfiguredPrefix onlinePlayerPrefix = UserManager.getPrefix(onlinePlayer);
if (onlinePlayerPrefix != null) { tag.setPrefix(onlinePlayer, onlinePlayerPrefix.getContent());
tag.setPrefix(onlinePlayer, onlinePlayerPrefix.getContent()); tag.setOrder(onlinePlayer, onlinePlayerPrefix.getWeight());
tag.setOrder(onlinePlayer, onlinePlayerPrefix.getWeight()); Main.debug("为玩家 " + player.getName() + " 设置了 " + onlinePlayer.getName() + "的前缀为 #" + onlinePlayerPrefix.getWeight() + " " + onlinePlayerPrefix.getName());
Main.debug("为玩家 " + player.getName() + " 设置了 " + onlinePlayer.getName() + "的前缀为 #" + onlinePlayerPrefix.getWeight() + " " + onlinePlayerPrefix.getName());
}
} }
} }
} }
@@ -89,7 +91,13 @@ public class UserManager {
* @param updateView 是否更新头顶与TabList中的前缀 * @param updateView 是否更新头顶与TabList中的前缀
*/ */
public static void checkPrefix(Player player, boolean updateView) { public static void checkPrefix(Player player, boolean updateView) {
if (checkingPlayers.contains(player.getUniqueId())) return; if (checkingPlayers.contains(player.getUniqueId())) {
/*
* 这里为了避免极短时间内的重复触发导致多次判断且结果相同误导玩家,
* 故没有采用同步锁,而是采用添加到一个临时Set中,对Set中玩家跳过判断。
*/
return;
}
checkingPlayers.add(player.getUniqueId()); checkingPlayers.add(player.getUniqueId());
String currentPrefixIdentifier = UserManager.getPrefixData(player); String currentPrefixIdentifier = UserManager.getPrefixData(player);
ConfiguredPrefix currentPrefix = PrefixManager.getPrefix(currentPrefixIdentifier); ConfiguredPrefix currentPrefix = PrefixManager.getPrefix(currentPrefixIdentifier);
@@ -119,12 +127,14 @@ public class UserManager {
* @param player 玩家 * @param player 玩家
* @return 前缀配置 * @return 前缀配置
*/ */
@NotNull
public static ConfiguredPrefix getPrefix(Player player) { public static ConfiguredPrefix getPrefix(Player player) {
String identifier = getPrefixData(player); String identifier = getPrefixData(player);
if (identifier == null || !isPrefixUsable(player, identifier)) { if (identifier == null || !isPrefixUsable(player, identifier)) {
return getHighestPrefix(player); return getHighestPrefix(player);
} else { } else {
return PrefixManager.getPrefix(identifier); ConfiguredPrefix prefix = PrefixManager.getPrefix(identifier);
return prefix == null ? PrefixManager.getDefaultPrefix() : prefix;
} }
} }
@@ -146,11 +156,12 @@ public class UserManager {
* @param player 玩家 * @param player 玩家
* @return 可用前缀列表 * @return 可用前缀列表
*/ */
@NotNull
public static List<ConfiguredPrefix> getUsablePrefixes(Player player) { public static List<ConfiguredPrefix> getUsablePrefixes(Player player) {
return PrefixManager.getPrefixes().values().stream() return PrefixManager.getPrefixes().values().stream()
.filter(configuredPrefix -> isPrefixUsable(player, configuredPrefix)) .filter(configuredPrefix -> isPrefixUsable(player, configuredPrefix)) //过滤出玩家可用的前缀
.sorted(Comparator.comparingInt(ConfiguredPrefix::getWeight)) .sorted(Comparator.comparingInt(ConfiguredPrefix::getWeight)) // 以前缀排序
.collect(Collectors.toList()); .collect(Collectors.toList()); // 返回集合
} }
@@ -161,13 +172,15 @@ public class UserManager {
* @param player 玩家 * @param player 玩家
* @return 权限内容 * @return 权限内容
*/ */
@NotNull
public static ConfiguredPrefix getHighestPrefix(Player player) { public static ConfiguredPrefix getHighestPrefix(Player player) {
if (PrefixConfig.Functions.AUTO_USE.get()) { if (PrefixConfig.Functions.AUTO_USE.get()) {
// 关闭了自动选择,就直接给默认的前缀,让玩家自己去设置吧 // 关闭了自动选择,就直接给默认的前缀,让玩家自己去设置吧~
return PrefixManager.getDefaultPrefix(); return PrefixManager.getDefaultPrefix();
} }
List<ConfiguredPrefix> prefixes = getUsablePrefixes(player); return getUsablePrefixes(player).stream()
return prefixes.stream().max(Comparator.comparingInt(ConfiguredPrefix::getWeight)).orElseGet(PrefixManager::getDefaultPrefix); .max(Comparator.comparingInt(ConfiguredPrefix::getWeight)) // 取权重最大
.orElseGet(PrefixManager::getDefaultPrefix); // 啥都没有? 返回默认前缀。
} }
/** /**
@@ -192,7 +205,8 @@ public class UserManager {
* @return 若前缀标识不存在,则返回false;若前缀为默认前缀,或该前缀无权限,或玩家有该前缀的权限,则返回true。 * @return 若前缀标识不存在,则返回false;若前缀为默认前缀,或该前缀无权限,或玩家有该前缀的权限,则返回true。
*/ */
public static boolean isPrefixUsable(Player player, ConfiguredPrefix configuredPrefix) { public static boolean isPrefixUsable(Player player, ConfiguredPrefix configuredPrefix) {
return configuredPrefix.getPermission() == null || ServiceManager.hasPermission(ServiceManager.getUser(player), configuredPrefix.getPermission()); return configuredPrefix.getPermission() == null //为null的话说明无需权限了
|| ServiceManager.hasPermission(ServiceManager.getUser(player), configuredPrefix.getPermission());
} }
/** /**
@@ -202,8 +216,11 @@ public class UserManager {
* @param player 玩家 * @param player 玩家
* @return 正在使用的前缀Identifier(若不存在则返回null) * @return 正在使用的前缀Identifier(若不存在则返回null)
*/ */
@Nullable
public static String getPrefixData(Player player) { public static String getPrefixData(Player player) {
return ServiceManager.getAPI().getMetaData(player).getMetaValue("userprefix", String::valueOf).orElse(null); return ServiceManager.getAPI().getMetaData(player)
.getMetaValue("userprefix", String::valueOf)
.orElse(null);
} }
/** /**
@@ -215,11 +232,11 @@ public class UserManager {
*/ */
public static void setPrefixData(Player player, String prefixIdentifier) { public static void setPrefixData(Player player, String prefixIdentifier) {
User user = ServiceManager.getUser(player); User user = ServiceManager.getUser(player);
clearPrefixData(player); clearPrefixData(player); // 清除掉旧的数据,LuckPerms不会去覆盖一个Meta,需要手动清除。
// LuckPerms竟然会把所有的metaKey全部转换为小写... 那我这里就直接写成小写吧~ if (prefixIdentifier != null) {
MetaNode node = MetaNode.builder("userprefix", prefixIdentifier).build(); user.data().add(MetaNode.builder("userprefix", prefixIdentifier).build());
user.data().add(node); ServiceManager.getService().getUserManager().saveUser(user); // 保存数据
ServiceManager.getService().getUserManager().saveUser(user); }
} }
/** /**
@@ -6,11 +6,11 @@ import org.bukkit.enchantments.Enchantment;
import org.bukkit.inventory.ItemFlag; import org.bukkit.inventory.ItemFlag;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.inventory.meta.SkullMeta; import org.jetbrains.annotations.NotNull;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
public class ItemStackFactory { public class ItemStackFactory {
ItemStack item; ItemStack item;
@@ -57,75 +57,83 @@ public class ItemStackFactory {
return this; return this;
} }
public ItemStackFactory setDisplayName(String name) { public ItemStackFactory setDisplayName(@NotNull String name) {
ItemMeta im = this.item.getItemMeta(); ItemMeta im = this.item.getItemMeta();
im.setDisplayName(name.replace("&", "§").replace("§§", "&&")); if (im != null) {
this.item.setItemMeta(im); im.setDisplayName(ColorParser.parseColor(name));
this.item.setItemMeta(im);
}
return this; return this;
} }
public ItemStackFactory setLore(List<String> lores) { public ItemStackFactory setLore(@NotNull List<String> loreList) {
ItemMeta im = this.item.getItemMeta(); ItemMeta im = this.item.getItemMeta();
List<String> lores_ = new ArrayList(); if (im != null) {
Iterator var4 = lores.iterator(); im.setLore(
loreList.stream()
.map(ColorParser::parseColor)
.collect(Collectors.toList())
);
this.item.setItemMeta(im);
}
return this;
}
while (var4.hasNext()) { public ItemStackFactory addLore(@NotNull String s) {
String lore = (String) var4.next(); ItemMeta im = this.item.getItemMeta();
lores_.add(lore.replace("&", "§").replace("§§", "&&")); if (im != null) {
List<String> lore = im.getLore() != null ? im.getLore() : new ArrayList<>();
lore.add(ColorParser.parseColor(s));
im.setLore(lore);
this.item.setItemMeta(im);
}
return this;
}
public ItemStackFactory addEnchant(@NotNull Enchantment enchant, int level, boolean ignoreLevelRestriction) {
ItemMeta im = this.item.getItemMeta();
if (im != null) {
im.addEnchant(enchant, level, ignoreLevelRestriction);
this.item.setItemMeta(im);
} }
im.setLore(lores_);
this.item.setItemMeta(im);
return this; return this;
} }
public ItemStackFactory addLore(String name) { public ItemStackFactory removeEnchant(@NotNull Enchantment enchant) {
ItemMeta im = this.item.getItemMeta(); ItemMeta im = this.item.getItemMeta();
Object lores; if (im != null) {
if (im.hasLore()) { im.removeEnchant(enchant);
lores = im.getLore(); this.item.setItemMeta(im);
} else { }
lores = new ArrayList(); return this;
}
public ItemStackFactory addFlag(@NotNull ItemFlag flag) {
ItemMeta im = this.item.getItemMeta();
if (im != null) {
im.addItemFlags(flag);
this.item.setItemMeta(im);
} }
((List) lores).add(name.replace("&", "§").replace("§§", "&&"));
im.setLore((List) lores);
this.item.setItemMeta(im);
return this; return this;
} }
public ItemStackFactory addEnchant(Enchantment ench, int level, boolean ignoreLevelRestriction) { public ItemStackFactory removeFlag(@NotNull ItemFlag flag) {
ItemMeta im = this.item.getItemMeta(); ItemMeta im = this.item.getItemMeta();
im.addEnchant(ench, level, ignoreLevelRestriction); if (im != null) {
this.item.setItemMeta(im); im.removeItemFlags(flag);
return this; this.item.setItemMeta(im);
} }
public ItemStackFactory removeEnchant(Enchantment ench) {
ItemMeta im = this.item.getItemMeta();
im.removeEnchant(ench);
this.item.setItemMeta(im);
return this;
}
public ItemStackFactory addFlag(ItemFlag flag) {
ItemMeta im = this.item.getItemMeta();
im.addItemFlags(new ItemFlag[]{flag});
this.item.setItemMeta(im);
return this;
}
public ItemStackFactory removeFlag(ItemFlag flag) {
ItemMeta im = this.item.getItemMeta();
im.removeItemFlags(new ItemFlag[]{flag});
this.item.setItemMeta(im);
return this; return this;
} }
public ItemStackFactory setUnbreakable(boolean unbreakable) { public ItemStackFactory setUnbreakable(boolean unbreakable) {
ItemMeta im = this.item.getItemMeta(); ItemMeta im = this.item.getItemMeta();
im.setUnbreakable(unbreakable); if (im != null) {
this.item.setItemMeta(im); im.setUnbreakable(unbreakable);
this.item.setItemMeta(im);
}
return this; return this;
} }
} }
@@ -12,7 +12,6 @@ import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryCloseEvent; import org.bukkit.event.inventory.InventoryCloseEvent;
import org.bukkit.event.inventory.InventoryDragEvent; import org.bukkit.event.inventory.InventoryDragEvent;
import org.bukkit.event.inventory.InventoryType;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
@@ -60,47 +59,6 @@ public class GUI {
case SIXBYNINE: case SIXBYNINE:
this.items = new GUIItem[54]; this.items = new GUIItem[54];
break; break;
case HOPPER:
this.items = new GUIItem[InventoryType.HOPPER.getDefaultSize()];
break;
case BEACON:
this.items = new GUIItem[InventoryType.BEACON.getDefaultSize()];
break;
case DISPENSER:
this.items = new GUIItem[InventoryType.DISPENSER.getDefaultSize()];
break;
case DROPPER:
this.items = new GUIItem[InventoryType.DROPPER.getDefaultSize()];
break;
case FURNACE:
this.items = new GUIItem[InventoryType.FURNACE.getDefaultSize()];
break;
case WORKBENCH:
this.items = new GUIItem[InventoryType.WORKBENCH.getDefaultSize()];
break;
case CRAFTING:
this.items = new GUIItem[InventoryType.CRAFTING.getDefaultSize()];
break;
case ENCHANTING:
this.items = new GUIItem[InventoryType.ENCHANTING.getDefaultSize()];
break;
case BREWING:
this.items = new GUIItem[InventoryType.BREWING.getDefaultSize()];
break;
case PLAYER:
this.items = new GUIItem[InventoryType.PLAYER.getDefaultSize()];
break;
case MERCHANT:
this.items = new GUIItem[InventoryType.MERCHANT.getDefaultSize()];
break;
case ENDER_CHEST:
this.items = new GUIItem[InventoryType.ENDER_CHEST.getDefaultSize()];
break;
case CREATIVE:
this.items = new GUIItem[InventoryType.CREATIVE.getDefaultSize()];
break;
case CANCEL: case CANCEL:
this.items = null; this.items = null;
} }
@@ -219,45 +177,6 @@ public class GUI {
case SIXBYNINE: case SIXBYNINE:
inv = Bukkit.createInventory(null, this.items.length, this.name); inv = Bukkit.createInventory(null, this.items.length, this.name);
break; break;
case HOPPER:
inv = Bukkit.createInventory(null, InventoryType.HOPPER, this.name);
break;
case BEACON:
inv = Bukkit.createInventory(null, InventoryType.BEACON, this.name);
break;
case DISPENSER:
inv = Bukkit.createInventory(null, InventoryType.DISPENSER, this.name);
break;
case DROPPER:
inv = Bukkit.createInventory(null, InventoryType.DROPPER, this.name);
break;
case FURNACE:
inv = Bukkit.createInventory(null, InventoryType.FURNACE, this.name);
break;
case WORKBENCH:
inv = Bukkit.createInventory(null, InventoryType.WORKBENCH, this.name);
break;
case CRAFTING:
inv = Bukkit.createInventory(null, InventoryType.CRAFTING, this.name);
break;
case ENCHANTING:
inv = Bukkit.createInventory(null, InventoryType.ENCHANTING, this.name);
break;
case BREWING:
inv = Bukkit.createInventory(null, InventoryType.BREWING, this.name);
break;
case PLAYER:
inv = Bukkit.createInventory(null, InventoryType.PLAYER, this.name);
break;
case CREATIVE:
inv = Bukkit.createInventory(null, InventoryType.CREATIVE, this.name);
break;
case MERCHANT:
inv = Bukkit.createInventory(null, InventoryType.MERCHANT, this.name);
break;
case ENDER_CHEST:
inv = Bukkit.createInventory(null, InventoryType.ENDER_CHEST, this.name);
break;
} }
for (int index = 0; index < this.items.length; index++) { for (int index = 0; index < this.items.length; index++) {
@@ -299,7 +218,6 @@ public class GUI {
if (event.getSlot() != -999 && GUI.this.items[event.getSlot()] != null) { if (event.getSlot() != -999 && GUI.this.items[event.getSlot()] != null) {
if (GUI.this.items[event.getSlot()].isActionActive()) { if (GUI.this.items[event.getSlot()].isActionActive()) {
GUI.this.items[event.getSlot()].onClick(event.getClick()); GUI.this.items[event.getSlot()].onClick(event.getClick());
GUI.this.items[event.getSlot()].ClickAction(event.getClick(), player);
GUI.this.items[event.getSlot()].rawClickAction(event); GUI.this.items[event.getSlot()].rawClickAction(event);
if (!GUI.this.items[event.getSlot()].actions.isEmpty()) { if (!GUI.this.items[event.getSlot()].actions.isEmpty()) {
for (GUIItem.GUIClickAction action : GUI.this.items[event.getSlot()].actions) { for (GUIItem.GUIClickAction action : GUI.this.items[event.getSlot()].actions) {
@@ -36,17 +36,6 @@ public class GUIItem {
actionActive = b; actionActive = b;
} }
/**
* 玩家点击GUI后执行的代码
*
* @param type 点击的类型
* @param player 点击GUI的玩家
*/
@Deprecated
public void ClickAction(ClickType type, Player player) {
}
/** /**
* 玩家点击GUI后执行的代码 * 玩家点击GUI后执行的代码
* *
@@ -11,20 +11,6 @@ public enum GUIType {
FOURBYNINE, FOURBYNINE,
FIVEBYNINE, FIVEBYNINE,
SIXBYNINE, SIXBYNINE,
DISPENSER,
DROPPER,
FURNACE,
WORKBENCH,
CRAFTING,
ENCHANTING,
BREWING,
PLAYER,
CREATIVE,
MERCHANT,
ENDER_CHEST,
BEACON,
HOPPER,
UNKNOWN,
CANCEL; CANCEL;
} }