Added button to sort servers by player count

This commit is contained in:
Anuken
2026-07-27 12:07:21 -04:00
parent 4e85807aa9
commit d3a50f6951
3 changed files with 41 additions and 2 deletions
+2
View File
@@ -287,6 +287,8 @@ servers.connect.confirm = Join the following server?\n\n[accent]{0}[]\n\nOnly co
servers.showhidden = Show Hidden Servers
server.shown = Shown
server.hidden = Hidden
servers.sortping = Sorting By: Ping
servers.sortplayers = Sorting By: Player Count
viewplayer = Viewing Player: [accent]{0}
trace = Trace Player
+38 -1
View File
@@ -5,10 +5,12 @@ import arc.freetype.FreeTypeFontGenerator.*;
import arc.graphics.*;
import arc.input.*;
import arc.math.*;
import arc.scene.*;
import arc.scene.ui.*;
import arc.scene.ui.TextButton.*;
import arc.scene.ui.layout.*;
import arc.struct.*;
import arc.util.Timer;
import arc.util.*;
import arc.util.Timer.*;
import arc.util.serialization.*;
@@ -22,9 +24,14 @@ import mindustry.net.*;
import mindustry.net.Packets.*;
import mindustry.ui.*;
import java.util.*;
import static mindustry.Vars.*;
public class JoinDialog extends BaseDialog{
static Seq<Element> tmpElements = new Seq<>();
static final int favoriteCountOffset = 9_999_999;
Seq<ServerGroup> tmpServers = new Seq<>();
Seq<Server> servers = new Seq<>();
Dialog add;
@@ -44,6 +51,7 @@ public class JoinDialog extends BaseDialog{
Task ping;
String serverSearch = "";
boolean sortPing = true;
public JoinDialog(){
super("@joingame");
@@ -357,6 +365,13 @@ public class JoinDialog extends BaseDialog{
name.add(label).pad(10).growX().left().color(Pal.accent);
if(eye){
name.button(Icon.chartBar, Styles.emptyi, () -> {
sortPing = !sortPing;
Core.settings.put("sort-servers-ping", sortPing);
refreshCommunity();
}).update(i -> i.getStyle().imageUp = (sortPing ? Icon.chartBar : Icon.players))
.size(40f).right().padRight(3).tooltip(true, t -> t.background(Styles.black8).margin(4f).label(() -> sortPing ? "@servers.sortping" : "@servers.sortplayers"));
name.button(Icon.eyeSmall, Styles.emptyi, () -> {
showHidden = !showHidden;
refreshCommunity();
@@ -450,8 +465,29 @@ public class JoinDialog extends BaseDialog{
addHeader(groupTable, group, hidden, favorite, true);
}
boolean needsSort = false;
if(!sortPing && !Strings.stripColors(res.name).toLowerCase(Locale.ROOT).contains("hub") && groupTable[0].userObject instanceof Integer count){
//hack: apply large numerical offset to favorite servers
int actualCount = (count >= favoriteCountOffset ? res.players + favoriteCountOffset : res.players);
needsSort = actualCount > count;
groupTable[0].userObject = Math.max(count, actualCount);
}
addCommunityHost(res, groupTable[1]);
if(needsSort && !sortPing){
//when the count changes, sort by player count, descending
var oldChildren = tmpElements;
tmpElements.set(global.getChildren());
oldChildren.sort(c -> c instanceof Table t && t.userObject instanceof Integer playerCount ? -playerCount : 0);
global.clearChildren();
for(var child : oldChildren){
global.add(child);
global.row();
}
}
groupTable[0].margin(5f);
groupTable[0].pack();
}, e -> {});
@@ -461,7 +497,7 @@ public class JoinDialog extends BaseDialog{
void addHeader(Table[] groupTable, ServerGroup group, boolean hidden, boolean favorite, boolean doInit){ // outlined separately
if(groupTable[0] == null){
global.table(t -> groupTable[0] = t).fillX().left().row();
global.table(t -> groupTable[0] = t).with(t -> t.userObject = favorite ? favoriteCountOffset : 0).fillX().left().row();
}
groupTable[0].visible(() -> doInit);
if(!doInit){
@@ -649,6 +685,7 @@ public class JoinDialog extends BaseDialog{
@SuppressWarnings("unchecked")
private void loadServers(){
sortPing = Core.settings.getBool("sort-servers-ping", true);
servers = Core.settings.getJson("servers", Seq.class, Server.class, Seq::new);
//load imported legacy data
+1 -1
View File
@@ -26,4 +26,4 @@ org.gradle.caching=true
org.gradle.internal.http.socketTimeout=100000
org.gradle.internal.http.connectionTimeout=100000
android.enableR8.fullMode=false
archash=fee7da3557
archash=8fe6402778