diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 4d829e9eb5..626f67d014 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -118,6 +118,9 @@ confirmunadmin = Are you sure you want to remove admin status from this player? joingame.title = Join Game joingame.ip = Address: disconnect = Disconnected. +disconnect.error = Connection error. +disconnect.closed = Connection closed. +disconnect.timeout = Timed out. disconnect.data = Failed to load world data! connecting = [accent]Connecting... connecting.data = [accent]Loading world data... diff --git a/core/src/io/anuke/mindustry/core/NetClient.java b/core/src/io/anuke/mindustry/core/NetClient.java index 88abd225db..9c1828df8e 100644 --- a/core/src/io/anuke/mindustry/core/NetClient.java +++ b/core/src/io/anuke/mindustry/core/NetClient.java @@ -107,7 +107,17 @@ public class NetClient implements ApplicationListener{ Time.runTask(3f, ui.loadfrag::hide); - ui.showError("$disconnect"); + if(packet.reason != null){ + if(packet.reason.equals("closed")){ + ui.showSmall("$disconnect", "$disconnect.closed"); + }else if(packet.reason.equals("timeout")){ + ui.showSmall("$disconnect", "$disconnect.timeout"); + }else if(packet.reason.equals("error")){ + ui.showSmall("$disconnect", "$disconnect.error"); + } + }else{ + ui.showError("$disconnect"); + } }); Net.handleClient(WorldStream.class, data -> { diff --git a/core/src/io/anuke/mindustry/core/NetServer.java b/core/src/io/anuke/mindustry/core/NetServer.java index 36ac50ade2..c27120d513 100644 --- a/core/src/io/anuke/mindustry/core/NetServer.java +++ b/core/src/io/anuke/mindustry/core/NetServer.java @@ -76,7 +76,7 @@ public class NetServer implements ApplicationListener{ Net.handleServer(Disconnect.class, (id, packet) -> { Player player = connections.get(id); if(player != null){ - onDisconnect(player); + onDisconnect(player, packet.reason); } connections.remove(id); }); @@ -362,7 +362,7 @@ public class NetServer implements ApplicationListener{ Log.debug("Packed {0} compressed bytes of world data.", stream.size()); } - public static void onDisconnect(Player player){ + public static void onDisconnect(Player player, String reason){ //singleplayer multiplayer wierdness if(player.con == null){ player.remove(); @@ -375,7 +375,7 @@ public class NetServer implements ApplicationListener{ } player.remove(); netServer.connections.remove(player.con.id); - Log.info("&lm[{1}] &lc{0} has disconnected.", player.name, player.uuid); + Log.info("&lm[{1}] &lc{0} has disconnected. &lg&fi({2})", player.name, player.uuid, reason); } private static float compound(float speed, float drag){ @@ -701,7 +701,7 @@ public class NetServer implements ApplicationListener{ if(connection == null || !connection.isConnected() || !connections.containsKey(connection.id)){ //player disconnected, call d/c event - onDisconnect(player); + onDisconnect(player, "disappeared"); return; } diff --git a/core/src/io/anuke/mindustry/core/UI.java b/core/src/io/anuke/mindustry/core/UI.java index 194754f328..7a3281d1e1 100644 --- a/core/src/io/anuke/mindustry/core/UI.java +++ b/core/src/io/anuke/mindustry/core/UI.java @@ -360,6 +360,15 @@ public class UI implements ApplicationListener, Loadable{ }}.show(); } + public void showSmall(String titleText, String text){ + new Dialog(titleText, "dialog"){{ + cont.margin(10).add(text); + titleTable.row(); + titleTable.addImage("whiteui").color(Pal.accent).height(3f).growX().pad(2f); + buttons.addButton("$ok", this::hide).size(90, 50).pad(4); + }}.show(); + } + public void showConfirm(String title, String text, Runnable confirmed){ showConfirm(title, text, null, confirmed); } diff --git a/core/src/io/anuke/mindustry/net/Packets.java b/core/src/io/anuke/mindustry/net/Packets.java index 12d9d75067..eb4d6ef80f 100644 --- a/core/src/io/anuke/mindustry/net/Packets.java +++ b/core/src/io/anuke/mindustry/net/Packets.java @@ -52,6 +52,7 @@ public class Packets{ public static class Disconnect implements Packet{ public int id; + public String reason; @Override public boolean isImportant(){ diff --git a/net/src/io/anuke/mindustry/net/ArcNetClient.java b/net/src/io/anuke/mindustry/net/ArcNetClient.java index ffb40bb38f..aad77d8125 100644 --- a/net/src/io/anuke/mindustry/net/ArcNetClient.java +++ b/net/src/io/anuke/mindustry/net/ArcNetClient.java @@ -36,12 +36,13 @@ public class ArcNetClient implements ClientProvider{ } @Override - public void disconnected(Connection connection){ + public void disconnected(Connection connection, DcReason reason){ if(connection.getLastProtocolError() != null){ netClient.setQuiet(); } Disconnect c = new Disconnect(); + c.reason = reason.toString(); Core.app.post(() -> Net.handleClientReceived(c)); } diff --git a/net/src/io/anuke/mindustry/net/ArcNetServer.java b/net/src/io/anuke/mindustry/net/ArcNetServer.java index 73002c51b2..40481be085 100644 --- a/net/src/io/anuke/mindustry/net/ArcNetServer.java +++ b/net/src/io/anuke/mindustry/net/ArcNetServer.java @@ -47,12 +47,13 @@ public class ArcNetServer implements ServerProvider{ } @Override - public void disconnected(Connection connection){ + public void disconnected(Connection connection, DcReason reason){ ArcConnection k = getByKryoID(connection.getID()); if(k == null) return; Disconnect c = new Disconnect(); c.id = k.id; + c.reason = reason.toString(); Core.app.post(() -> { Net.handleServerReceived(k.id, c); @@ -159,7 +160,7 @@ public class ArcNetServer implements ServerProvider{ }catch(Exception e){ Log.err(e); Log.info("Error sending packet. Disconnecting invalid client!"); - connection.close(); + connection.close(DcReason.error); ArcConnection k = getByKryoID(connection.getID()); if(k != null) connections.remove(k); @@ -168,7 +169,7 @@ public class ArcNetServer implements ServerProvider{ @Override public void close(){ - if(connection.isConnected()) connection.close(); + if(connection.isConnected()) connection.close(DcReason.closed); } }