diff --git a/pom.xml b/pom.xml
index 215a650..0b50048 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
cc.carm.plugin
UserPrefix
- 1.2.0-SNAPSHOT
+ 1.2.1-SNAPSHOT
8
diff --git a/src/main/java/cc/carm/plugin/userprefix/manager/PrefixManager.java b/src/main/java/cc/carm/plugin/userprefix/manager/PrefixManager.java
index 95c8460..d1dec5e 100644
--- a/src/main/java/cc/carm/plugin/userprefix/manager/PrefixManager.java
+++ b/src/main/java/cc/carm/plugin/userprefix/manager/PrefixManager.java
@@ -8,6 +8,8 @@ import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.inventory.ItemFlag;
import org.bukkit.inventory.ItemStack;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
import java.util.Comparator;
import java.util.HashMap;
@@ -113,16 +115,21 @@ public class PrefixManager {
.collect(Collectors.toList());
}
+ @NotNull
public static ConfiguredPrefix getDefaultPrefix() {
return defaultPrefix;
}
+ @NotNull
public static HashMap getPrefixes() {
return prefixes;
}
+ @Nullable
public static ConfiguredPrefix getPrefix(String identifier) {
- if (identifier == null || identifier.equalsIgnoreCase("default")) {
+ if (identifier == null) {
+ return null;
+ } else if (identifier.equalsIgnoreCase("default")) {
return getDefaultPrefix();
} else {
return getPrefixes().get(identifier);
diff --git a/src/main/java/cc/carm/plugin/userprefix/manager/UserManager.java b/src/main/java/cc/carm/plugin/userprefix/manager/UserManager.java
index a0296d6..7c744e1 100644
--- a/src/main/java/cc/carm/plugin/userprefix/manager/UserManager.java
+++ b/src/main/java/cc/carm/plugin/userprefix/manager/UserManager.java
@@ -6,11 +6,14 @@ import cc.carm.plugin.userprefix.model.ConfiguredPrefix;
import cc.carm.plugin.userprefix.nametag.UserNameTag;
import cc.carm.plugin.userprefix.ui.PrefixSelectGUI;
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.node.NodeType;
import net.luckperms.api.node.types.MetaNode;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
import java.util.*;
import java.util.stream.Collectors;
@@ -43,6 +46,7 @@ public class UserManager {
PrefixSelectGUI.removeOpening(player);
UserManager.unloadNameTag(player.getUniqueId());
UserManager.checkingPlayers.remove(player.getUniqueId());
+ GUI.removeOpenedGUI(player); // 清空打开过的GUI缓存 (用于记录物品点击的
}
/**
@@ -73,11 +77,9 @@ public class UserManager {
if (loadOthers) {
ConfiguredPrefix onlinePlayerPrefix = UserManager.getPrefix(onlinePlayer);
- if (onlinePlayerPrefix != null) {
- tag.setPrefix(onlinePlayer, onlinePlayerPrefix.getContent());
- tag.setOrder(onlinePlayer, onlinePlayerPrefix.getWeight());
- Main.debug("为玩家 " + player.getName() + " 设置了 " + onlinePlayer.getName() + "的前缀为 #" + onlinePlayerPrefix.getWeight() + " " + onlinePlayerPrefix.getName());
- }
+ tag.setPrefix(onlinePlayer, onlinePlayerPrefix.getContent());
+ tag.setOrder(onlinePlayer, onlinePlayerPrefix.getWeight());
+ Main.debug("为玩家 " + player.getName() + " 设置了 " + onlinePlayer.getName() + "的前缀为 #" + onlinePlayerPrefix.getWeight() + " " + onlinePlayerPrefix.getName());
}
}
}
@@ -89,7 +91,13 @@ public class UserManager {
* @param updateView 是否更新头顶与TabList中的前缀
*/
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());
String currentPrefixIdentifier = UserManager.getPrefixData(player);
ConfiguredPrefix currentPrefix = PrefixManager.getPrefix(currentPrefixIdentifier);
@@ -119,12 +127,14 @@ public class UserManager {
* @param player 玩家
* @return 前缀配置
*/
+ @NotNull
public static ConfiguredPrefix getPrefix(Player player) {
String identifier = getPrefixData(player);
if (identifier == null || !isPrefixUsable(player, identifier)) {
return getHighestPrefix(player);
} 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 玩家
* @return 可用前缀列表
*/
+ @NotNull
public static List getUsablePrefixes(Player player) {
return PrefixManager.getPrefixes().values().stream()
- .filter(configuredPrefix -> isPrefixUsable(player, configuredPrefix))
- .sorted(Comparator.comparingInt(ConfiguredPrefix::getWeight))
- .collect(Collectors.toList());
+ .filter(configuredPrefix -> isPrefixUsable(player, configuredPrefix)) //过滤出玩家可用的前缀
+ .sorted(Comparator.comparingInt(ConfiguredPrefix::getWeight)) // 以前缀排序
+ .collect(Collectors.toList()); // 返回集合
}
@@ -161,13 +172,15 @@ public class UserManager {
* @param player 玩家
* @return 权限内容
*/
+ @NotNull
public static ConfiguredPrefix getHighestPrefix(Player player) {
if (PrefixConfig.Functions.AUTO_USE.get()) {
- // 关闭了自动选择,就直接给默认的前缀,让玩家自己去设置吧
+ // 关闭了自动选择,就直接给默认的前缀,让玩家自己去设置吧~
return PrefixManager.getDefaultPrefix();
}
- List prefixes = getUsablePrefixes(player);
- return prefixes.stream().max(Comparator.comparingInt(ConfiguredPrefix::getWeight)).orElseGet(PrefixManager::getDefaultPrefix);
+ return getUsablePrefixes(player).stream()
+ .max(Comparator.comparingInt(ConfiguredPrefix::getWeight)) // 取权重最大
+ .orElseGet(PrefixManager::getDefaultPrefix); // 啥都没有? 返回默认前缀。
}
/**
@@ -192,7 +205,8 @@ public class UserManager {
* @return 若前缀标识不存在,则返回false;若前缀为默认前缀,或该前缀无权限,或玩家有该前缀的权限,则返回true。
*/
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 玩家
* @return 正在使用的前缀Identifier(若不存在则返回null)
*/
+ @Nullable
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) {
User user = ServiceManager.getUser(player);
- clearPrefixData(player);
- // LuckPerms竟然会把所有的metaKey全部转换为小写... 那我这里就直接写成小写吧~
- MetaNode node = MetaNode.builder("userprefix", prefixIdentifier).build();
- user.data().add(node);
- ServiceManager.getService().getUserManager().saveUser(user);
+ clearPrefixData(player); // 清除掉旧的数据,LuckPerms不会去覆盖一个Meta,需要手动清除。
+ if (prefixIdentifier != null) {
+ user.data().add(MetaNode.builder("userprefix", prefixIdentifier).build());
+ ServiceManager.getService().getUserManager().saveUser(user); // 保存数据
+ }
}
/**
diff --git a/src/main/java/cc/carm/plugin/userprefix/util/ItemStackFactory.java b/src/main/java/cc/carm/plugin/userprefix/util/ItemStackFactory.java
index 3e47b80..dc6f9fd 100644
--- a/src/main/java/cc/carm/plugin/userprefix/util/ItemStackFactory.java
+++ b/src/main/java/cc/carm/plugin/userprefix/util/ItemStackFactory.java
@@ -6,11 +6,11 @@ import org.bukkit.enchantments.Enchantment;
import org.bukkit.inventory.ItemFlag;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
-import org.bukkit.inventory.meta.SkullMeta;
+import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
-import java.util.Iterator;
import java.util.List;
+import java.util.stream.Collectors;
public class ItemStackFactory {
ItemStack item;
@@ -57,75 +57,83 @@ public class ItemStackFactory {
return this;
}
- public ItemStackFactory setDisplayName(String name) {
+ public ItemStackFactory setDisplayName(@NotNull String name) {
ItemMeta im = this.item.getItemMeta();
- im.setDisplayName(name.replace("&", "§").replace("§§", "&&"));
- this.item.setItemMeta(im);
+ if (im != null) {
+ im.setDisplayName(ColorParser.parseColor(name));
+ this.item.setItemMeta(im);
+ }
return this;
}
- public ItemStackFactory setLore(List lores) {
+ public ItemStackFactory setLore(@NotNull List loreList) {
ItemMeta im = this.item.getItemMeta();
- List lores_ = new ArrayList();
- Iterator var4 = lores.iterator();
+ if (im != null) {
+ im.setLore(
+ loreList.stream()
+ .map(ColorParser::parseColor)
+ .collect(Collectors.toList())
+ );
+ this.item.setItemMeta(im);
+ }
+ return this;
+ }
- while (var4.hasNext()) {
- String lore = (String) var4.next();
- lores_.add(lore.replace("&", "§").replace("§§", "&&"));
+ public ItemStackFactory addLore(@NotNull String s) {
+ ItemMeta im = this.item.getItemMeta();
+ if (im != null) {
+ List 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;
}
- public ItemStackFactory addLore(String name) {
+ public ItemStackFactory removeEnchant(@NotNull Enchantment enchant) {
ItemMeta im = this.item.getItemMeta();
- Object lores;
- if (im.hasLore()) {
- lores = im.getLore();
- } else {
- lores = new ArrayList();
+ if (im != null) {
+ im.removeEnchant(enchant);
+ this.item.setItemMeta(im);
+ }
+ 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;
}
- public ItemStackFactory addEnchant(Enchantment ench, int level, boolean ignoreLevelRestriction) {
+ public ItemStackFactory removeFlag(@NotNull ItemFlag flag) {
ItemMeta im = this.item.getItemMeta();
- im.addEnchant(ench, level, ignoreLevelRestriction);
- this.item.setItemMeta(im);
- return this;
- }
-
- 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);
+ if (im != null) {
+ im.removeItemFlags(flag);
+ this.item.setItemMeta(im);
+ }
return this;
}
public ItemStackFactory setUnbreakable(boolean unbreakable) {
ItemMeta im = this.item.getItemMeta();
- im.setUnbreakable(unbreakable);
- this.item.setItemMeta(im);
+ if (im != null) {
+ im.setUnbreakable(unbreakable);
+ this.item.setItemMeta(im);
+ }
return this;
}
}
diff --git a/src/main/java/cc/carm/plugin/userprefix/util/gui/GUI.java b/src/main/java/cc/carm/plugin/userprefix/util/gui/GUI.java
index 90a1601..524faf1 100644
--- a/src/main/java/cc/carm/plugin/userprefix/util/gui/GUI.java
+++ b/src/main/java/cc/carm/plugin/userprefix/util/gui/GUI.java
@@ -12,7 +12,6 @@ import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryCloseEvent;
import org.bukkit.event.inventory.InventoryDragEvent;
-import org.bukkit.event.inventory.InventoryType;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
@@ -60,47 +59,6 @@ public class GUI {
case SIXBYNINE:
this.items = new GUIItem[54];
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:
this.items = null;
}
@@ -219,45 +177,6 @@ public class GUI {
case SIXBYNINE:
inv = Bukkit.createInventory(null, this.items.length, this.name);
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++) {
@@ -299,7 +218,6 @@ public class GUI {
if (event.getSlot() != -999 && GUI.this.items[event.getSlot()] != null) {
if (GUI.this.items[event.getSlot()].isActionActive()) {
GUI.this.items[event.getSlot()].onClick(event.getClick());
- GUI.this.items[event.getSlot()].ClickAction(event.getClick(), player);
GUI.this.items[event.getSlot()].rawClickAction(event);
if (!GUI.this.items[event.getSlot()].actions.isEmpty()) {
for (GUIItem.GUIClickAction action : GUI.this.items[event.getSlot()].actions) {
diff --git a/src/main/java/cc/carm/plugin/userprefix/util/gui/GUIItem.java b/src/main/java/cc/carm/plugin/userprefix/util/gui/GUIItem.java
index ea60de3..200a0a2 100644
--- a/src/main/java/cc/carm/plugin/userprefix/util/gui/GUIItem.java
+++ b/src/main/java/cc/carm/plugin/userprefix/util/gui/GUIItem.java
@@ -36,17 +36,6 @@ public class GUIItem {
actionActive = b;
}
- /**
- * 玩家点击GUI后执行的代码
- *
- * @param type 点击的类型
- * @param player 点击GUI的玩家
- */
- @Deprecated
- public void ClickAction(ClickType type, Player player) {
-
- }
-
/**
* 玩家点击GUI后执行的代码
*
diff --git a/src/main/java/cc/carm/plugin/userprefix/util/gui/GUIType.java b/src/main/java/cc/carm/plugin/userprefix/util/gui/GUIType.java
index 9ed6de9..fee7e87 100644
--- a/src/main/java/cc/carm/plugin/userprefix/util/gui/GUIType.java
+++ b/src/main/java/cc/carm/plugin/userprefix/util/gui/GUIType.java
@@ -11,20 +11,6 @@ public enum GUIType {
FOURBYNINE,
FIVEBYNINE,
SIXBYNINE,
- DISPENSER,
- DROPPER,
- FURNACE,
- WORKBENCH,
- CRAFTING,
- ENCHANTING,
- BREWING,
- PLAYER,
- CREATIVE,
- MERCHANT,
- ENDER_CHEST,
- BEACON,
- HOPPER,
- UNKNOWN,
CANCEL;
}