Add sorting by server name, customise sort element order

This commit is contained in:
William278 2023-03-14 14:19:59 +00:00
parent 68f17b14a1
commit 28c5398c6b
4 changed files with 48 additions and 8 deletions

View File

@ -28,7 +28,7 @@ public enum Placeholder {
PREFIX((plugin, player) -> player.getRole().getPrefix().orElse("")),
SUFFIX((plugin, player) -> player.getRole().getSuffix().orElse("")),
ROLE((plugin, player) -> player.getRole().getName().orElse("")),
DEBUG_TEAM_NAME((plugin, player) -> plugin.getFormatter().escape(player.getTeamName()));
DEBUG_TEAM_NAME((plugin, player) -> plugin.getFormatter().escape(player.getTeamName(plugin)));
/**
* Function to replace placeholders with a real value

View File

@ -1,11 +1,11 @@
package net.william278.velocitab.config;
import lombok.Getter;
import net.william278.annotaml.YamlComment;
import net.william278.annotaml.YamlFile;
import net.william278.annotaml.YamlKey;
import net.william278.velocitab.Velocitab;
import net.william278.velocitab.player.TabPlayer;
import org.apache.commons.text.StringEscapeUtils;
import org.jetbrains.annotations.NotNull;
@ -56,6 +56,13 @@ public class Settings {
@YamlComment("If you are using MINIMESSAGE formatting, enable this to support MiniPlaceholders in formatting.")
private boolean enableMiniPlaceholdersHook = true;
@YamlKey("sort_players_by")
@YamlComment("Ordered list of elements by which players should be sorted. (ROLE_WEIGHT, ROLE_NAME and SERVER are supported)")
private List<TabPlayer.SortableElement> sortPlayersBy = List.of(
TabPlayer.SortableElement.ROLE_WEIGHT,
TabPlayer.SortableElement.ROLE_NAME
);
@YamlKey("update_rate")
@YamlComment("How often to periodically update the TAB list, including header and footer, for all users.\nWill only update on player join/leave if set to 0.")
private int updateRate = 0;
@ -109,6 +116,11 @@ public class Settings {
return enableMiniPlaceholdersHook;
}
@NotNull
public List<TabPlayer.SortableElement> getSortingElementList() {
return sortPlayersBy;
}
public int getUpdateRate() {
return updateRate;
}

View File

@ -8,6 +8,8 @@ import net.william278.velocitab.tab.PlayerTabList;
import org.jetbrains.annotations.NotNull;
import java.util.concurrent.CompletableFuture;
import java.util.function.BiFunction;
import java.util.stream.Collectors;
public final class TabPlayer implements Comparable<TabPlayer> {
private final Player player;
@ -34,7 +36,7 @@ public final class TabPlayer implements Comparable<TabPlayer> {
public String getServerName() {
return player.getCurrentServer()
.map(serverConnection -> serverConnection.getServerInfo().getName())
.orElse("Unknown");
.orElse("unknown");
}
@NotNull
@ -46,8 +48,10 @@ public final class TabPlayer implements Comparable<TabPlayer> {
}
@NotNull
public String getTeamName() {
return role.getWeightString(highestWeight) + role.getName().map(name -> "-" + name).orElse("");
public String getTeamName(@NotNull Velocitab plugin) {
return plugin.getSettings().getSortingElementList().stream()
.map(element -> element.resolve(this, plugin))
.collect(Collectors.joining("-"));
}
public void sendHeaderAndFooter(@NotNull PlayerTabList tabList) {
@ -68,4 +72,28 @@ public final class TabPlayer implements Comparable<TabPlayer> {
public boolean equals(Object obj) {
return obj instanceof TabPlayer other && player.getUniqueId().equals(other.player.getUniqueId());
}
/**
* Elements for sorting players
*/
@SuppressWarnings("unused")
public enum SortableElement {
ROLE_WEIGHT((player, plugin) -> player.getRole().getWeightString(player.highestWeight)),
ROLE_NAME((player, plugin) -> player.getRole().getName()
.map(name -> name.length() > 3 ? name.substring(0, 3) : name)
.orElse("")),
SERVER_NAME((player, plugin) -> player.getServerName());
private final BiFunction<TabPlayer, Velocitab, String> elementResolver;
SortableElement(@NotNull BiFunction<TabPlayer, Velocitab, String> elementResolver) {
this.elementResolver = elementResolver;
}
@NotNull
private String resolve(@NotNull TabPlayer tabPlayer, @NotNull Velocitab plugin) {
return elementResolver.apply(tabPlayer, plugin);
}
}
}

View File

@ -76,7 +76,7 @@ public class PlayerTabList {
if (serversInGroup.isPresent() && !serversInGroup.get().contains(player.getServerName())) {
continue; // Skip players on other servers
}
playerRoles.put(player.getPlayer().getUsername(), player.getTeamName());
playerRoles.put(player.getPlayer().getUsername(), player.getTeamName(plugin));
tabList.getEntries().stream()
.filter(e -> e.getProfile().getId().equals(player.getPlayer().getUniqueId())).findFirst()
.ifPresentOrElse(
@ -118,7 +118,7 @@ public class PlayerTabList {
);
plugin.getScoreboardManager().updateRoles(
player.getPlayer(),
newPlayer.getTeamName(),
newPlayer.getTeamName(plugin),
newPlayer.getPlayer().getUsername()
);
}
@ -147,7 +147,7 @@ public class PlayerTabList {
.filter(e -> e.getProfile().getId().equals(tabPlayer.getPlayer().getUniqueId())).findFirst()
.ifPresent(entry -> entry.setDisplayName(displayName));
plugin.getScoreboardManager().updateRoles(player.getPlayer(),
tabPlayer.getTeamName(), tabPlayer.getPlayer().getUsername());
tabPlayer.getTeamName(plugin), tabPlayer.getPlayer().getUsername());
}));
}