diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 8149f4ff3c..068068ff94 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -230,6 +230,7 @@ disconnect.timeout = Timed out. disconnect.data = Failed to load world data! cantconnect = Unable to join game ([accent]{0}[]). connecting = [accent]Connecting... +reconnecting = [accent]Reconnecting... connecting.data = [accent]Loading world data... server.port = Port: server.addressinuse = Address already in use! diff --git a/core/src/mindustry/core/NetClient.java b/core/src/mindustry/core/NetClient.java index 841e7e42a7..85bbfd6f95 100644 --- a/core/src/mindustry/core/NetClient.java +++ b/core/src/mindustry/core/NetClient.java @@ -257,6 +257,11 @@ public class NetClient implements ApplicationListener{ public static void kick(KickReason reason){ netClient.disconnectQuietly(); logic.reset(); + + if(reason == KickReason.serverRestarting){ + ui.join.reconnect(); + return; + } if(!reason.quiet){ if(reason.extraText() != null){ diff --git a/core/src/mindustry/ui/dialogs/JoinDialog.java b/core/src/mindustry/ui/dialogs/JoinDialog.java index f3d200f08a..fe5ea1bdaf 100644 --- a/core/src/mindustry/ui/dialogs/JoinDialog.java +++ b/core/src/mindustry/ui/dialogs/JoinDialog.java @@ -8,6 +8,7 @@ import arc.scene.ui.*; import arc.scene.ui.layout.*; import arc.struct.*; import arc.util.*; +import arc.util.Timer.*; import arc.util.serialization.*; import mindustry.*; import mindustry.core.*; @@ -33,6 +34,10 @@ public class JoinDialog extends BaseDialog{ int refreshes; boolean showHidden; + String lastIp; + int lastPort; + Task ping; + public JoinDialog(){ super("@joingame"); @@ -445,13 +450,34 @@ public class JoinDialog extends BaseDialog{ logic.reset(); net.reset(); Vars.netClient.beginConnecting(); - net.connect(ip, port, () -> { + net.connect(lastIp = ip, lastPort = port, () -> { hide(); add.hide(); }); }); } + public void reconnect(){ + if(lastIp == null || lastIp.isEmpty()) return; + ui.loadfrag.show("@reconnecting"); + + ping = Timer.schedule(() -> { + net.pingHost(lastIp, lastPort, host -> { + if(ping == null) return; + ping.cancel(); + ping = null; + connect(lastIp, lastPort); + }, exception -> {}); + }, 1, 1); + + ui.loadfrag.setButton(() -> { + ui.loadfrag.hide(); + if(ping == null) return; + ping.cancel(); + ping = null; + }); + } + void safeConnect(String ip, int port, int version){ if(version != Version.build && Version.build != -1 && version != -1){ ui.showInfo("[scarlet]" + (version > Version.build ? KickReason.clientOutdated : KickReason.serverOutdated).toString() + "\n[]" +