forked from Upstream/Velocitab
Fix CME
This commit is contained in:
parent
22972281e2
commit
be1756fa9b
@ -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());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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));
|
||||||
|
Loading…
Reference in New Issue
Block a user