forked from Upstream/Velocitab
Sorting improvements
This commit is contained in:
parent
9593058684
commit
ea40814c71
@ -163,7 +163,7 @@ public record Group(
|
|||||||
return plugin.getTabList().getPlayers()
|
return plugin.getTabList().getPlayers()
|
||||||
.values()
|
.values()
|
||||||
.stream()
|
.stream()
|
||||||
.filter(tabPlayer -> tabPlayer.getGroup().equals(this))
|
.filter(tabPlayer -> tabPlayer.isLoaded() && tabPlayer.getGroup().equals(this))
|
||||||
.collect(Collectors.toSet());
|
.collect(Collectors.toSet());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -177,7 +177,7 @@ public record Group(
|
|||||||
return plugin.getTabList().getPlayers()
|
return plugin.getTabList().getPlayers()
|
||||||
.values()
|
.values()
|
||||||
.stream()
|
.stream()
|
||||||
.filter(player -> player.getGroup().equals(this) && player.getServerName().equals(tabPlayer.getServerName()))
|
.filter(player -> player.isLoaded() && player.getGroup().equals(this) && player.getServerName().equals(tabPlayer.getServerName()))
|
||||||
.collect(Collectors.toSet());
|
.collect(Collectors.toSet());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -120,7 +120,7 @@ public class LuckPermsHook extends Hook {
|
|||||||
tabList.getVanishTabList().recalculateVanishForPlayer(tabPlayer);
|
tabList.getVanishTabList().recalculateVanishForPlayer(tabPlayer);
|
||||||
checkRoleUpdate(tabPlayer, oldRole);
|
checkRoleUpdate(tabPlayer, oldRole);
|
||||||
})
|
})
|
||||||
.delay(500, TimeUnit.MILLISECONDS)
|
.delay(100, TimeUnit.MILLISECONDS)
|
||||||
.schedule());
|
.schedule());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -145,6 +145,7 @@ public class LuckPermsHook extends Hook {
|
|||||||
if (oldRole.equals(player.getRole())) {
|
if (oldRole.equals(player.getRole())) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
plugin.getTabList().updatePlayer(player, false);
|
plugin.getTabList().updatePlayer(player, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -41,6 +41,8 @@ import org.jetbrains.annotations.NotNull;
|
|||||||
import org.slf4j.event.Level;
|
import org.slf4j.event.Level;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
import java.util.concurrent.ExecutorService;
|
||||||
|
import java.util.concurrent.Executors;
|
||||||
|
|
||||||
import static com.velocitypowered.api.network.ProtocolVersion.*;
|
import static com.velocitypowered.api.network.ProtocolVersion.*;
|
||||||
|
|
||||||
@ -48,6 +50,7 @@ public class ScoreboardManager {
|
|||||||
|
|
||||||
private PacketRegistration<UpdateTeamsPacket> packetRegistration;
|
private PacketRegistration<UpdateTeamsPacket> packetRegistration;
|
||||||
private final Velocitab plugin;
|
private final Velocitab plugin;
|
||||||
|
private final ExecutorService executorService;
|
||||||
private final boolean teams;
|
private final boolean teams;
|
||||||
private final Map<ProtocolVersion, TeamsPacketAdapter> versions;
|
private final Map<ProtocolVersion, TeamsPacketAdapter> versions;
|
||||||
@Getter
|
@Getter
|
||||||
@ -64,8 +67,9 @@ public class ScoreboardManager {
|
|||||||
this.nametags = Maps.newConcurrentMap();
|
this.nametags = Maps.newConcurrentMap();
|
||||||
this.versions = Maps.newHashMap();
|
this.versions = Maps.newHashMap();
|
||||||
this.trackedTeams = Multimaps.synchronizedMultimap(Multimaps.newSetMultimap(Maps.newConcurrentMap(), Sets::newConcurrentHashSet));
|
this.trackedTeams = Multimaps.synchronizedMultimap(Multimaps.newSetMultimap(Maps.newConcurrentMap(), Sets::newConcurrentHashSet));
|
||||||
this.sortedTeams = new SortedSet(Comparator.reverseOrder());
|
this.sortedTeams = new SortedSet(Comparator.reverseOrder()); //Comparator.reverseOrder()
|
||||||
this.registerVersions();
|
this.registerVersions();
|
||||||
|
this.executorService = Executors.newFixedThreadPool(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean handleTeams() {
|
public boolean handleTeams() {
|
||||||
@ -389,8 +393,10 @@ public class ScoreboardManager {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
final ConnectedPlayer connectedPlayer = (ConnectedPlayer) player;
|
executorService.submit(() -> {
|
||||||
connectedPlayer.getConnection().write(packet);
|
final ConnectedPlayer connectedPlayer = (ConnectedPlayer) player;
|
||||||
|
connectedPlayer.getConnection().write(packet);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public void registerPacket() {
|
public void registerPacket() {
|
||||||
|
@ -76,7 +76,9 @@ public class PlaceholderManager {
|
|||||||
}
|
}
|
||||||
final Map<String, String> parsed = placeholders.computeIfAbsent(uuid, k -> Maps.newConcurrentMap());
|
final Map<String, String> parsed = placeholders.computeIfAbsent(uuid, k -> Maps.newConcurrentMap());
|
||||||
final TabPlayer tabPlayer = plugin.getTabList().getTabPlayer(player)
|
final TabPlayer tabPlayer = plugin.getTabList().getTabPlayer(player)
|
||||||
.orElse(new TabPlayer(plugin, player, Role.DEFAULT_ROLE, plugin.getTabList().getGroupOrDefault(player)));
|
.orElse(new TabPlayer(plugin, player,
|
||||||
|
plugin.getLuckPermsHook().map(hook -> hook.getPlayerRole(player)).orElse(Role.DEFAULT_ROLE),
|
||||||
|
plugin.getTabList().getGroupOrDefault(player)));
|
||||||
|
|
||||||
final List<String> placeholders = texts.stream()
|
final List<String> placeholders = texts.stream()
|
||||||
.map(PlaceholderManager::extractPlaceholders)
|
.map(PlaceholderManager::extractPlaceholders)
|
||||||
|
@ -65,7 +65,7 @@ public class Role implements Comparable<Role> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
protected String getWeightString() {
|
public String getWeightString() {
|
||||||
return Integer.toString(weight);
|
return Integer.toString(weight);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -51,7 +51,6 @@ public final class TabPlayer implements Comparable<TabPlayer> {
|
|||||||
// Each TabPlayer contains the components for each TabPlayer it's currently viewing this player
|
// Each TabPlayer contains the components for each TabPlayer it's currently viewing this player
|
||||||
private final Map<UUID, Component> relationalDisplayNames;
|
private final Map<UUID, Component> relationalDisplayNames;
|
||||||
private final Map<UUID, Component[]> relationalNametags;
|
private final Map<UUID, Component[]> relationalNametags;
|
||||||
private final Map<UUID, Integer> cachedListOrders;
|
|
||||||
private String lastDisplayName;
|
private String lastDisplayName;
|
||||||
private Component lastHeader;
|
private Component lastHeader;
|
||||||
private Component lastFooter;
|
private Component lastFooter;
|
||||||
@ -81,7 +80,6 @@ public final class TabPlayer implements Comparable<TabPlayer> {
|
|||||||
this.group = group;
|
this.group = group;
|
||||||
this.relationalDisplayNames = Maps.newConcurrentMap();
|
this.relationalDisplayNames = Maps.newConcurrentMap();
|
||||||
this.relationalNametags = Maps.newConcurrentMap();
|
this.relationalNametags = Maps.newConcurrentMap();
|
||||||
this.cachedListOrders = Maps.newConcurrentMap();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@ -183,10 +181,6 @@ public final class TabPlayer implements Comparable<TabPlayer> {
|
|||||||
relationalNametags.remove(target);
|
relationalNametags.remove(target);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void unsetTabListOrder(@NotNull UUID target) {
|
|
||||||
cachedListOrders.remove(target);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Optional<Component[]> getRelationalNametag(@NotNull UUID target) {
|
public Optional<Component[]> getRelationalNametag(@NotNull UUID target) {
|
||||||
return Optional.ofNullable(relationalNametags.get(target));
|
return Optional.ofNullable(relationalNametags.get(target));
|
||||||
}
|
}
|
||||||
@ -199,7 +193,6 @@ public final class TabPlayer implements Comparable<TabPlayer> {
|
|||||||
lastFooter = null;
|
lastFooter = null;
|
||||||
role = Role.DEFAULT_ROLE;
|
role = Role.DEFAULT_ROLE;
|
||||||
teamName = null;
|
teamName = null;
|
||||||
cachedListOrders.clear();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -48,7 +48,7 @@ public class SortingManager {
|
|||||||
.stream()
|
.stream()
|
||||||
.map(s -> plugin.getPlaceholderManager().applyPlaceholders(player, s))
|
.map(s -> plugin.getPlaceholderManager().applyPlaceholders(player, s))
|
||||||
.map(s -> adaptValue(s, player))
|
.map(s -> adaptValue(s, player))
|
||||||
.toList();
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
return handleList(player, placeholders);
|
return handleList(player, placeholders);
|
||||||
}
|
}
|
||||||
|
@ -28,8 +28,6 @@ import com.velocitypowered.api.proxy.player.TabListEntry;
|
|||||||
import com.velocitypowered.api.proxy.server.RegisteredServer;
|
import com.velocitypowered.api.proxy.server.RegisteredServer;
|
||||||
import com.velocitypowered.api.proxy.server.ServerInfo;
|
import com.velocitypowered.api.proxy.server.ServerInfo;
|
||||||
import com.velocitypowered.api.util.ServerLink;
|
import com.velocitypowered.api.util.ServerLink;
|
||||||
import com.velocitypowered.proxy.connection.client.ConnectedPlayer;
|
|
||||||
import com.velocitypowered.proxy.protocol.packet.UpsertPlayerInfoPacket;
|
|
||||||
import com.velocitypowered.proxy.tablist.KeyedVelocityTabList;
|
import com.velocitypowered.proxy.tablist.KeyedVelocityTabList;
|
||||||
import com.velocitypowered.proxy.tablist.VelocityTabList;
|
import com.velocitypowered.proxy.tablist.VelocityTabList;
|
||||||
import lombok.AccessLevel;
|
import lombok.AccessLevel;
|
||||||
@ -51,8 +49,6 @@ import java.util.*;
|
|||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import static com.velocitypowered.proxy.protocol.packet.UpsertPlayerInfoPacket.Action.UPDATE_LIST_ORDER;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The main class for tracking the server TAB list for a map of {@link TabPlayer}s
|
* The main class for tracking the server TAB list for a map of {@link TabPlayer}s
|
||||||
*/
|
*/
|
||||||
@ -172,7 +168,6 @@ public class PlayerTabList {
|
|||||||
players.values().forEach(p -> {
|
players.values().forEach(p -> {
|
||||||
p.unsetRelationalDisplayName(player.getUniqueId());
|
p.unsetRelationalDisplayName(player.getUniqueId());
|
||||||
p.unsetRelationalNametag(player.getUniqueId());
|
p.unsetRelationalNametag(player.getUniqueId());
|
||||||
p.unsetTabListOrder(player.getUniqueId());
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -185,6 +180,7 @@ public class PlayerTabList {
|
|||||||
tabPlayerOptional.get().setGroup(group);
|
tabPlayerOptional.get().setGroup(group);
|
||||||
tabPlayerOptional.get().setRole(plugin.getLuckPermsHook().map(hook -> hook.getPlayerRole(joined)).orElse(Role.DEFAULT_ROLE));
|
tabPlayerOptional.get().setRole(plugin.getLuckPermsHook().map(hook -> hook.getPlayerRole(joined)).orElse(Role.DEFAULT_ROLE));
|
||||||
}
|
}
|
||||||
|
|
||||||
final TabPlayer tabPlayer = tabPlayerOptional.orElseGet(() -> createTabPlayer(joined, group));
|
final TabPlayer tabPlayer = tabPlayerOptional.orElseGet(() -> createTabPlayer(joined, group));
|
||||||
final String serverName = getServerName(joined);
|
final String serverName = getServerName(joined);
|
||||||
// Store last server, so it's possible to have the last server on disconnect
|
// Store last server, so it's possible to have the last server on disconnect
|
||||||
@ -193,7 +189,6 @@ public class PlayerTabList {
|
|||||||
// Send server URLs (1.21 clients)
|
// Send server URLs (1.21 clients)
|
||||||
sendPlayerServerLinks(tabPlayer);
|
sendPlayerServerLinks(tabPlayer);
|
||||||
|
|
||||||
tabPlayer.getDisplayName(plugin);
|
|
||||||
handleDisplayLoad(tabPlayer);
|
handleDisplayLoad(tabPlayer);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -404,7 +399,13 @@ public class PlayerTabList {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
updateSorting(tabPlayer, force);
|
plugin.getPlaceholderManager().fetchPlaceholders(tabPlayer.getPlayer().getUniqueId(), tabPlayer.getGroup().sortingPlaceholders());
|
||||||
|
|
||||||
|
//to make sure that role placeholder is updated even for a backend placeholder
|
||||||
|
plugin.getServer().getScheduler().buildTask(plugin,
|
||||||
|
() -> updateSorting(tabPlayer, force))
|
||||||
|
.delay(100, TimeUnit.MILLISECONDS)
|
||||||
|
.schedule();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateSorting(@NotNull Group group) {
|
public void updateSorting(@NotNull Group group) {
|
||||||
@ -416,13 +417,13 @@ public class PlayerTabList {
|
|||||||
if (teamName.isBlank()) {
|
if (teamName.isBlank()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
plugin.getScoreboardManager().updateRole(tabPlayer, teamName, force);
|
plugin.getScoreboardManager().updateRole(tabPlayer, teamName, force);
|
||||||
final int order = plugin.getScoreboardManager().getPosition(teamName);
|
final int order = plugin.getScoreboardManager().getPosition(teamName);
|
||||||
if (order == -1) {
|
if (order == -1) {
|
||||||
plugin.log(Level.ERROR, "Failed to get position for " + tabPlayer.getPlayer().getUsername());
|
plugin.log(Level.ERROR, "Failed to get position for " + tabPlayer.getPlayer().getUsername());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
tabPlayer.setListOrder(order);
|
tabPlayer.setListOrder(order);
|
||||||
final Set<TabPlayer> players = tabPlayer.getGroup().getTabPlayers(plugin, tabPlayer);
|
final Set<TabPlayer> players = tabPlayer.getGroup().getTabPlayers(plugin, tabPlayer);
|
||||||
players.forEach(p -> recalculateSortingForPlayer(p, players));
|
players.forEach(p -> recalculateSortingForPlayer(p, players));
|
||||||
@ -586,15 +587,13 @@ public class PlayerTabList {
|
|||||||
if (!tabPlayer.getPlayer().getTabList().containsEntry(uuid)) {
|
if (!tabPlayer.getPlayer().getTabList().containsEntry(uuid)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (tabPlayer.getCachedListOrders().containsKey(uuid) && tabPlayer.getCachedListOrders().get(uuid) == position) {
|
|
||||||
|
final Optional<TabListEntry> entry = tabPlayer.getPlayer().getTabList().getEntry(uuid);
|
||||||
|
if(entry.isEmpty() || entry.get().getListOrder() == position) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
tabPlayer.getCachedListOrders().put(uuid, position);
|
|
||||||
final UpsertPlayerInfoPacket packet = new UpsertPlayerInfoPacket(UPDATE_LIST_ORDER);
|
entry.get().setListOrder(position);
|
||||||
final UpsertPlayerInfoPacket.Entry entry = new UpsertPlayerInfoPacket.Entry(uuid);
|
|
||||||
entry.setListOrder(position);
|
|
||||||
packet.addEntry(entry);
|
|
||||||
((ConnectedPlayer) tabPlayer.getPlayer()).getConnection().write(packet);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public synchronized void recalculateSortingForPlayer(@NotNull TabPlayer tabPlayer, @NotNull Set<TabPlayer> players) {
|
public synchronized void recalculateSortingForPlayer(@NotNull TabPlayer tabPlayer, @NotNull Set<TabPlayer> players) {
|
||||||
@ -603,7 +602,7 @@ public class PlayerTabList {
|
|||||||
}
|
}
|
||||||
|
|
||||||
players.forEach(p -> {
|
players.forEach(p -> {
|
||||||
final int order = p.getListOrder();
|
final int order = plugin.getScoreboardManager().getPosition(p.getLastTeamName().orElse(""));
|
||||||
updateSorting(tabPlayer, p.getPlayer().getUniqueId(), order);
|
updateSorting(tabPlayer, p.getPlayer().getUniqueId(), order);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -155,7 +155,7 @@ public class TabListListener {
|
|||||||
.repeat(50, TimeUnit.MILLISECONDS)
|
.repeat(50, TimeUnit.MILLISECONDS)
|
||||||
.schedule();
|
.schedule();
|
||||||
|
|
||||||
final int delay = justQuit.contains(joined.getUniqueId()) ? 650 : 500;
|
final int delay = justQuit.contains(joined.getUniqueId()) ? 400 : 200;
|
||||||
plugin.getServer().getScheduler().buildTask(plugin,
|
plugin.getServer().getScheduler().buildTask(plugin,
|
||||||
() -> {
|
() -> {
|
||||||
task.cancel();
|
task.cancel();
|
||||||
|
Loading…
Reference in New Issue
Block a user