This commit is contained in:
William 2023-02-24 18:21:16 +00:00
parent 22972281e2
commit be1756fa9b
No known key found for this signature in database
2 changed files with 15 additions and 17 deletions

View File

@ -59,4 +59,8 @@ public final class TabPlayer implements Comparable<TabPlayer> {
return roleDifference; return roleDifference;
} }
@Override
public boolean equals(Object obj) {
return obj instanceof TabPlayer other && player.getUniqueId().equals(other.player.getUniqueId());
}
} }

View File

@ -11,25 +11,21 @@ import net.william278.velocitab.config.Placeholder;
import net.william278.velocitab.player.TabPlayer; import net.william278.velocitab.player.TabPlayer;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.ArrayList; import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
public class PlayerTabList { public class PlayerTabList {
private final Velocitab plugin; private final Velocitab plugin;
private ImmutableList<TabPlayer> players; private final ConcurrentLinkedQueue<TabPlayer> players;
public PlayerTabList(@NotNull Velocitab plugin) { public PlayerTabList(@NotNull Velocitab plugin) {
this.plugin = plugin; this.plugin = plugin;
this.players = ImmutableList.copyOf(plugin.getServer().getAllPlayers().stream() this.players = new ConcurrentLinkedQueue<>();
.map(plugin::getTabPlayer)
.toList());
} }
@SuppressWarnings("UnstableApiUsage") @SuppressWarnings("UnstableApiUsage")
@Subscribe @Subscribe
public void onPlayerJoin(@NotNull ServerPostConnectEvent event) { public void onPlayerJoin(@NotNull ServerPostConnectEvent event) {
final ArrayList<TabPlayer> players = new ArrayList<>(this.players);
// Remove the player from the tracking list if they are switching servers // Remove the player from the tracking list if they are switching servers
if (event.getPreviousServer() == null) { if (event.getPreviousServer() == null) {
players.removeIf(player -> player.getPlayer().getUniqueId().equals(event.getPlayer().getUniqueId())); players.removeIf(player -> player.getPlayer().getUniqueId().equals(event.getPlayer().getUniqueId()));
@ -37,7 +33,6 @@ public class PlayerTabList {
// Add the player to the tracking list // Add the player to the tracking list
players.add(plugin.getTabPlayer(event.getPlayer())); players.add(plugin.getTabPlayer(event.getPlayer()));
this.players = ImmutableList.copyOf(players);
// Update the tab list of all players // Update the tab list of all players
plugin.getServer().getScheduler().buildTask(plugin, this::updateList) plugin.getServer().getScheduler().buildTask(plugin, this::updateList)
@ -48,9 +43,7 @@ public class PlayerTabList {
@Subscribe @Subscribe
public void onPlayerQuit(@NotNull DisconnectEvent event) { public void onPlayerQuit(@NotNull DisconnectEvent event) {
// Remove the player from the tracking list // Remove the player from the tracking list
this.players = ImmutableList.copyOf(this.players.stream() players.removeIf(player -> player.getPlayer().getUniqueId().equals(event.getPlayer().getUniqueId()));
.filter(player -> !player.getPlayer().getUniqueId().equals(event.getPlayer().getUniqueId()))
.toList());
// Remove the player from the tab list of all other players // Remove the player from the tab list of all other players
plugin.getServer().getAllPlayers().forEach(player -> player.getTabList().removeEntry(event.getPlayer().getUniqueId())); plugin.getServer().getAllPlayers().forEach(player -> player.getTabList().removeEntry(event.getPlayer().getUniqueId()));
@ -67,10 +60,10 @@ public class PlayerTabList {
public void updatePlayer(@NotNull TabPlayer tabPlayer) { public void updatePlayer(@NotNull TabPlayer tabPlayer) {
plugin.getServer().getScheduler() plugin.getServer().getScheduler()
.buildTask(plugin, () -> { .buildTask(plugin, () -> {
// Remove the existing player from the tracking list synchronized (this) {
this.players = ImmutableList.copyOf(this.players.stream() players.remove(tabPlayer);
.filter(player -> !player.getPlayer().getUniqueId().equals(tabPlayer.getPlayer().getUniqueId())) players.add(tabPlayer);
.toList()); }
// Update the player's team sorting // Update the player's team sorting
plugin.getScoreboardManager().setPlayerTeam(tabPlayer); plugin.getScoreboardManager().setPlayerTeam(tabPlayer);
@ -82,10 +75,11 @@ public class PlayerTabList {
} }
private void updateList() { private void updateList() {
this.players.forEach(player -> { final ImmutableList<TabPlayer> players = ImmutableList.copyOf(this.players);
players.forEach(player -> {
player.sendHeaderAndFooter(this); player.sendHeaderAndFooter(this);
player.getPlayer().getTabList().getEntries() player.getPlayer().getTabList().getEntries()
.forEach(entry -> this.players.stream() .forEach(entry -> players.stream()
.filter(p -> p.getPlayer().getGameProfile().getId().equals(entry.getProfile().getId())) .filter(p -> p.getPlayer().getGameProfile().getId().equals(entry.getProfile().getId()))
.findFirst().ifPresent(tabPlayer -> { .findFirst().ifPresent(tabPlayer -> {
entry.setDisplayName(tabPlayer.getDisplayName(plugin)); entry.setDisplayName(tabPlayer.getDisplayName(plugin));