@@ -9,35 +9,13 @@ import gg.grounds.proxy.api.ServerDisplayQuery
99import net.kyori.adventure.text.Component
1010import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer
1111
12- /* *
13- * The header and footer above and below the player list, and the chips and colour of the names in
14- * it.
15- *
16- * The tab list is the only screen a player can open from anywhere, which makes it the right place
17- * for the two facts that are true everywhere: which network this is, and which backend you are on.
18- * It belongs to the proxy because both answers do — a backend server knows its own name and nothing
19- * about how the network should label it.
20- *
21- * ```
22- * [GROUNDS wordmark]
23- *
24- * [ADMIN] Steve
25- * [USER] Alex
26- *
27- * Lobby 2 • 42 players online • 24 ms
28- * ```
29- *
30- * The ping is coloured by how bad it is, using the state colours rather than a number nobody reads:
31- * green under 100 ms, amber under 200, salmon above. A player who has not been measured yet gets a
32- * dash instead of a fabricated zero.
33- */
12+ /* * Network branding, rank-coloured names, and rank/name ordering for each viewer's roster. */
3413class TabList (
3514 private val proxy : ProxyServer ,
3615 private val messages : Translations ,
3716 private val roleQuery : () -> PlayerRoleQuery ? ,
3817 private val serverQuery : () -> ServerDisplayQuery ? ,
3918 private val isBedrock : (java.util.UUID ) -> Boolean = { false },
40- private val onlineCount : () -> Int? = { null },
4119) {
4220 private val rankWarmup = RankWarmup ()
4321
@@ -47,27 +25,15 @@ class TabList(
4725 colourNames(viewer)
4826 }
4927
50- /* *
51- * Redraws for everyone.
52- *
53- * Called on a timer, because the ping and the roster change without an event to hang off. It
54- * renders per player rather than once for all of them: the footer is in the player's own
55- * language and carries their own ping, so there is nothing to share.
56- */
28+ /* * Refreshes each viewer in their language as the roster and rank snapshots change. */
5729 fun refreshAll () {
5830 proxy.allPlayers.forEach(::refresh)
5931 }
6032
6133 private fun header (viewer : Player ): Component = messages.render(ProxyMessage .TAB_HEADER , viewer)
6234
6335 private fun footer (viewer : Player ): Component =
64- messages.render(
65- ProxyMessage .TAB_FOOTER ,
66- viewer,
67- " server" to serverLabel(viewer),
68- " ping" to ping(viewer.ping),
69- " online" to (onlineCount()?.toString() ? : " —" ),
70- )
36+ messages.render(ProxyMessage .TAB_FOOTER , viewer, " server" to serverLabel(viewer))
7137
7238 private fun serverLabel (viewer : Player ): Component {
7339 val raw =
@@ -78,12 +44,7 @@ class TabList(
7844 val label =
7945 kindLabel(kind, viewer)
8046 ? : plain(messages.render(ProxyMessage .TAB_SERVER_UNKNOWN , viewer))
81- val peers =
82- proxy.allServers
83- .map { it.serverInfo.name }
84- .filter { query?.displayOf(it)?.kind == kind }
85- val number = ServerDisplayIds .numberOf(raw, peers)
86- return Component .text(" $label $number " , Palette .TEXT )
47+ return Component .text(label, Palette .TEXT )
8748 }
8849
8950 private fun kindLabel (kind : String? , viewer : Player ): String? {
@@ -107,8 +68,25 @@ class TabList(
10768 */
10869 private fun colourNames (viewer : Player ) {
10970 val query = roleQuery()
110- viewer.tabList.entries.forEach { entry ->
111- val role = query?.highestRoleOf(entry.profile.id)
71+ val entries = viewer.tabList.entries.toList()
72+ val roles = entries.associate { it.profile.id to query?.highestRoleOf(it.profile.id) }
73+ val orders =
74+ TabOrder .orders(
75+ entries.map { entry ->
76+ TabOrder .Entry (
77+ entry.profile.id,
78+ gg.grounds.proxy.api.PlayerDisplayNames .displayName(
79+ entry.profile.name,
80+ isBedrock(entry.profile.id),
81+ ),
82+ roles[entry.profile.id]?.sortOrder,
83+ )
84+ }
85+ )
86+ entries.forEach { entry ->
87+ val order = orders.getValue(entry.profile.id)
88+ if (entry.listOrder != order) entry.setListOrder(order)
89+ val role = roles[entry.profile.id]
11290 val supplied = entry.displayNameComponent.orElse(null )
11391 if (
11492 role == null &&
0 commit comments