Non-blocking connect / Localized connect error messages

This commit is contained in:
Anuken
2018-10-28 23:47:28 -04:00
parent e21d17a482
commit 108e5a2f5e
5 changed files with 92 additions and 78 deletions
+49 -18
View File
@@ -17,13 +17,14 @@ import io.anuke.mindustry.net.Streamable.StreamBuilder;
import io.anuke.ucore.core.Timers;
import io.anuke.ucore.function.BiConsumer;
import io.anuke.ucore.function.Consumer;
import io.anuke.ucore.util.Bundles;
import io.anuke.ucore.util.Log;
import io.anuke.ucore.util.Pooling;
import io.anuke.ucore.util.Threads;
import java.io.IOException;
import static io.anuke.mindustry.Vars.headless;
import static io.anuke.mindustry.Vars.ui;
import static io.anuke.mindustry.Vars.*;
public class Net{
private static boolean server;
@@ -46,15 +47,41 @@ public class Net{
return serverProvider != null;
}
/**
* Display a network error.
*/
public static void showError(String text){
/**Display a network error. Call on the graphics thread.*/
public static void showError(Throwable e){
if(!headless){
ui.showError(text);
}else{
Log.err(text);
Threads.assertGraphics();
Throwable t = e;
while(t.getCause() != null){
t = t.getCause();
}
String error = t.getMessage() == null ? "" : t.getMessage().toLowerCase();
String type = error.getClass().toString().toLowerCase();
if(error.equals("mismatch")){
error = Bundles.get("text.error.mismatch");
}else if(error.contains("port out of range") || error.contains("invalid argument") || (error.contains("invalid") && error.contains("address"))){
error = Bundles.get("text.error.invalidaddress");
}else if(error.contains("connection refused") || error.contains("route to host") || type.contains("unknownhost")){
error = Bundles.get("text.error.unreachable");
}else if(type.contains("timeout")){
error = Bundles.get("text.error.timeout");
}else if(!error.isEmpty()){
error = Bundles.get("text.error.any");
}
ui.showText("", Bundles.format("text.connectfail", error));
ui.loadfrag.hide();
if(Net.client()){
netClient.disconnectQuietly();
}
}
Log.err(e);
}
/**
@@ -77,14 +104,18 @@ public class Net{
/**
* Connect to an address.
*/
public static void connect(String ip, int port) throws IOException{
lastIP = ip + ":" + port;
if(!active){
clientProvider.connect(ip, port);
active = true;
server = false;
}else{
throw new IOException("Already connected!");
public static void connect(String ip, int port, Runnable success){
try{
lastIP = ip + ":" + port;
if(!active){
clientProvider.connect(ip, port, success);
active = true;
server = false;
}else{
throw new IOException("Already connected!");
}
}catch(IOException e){
showError(e);
}
}
@@ -346,7 +377,7 @@ public class Net{
/**Client implementation.*/
public interface ClientProvider{
/**Connect to a server.*/
void connect(String ip, int port) throws IOException;
void connect(String ip, int port, Runnable success) throws IOException;
/**Send an object to the server.*/
void send(Object object, SendMode mode);