diff --git a/sponge7/src/main/java/me/neznamy/tab/platforms/sponge7/SpongeTabList.java b/sponge7/src/main/java/me/neznamy/tab/platforms/sponge7/SpongeTabList.java index 4f2a464e9..9c82cd63f 100644 --- a/sponge7/src/main/java/me/neznamy/tab/platforms/sponge7/SpongeTabList.java +++ b/sponge7/src/main/java/me/neznamy/tab/platforms/sponge7/SpongeTabList.java @@ -1,8 +1,10 @@ package me.neznamy.tab.platforms.sponge7; import lombok.RequiredArgsConstructor; +import me.neznamy.tab.shared.TAB; import me.neznamy.tab.shared.chat.IChatBaseComponent; import me.neznamy.tab.shared.platform.TabList; +import me.neznamy.tab.shared.platform.TabPlayer; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.spongepowered.api.entity.living.player.gamemode.GameMode; @@ -32,7 +34,7 @@ public class SpongeTabList implements TabList { private final SpongeTabPlayer player; /** Expected names based on configuration, saving to restore them if another plugin overrides them */ - private final Map expectedDisplayNames = new WeakHashMap<>(); + private final Map expectedDisplayNames = new WeakHashMap<>(); @Override public void removeEntry(@NotNull UUID entry) { @@ -44,7 +46,7 @@ public void updateDisplayName(@NotNull UUID entry, @Nullable IChatBaseComponent player.getPlayer().getTabList().getEntry(entry).ifPresent(e -> { Text component = displayName == null ? null : Text.of(displayName.toLegacyText()); e.setDisplayName(component); - expectedDisplayNames.put(e, component); + setExpectedDisplayName(entry, component); }); } @@ -72,7 +74,7 @@ public void addEntry(@NotNull Entry entry) { .displayName(displayName) .build(); player.getPlayer().getTabList().addEntry(tabListEntry); - expectedDisplayNames.put(tabListEntry, displayName); + setExpectedDisplayName(entry.getUniqueId(), displayName); } @Override @@ -85,12 +87,19 @@ public void setPlayerListHeaderFooter(@NotNull IChatBaseComponent header, @NotNu @Override public void checkDisplayNames() { - for (TabListEntry entry : player.getPlayer().getTabList().getEntries()) { - Text expectedComponent = expectedDisplayNames.get(entry); - if (expectedComponent != null && entry.getDisplayName().orElse(null) != expectedComponent) { - displayNameWrong(entry.getProfile().getName().orElse(null), player); - entry.setDisplayName(expectedComponent); - } + for (TabPlayer target : TAB.getInstance().getOnlinePlayers()) { + player.getPlayer().getTabList().getEntry(target.getUniqueId()).ifPresent(entry -> { + Text expectedComponent = expectedDisplayNames.get(target); + if (expectedComponent != null && entry.getDisplayName().orElse(null) != expectedComponent) { + displayNameWrong(target.getName(), player); + entry.setDisplayName(expectedComponent); + } + }); } } + + private void setExpectedDisplayName(@NotNull UUID entry, @Nullable Text displayName) { + TabPlayer player = TAB.getInstance().getPlayerByTabListUUID(entry); + if (player != null) expectedDisplayNames.put(player, displayName); + } } diff --git a/sponge8/src/main/java/me/neznamy/tab/platforms/sponge8/SpongeTabList.java b/sponge8/src/main/java/me/neznamy/tab/platforms/sponge8/SpongeTabList.java index 332fecbe2..61a633ee2 100644 --- a/sponge8/src/main/java/me/neznamy/tab/platforms/sponge8/SpongeTabList.java +++ b/sponge8/src/main/java/me/neznamy/tab/platforms/sponge8/SpongeTabList.java @@ -1,9 +1,11 @@ package me.neznamy.tab.platforms.sponge8; import lombok.RequiredArgsConstructor; +import me.neznamy.tab.shared.TAB; import me.neznamy.tab.shared.chat.IChatBaseComponent; import me.neznamy.tab.shared.hook.AdventureHook; import me.neznamy.tab.shared.platform.TabList; +import me.neznamy.tab.shared.platform.TabPlayer; import net.kyori.adventure.text.Component; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -33,7 +35,7 @@ public class SpongeTabList implements TabList { private final SpongeTabPlayer player; /** Expected names based on configuration, saving to restore them if another plugin overrides them */ - private final Map expectedDisplayNames = new WeakHashMap<>(); + private final Map expectedDisplayNames = new WeakHashMap<>(); @Override public void removeEntry(@NotNull UUID entry) { @@ -45,7 +47,7 @@ public void updateDisplayName(@NotNull UUID entry, @Nullable IChatBaseComponent player.getPlayer().tabList().entry(entry).ifPresent(e -> { Component component = displayName == null ? null : AdventureHook.toAdventureComponent(displayName, player.getVersion()); e.setDisplayName(component); - expectedDisplayNames.put(e, component); + setExpectedDisplayName(entry, component); }); } @@ -73,7 +75,7 @@ public void addEntry(@NotNull Entry entry) { .displayName(displayName) .build(); player.getPlayer().tabList().addEntry(tabListEntry); - expectedDisplayNames.put(tabListEntry, displayName); + setExpectedDisplayName(entry.getUniqueId(), displayName); } @Override @@ -86,12 +88,19 @@ public void setPlayerListHeaderFooter(@NotNull IChatBaseComponent header, @NotNu @Override public void checkDisplayNames() { - for (TabListEntry entry : player.getPlayer().tabList().entries()) { - Component expectedComponent = expectedDisplayNames.get(entry); - if (expectedComponent != null && entry.displayName().orElse(null) != expectedComponent) { - displayNameWrong(entry.profile().name().orElse(null), player); - entry.setDisplayName(expectedComponent); - } + for (TabPlayer target : TAB.getInstance().getOnlinePlayers()) { + player.getPlayer().tabList().entry(target.getUniqueId()).ifPresent(entry -> { + Component expectedComponent = expectedDisplayNames.get(target); + if (expectedComponent != null && entry.displayName().orElse(null) != expectedComponent) { + displayNameWrong(target.getName(), player); + entry.setDisplayName(expectedComponent); + } + }); } } + + private void setExpectedDisplayName(@NotNull UUID entry, @Nullable Component displayName) { + TabPlayer player = TAB.getInstance().getPlayerByTabListUUID(entry); + if (player != null) expectedDisplayNames.put(player, displayName); + } } diff --git a/velocity/src/main/java/me/neznamy/tab/platforms/velocity/VelocityTabList.java b/velocity/src/main/java/me/neznamy/tab/platforms/velocity/VelocityTabList.java index 3792d49de..c5afed1d5 100644 --- a/velocity/src/main/java/me/neznamy/tab/platforms/velocity/VelocityTabList.java +++ b/velocity/src/main/java/me/neznamy/tab/platforms/velocity/VelocityTabList.java @@ -4,9 +4,11 @@ import com.velocitypowered.api.proxy.player.TabListEntry; import com.velocitypowered.api.util.GameProfile; import lombok.RequiredArgsConstructor; +import me.neznamy.tab.shared.TAB; import me.neznamy.tab.shared.chat.IChatBaseComponent; import me.neznamy.tab.shared.hook.AdventureHook; import me.neznamy.tab.shared.platform.TabList; +import me.neznamy.tab.shared.platform.TabPlayer; import net.kyori.adventure.text.Component; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -24,7 +26,7 @@ public class VelocityTabList implements TabList { @NotNull private final VelocityTabPlayer player; /** Expected names based on configuration, saving to restore them if another plugin overrides them */ - private final Map expectedDisplayNames = new WeakHashMap<>(); + private final Map expectedDisplayNames = new WeakHashMap<>(); @Override public void removeEntry(@NotNull UUID entry) { @@ -45,7 +47,7 @@ public void updateDisplayName(@NotNull UUID entry, @Nullable IChatBaseComponent if (player.getVersion().getMinorVersion() >= 8) { Component component = displayName == null ? null : AdventureHook.toAdventureComponent(displayName, player.getVersion()); e.setDisplayName(component); - expectedDisplayNames.put(e, component); + setExpectedDisplayName(entry, component); } else { String username = e.getProfile().getName(); removeEntry(entry); @@ -79,7 +81,7 @@ public void addEntry(@NotNull Entry entry) { .gameMode(entry.getGameMode()) .displayName(displayName) .build(); - expectedDisplayNames.put(e, displayName); + setExpectedDisplayName(entry.getUniqueId(), displayName); // Remove entry because: // #1 - If player is 1.8 - 1.19.2, KeyedVelocityTabList#addEntry will throw IllegalArgumentException @@ -102,17 +104,19 @@ public void setPlayerListHeaderFooter(@NotNull IChatBaseComponent header, @NotNu @Override public void checkDisplayNames() { - try { - for (TabListEntry entry : player.getPlayer().getTabList().getEntries()) { - Component expectedComponent = expectedDisplayNames.get(entry); + for (TabPlayer target : TAB.getInstance().getOnlinePlayers()) { + player.getPlayer().getTabList().getEntry(target.getUniqueId()).ifPresent(entry -> { + Component expectedComponent = expectedDisplayNames.get(target); if (expectedComponent != null && entry.getDisplayNameComponent().orElse(null) != expectedComponent) { displayNameWrong(entry.getProfile().getName(), player); entry.setDisplayName(expectedComponent); } - } - } catch (ConcurrentModificationException VelocityBug) { - // Error when copying collection (player joined/left in the meantime), retry - checkDisplayNames(); + }); } } + + private void setExpectedDisplayName(@NotNull UUID entry, @Nullable Component displayName) { + TabPlayer player = TAB.getInstance().getPlayerByTabListUUID(entry); + if (player != null) expectedDisplayNames.put(player, displayName); + } }