diff --git a/pom.xml b/pom.xml index aef509e..3bf8ca6 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ cn.lunadeer EssentialsD - 2.3.0 + 2.3.1 jar EssentialsD diff --git a/src/main/java/cn/lunadeer/essentialsd/managers/TabListUpdater.java b/src/main/java/cn/lunadeer/essentialsd/managers/TabListUpdater.java index 05552a7..ce7fd95 100644 --- a/src/main/java/cn/lunadeer/essentialsd/managers/TabListUpdater.java +++ b/src/main/java/cn/lunadeer/essentialsd/managers/TabListUpdater.java @@ -6,6 +6,11 @@ import me.clip.placeholderapi.PlaceholderAPI; import org.bukkit.Bukkit; import org.bukkit.entity.Player; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + public class TabListUpdater { public static TabListUpdater instance; @@ -16,9 +21,47 @@ public class TabListUpdater { } private void update() { - for (Player player : Bukkit.getOnlinePlayers()) { + Collection players = Bukkit.getOnlinePlayers(); + Map formatedNames = new HashMap<>(); + + int longestFormatedStringLength = 0; + + for (Player player : players) { String formated = PlaceholderAPI.setPlaceholders(player, EssentialsD.config.getPrefixTabFormat()); - player.setPlayerListName(formated); + if (length(formated) > longestFormatedStringLength) { + longestFormatedStringLength = length(formated); + } + formatedNames.put(player.getUniqueId(), formated); + } + // 将会被替换为填充空格 " " 用于保证长度一致 + for (Player player : players) { + String formated = formatedNames.get(player.getUniqueId()); + int formatedLength = length(formated); + int spaceLength = longestFormatedStringLength - formatedLength; + StringBuilder space = new StringBuilder(); + for (int i = 0; i < spaceLength; i++) { + space.append(" "); + } + player.setPlayerListName(formated.replace("", space.toString())); } } + + private static int length(String value) { + int valueLength = 0; + String chinese = "[\u0391-\uFFE5]"; + /* 获取字段值的长度,如果含中文字符,则每个中文字符长度为2,否则为1 */ + for (int i = 0; i < value.length(); i++) { + /* 获取一个字符 */ + String temp = value.substring(i, i + 1); + /* 判断是否为中文字符 */ + if (temp.matches(chinese)) { + /* 中文字符长度为2 */ + valueLength += 2; + } else { + /* 其他字符长度为1 */ + valueLength += 1; + } + } + return valueLength; + } }