Skip to content

Commit

Permalink
Fix anti-override on Velocity and Sponge no longer working after play…
Browse files Browse the repository at this point in the history
…ers are removed & added back to the tablist by another plugin
  • Loading branch information
NEZNAMY committed Jan 16, 2024
1 parent e198a5d commit 53870b2
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 28 deletions.
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -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<TabListEntry, Text> expectedDisplayNames = new WeakHashMap<>();
private final Map<TabPlayer, Text> expectedDisplayNames = new WeakHashMap<>();

@Override
public void removeEntry(@NotNull UUID entry) {
Expand All @@ -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);
});
}

Expand Down Expand Up @@ -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
Expand All @@ -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);
}
}
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -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<TabListEntry, Component> expectedDisplayNames = new WeakHashMap<>();
private final Map<TabPlayer, Component> expectedDisplayNames = new WeakHashMap<>();

@Override
public void removeEntry(@NotNull UUID entry) {
Expand All @@ -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);
});
}

Expand Down Expand Up @@ -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
Expand All @@ -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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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<TabListEntry, Component> expectedDisplayNames = new WeakHashMap<>();
private final Map<TabPlayer, Component> expectedDisplayNames = new WeakHashMap<>();

@Override
public void removeEntry(@NotNull UUID entry) {
Expand All @@ -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);
Expand Down Expand Up @@ -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
Expand All @@ -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);
}
}

0 comments on commit 53870b2

Please sign in to comment.