diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 799e2b2031..3a450bffec 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -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 diff --git a/core/src/mindustry/ui/dialogs/JoinDialog.java b/core/src/mindustry/ui/dialogs/JoinDialog.java index f0e987b5e8..571dc2e2eb 100644 --- a/core/src/mindustry/ui/dialogs/JoinDialog.java +++ b/core/src/mindustry/ui/dialogs/JoinDialog.java @@ -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 tmpElements = new Seq<>(); + static final int favoriteCountOffset = 9_999_999; + Seq tmpServers = new Seq<>(); Seq 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 diff --git a/gradle.properties b/gradle.properties index 8b3e4e494f..1748cb499d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -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