From 5e2173fc54145d28241981a7648a73d825302363 Mon Sep 17 00:00:00 2001 From: Anuken Date: Fri, 12 Jan 2018 20:03:52 -0500 Subject: [PATCH] Fixed crash when connnecting, improved error messages --- android/AndroidManifest.xml | 4 +-- core/assets/bundles/bundle.properties | 1 + .../io/anuke/mindustry/core/NetClient.java | 2 ++ core/src/io/anuke/mindustry/core/UI.java | 4 +++ core/src/io/anuke/mindustry/io/Saves.java | 4 +++ core/src/io/anuke/mindustry/net/Net.java | 7 +++- .../io/anuke/mindustry/net/Registrator.java | 5 --- .../mindustry/ui/dialogs/HostDialog.java | 1 + .../blocks/types/distribution/Sorter.java | 3 +- kryonet/src/io/anuke/kryonet/KryoClient.java | 33 +++++++++++++++++-- 10 files changed, 52 insertions(+), 12 deletions(-) diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml index 7664e5113f7..6594944cbb3 100644 --- a/android/AndroidManifest.xml +++ b/android/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="54" + android:versionName="3.3b6" > diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index a0078476f27..93f24e28a51 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -17,6 +17,7 @@ text.name=Name: text.public=Public text.players={0} players online text.players.single={0} player online +text.server.mismatch=Packet error: possible client/server version mismatch.\nMake sure you and the host have the\nlatest version of Mindustry! text.server.closing=[accent]Closing server... text.server.kicked.kick=You have been kicked from the server! text.server.kicked.invalidPassword=Invalid password! diff --git a/core/src/io/anuke/mindustry/core/NetClient.java b/core/src/io/anuke/mindustry/core/NetClient.java index 92c356c13b2..e262f78631e 100644 --- a/core/src/io/anuke/mindustry/core/NetClient.java +++ b/core/src/io/anuke/mindustry/core/NetClient.java @@ -47,6 +47,7 @@ public class NetClient extends Module { public NetClient(){ Net.handle(Connect.class, packet -> { + Net.setClientLoaded(false); requests.clear(); connecting = true; gotData = false; @@ -99,6 +100,7 @@ public NetClient(){ Net.send(new ConnectConfirmPacket(), SendMode.tcp); GameState.set(State.playing); + Net.setClientLoaded(true); }); }); diff --git a/core/src/io/anuke/mindustry/core/UI.java b/core/src/io/anuke/mindustry/core/UI.java index 19c7da611c2..26ea0b2b965 100644 --- a/core/src/io/anuke/mindustry/core/UI.java +++ b/core/src/io/anuke/mindustry/core/UI.java @@ -180,6 +180,10 @@ public void showInfo(String info){ } public void showError(String text){ + if(hasDialog()){ + Dialog dialog = scene.getScrollFocus() instanceof Dialog ? (Dialog)scene.getScrollFocus() : (Dialog)scene.getKeyboardFocus(); + dialog.hide(); + } new Dialog("$text.error.title", "dialog"){{ content().margin(15).add(text); buttons().addButton("$text.ok", this::hide).size(90, 50).pad(4); diff --git a/core/src/io/anuke/mindustry/io/Saves.java b/core/src/io/anuke/mindustry/io/Saves.java index b3a26238cac..9bad5eb54c8 100644 --- a/core/src/io/anuke/mindustry/io/Saves.java +++ b/core/src/io/anuke/mindustry/io/Saves.java @@ -51,6 +51,10 @@ public SaveSlot getCurrent() { } public void update(){ + if(GameState.is(State.menu)){ + current = null; + } + if(!GameState.is(State.menu) && !Vars.control.isGameOver() && current != null && current.isAutosave()){ time += Timers.delta(); if(time > Settings.getInt("saveinterval")*60) { diff --git a/core/src/io/anuke/mindustry/net/Net.java b/core/src/io/anuke/mindustry/net/Net.java index 84c7ec46615..2e24c6b447c 100644 --- a/core/src/io/anuke/mindustry/net/Net.java +++ b/core/src/io/anuke/mindustry/net/Net.java @@ -18,6 +18,7 @@ public class Net{ private static boolean server; private static boolean active; + private static boolean clientLoaded; private static ObjectMap, Consumer> clientListeners = new ObjectMap<>(); private static ObjectMap, Consumer> serverListeners = new ObjectMap<>(); private static ClientProvider clientProvider; @@ -26,6 +27,10 @@ public class Net{ private static int lastConnection = -1; private static IntMap streams = new IntMap<>(); private static AsyncExecutor executor = new AsyncExecutor(4); + + public static void setClientLoaded(boolean loaded){ + clientLoaded = loaded; + } /**Connect to an address.*/ public static void connect(String ip, int port) throws IOException{ @@ -141,7 +146,7 @@ public static void handleClientReceived(Object object){ handleClientReceived(builder.build()); } }else if(clientListeners.get(object.getClass()) != null){ - clientListeners.get(object.getClass()).accept(object); + if(clientLoaded) clientListeners.get(object.getClass()).accept(object); }else{ Gdx.app.error("Mindustry::Net", "Unhandled packet type: '" + object.getClass() + "'!"); } diff --git a/core/src/io/anuke/mindustry/net/Registrator.java b/core/src/io/anuke/mindustry/net/Registrator.java index 8068889b9cd..a607db7b3f7 100644 --- a/core/src/io/anuke/mindustry/net/Registrator.java +++ b/core/src/io/anuke/mindustry/net/Registrator.java @@ -7,7 +7,6 @@ import io.anuke.mindustry.net.Packets.*; import io.anuke.mindustry.net.Streamable.StreamBegin; import io.anuke.mindustry.net.Streamable.StreamChunk; -import io.anuke.mindustry.resource.Mech; import io.anuke.ucore.entities.Entity; public class Registrator { @@ -47,15 +46,11 @@ public static Class[] getClasses(){ int[].class, int[][].class, Entity[].class, - Player[].class, Array.class, Vector2.class, - EnemySpawnPacket[].class, Entity.class, Player.class, - Mech.class, - Enemy.class }; } diff --git a/core/src/io/anuke/mindustry/ui/dialogs/HostDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/HostDialog.java index 2cd93fc14e4..07d408dfec7 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/HostDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/HostDialog.java @@ -25,6 +25,7 @@ public HostDialog(){ Vars.player.name = text; Settings.put("name", text); Settings.save(); + Vars.ui.listfrag.rebuild(); }).grow().pad(8); }).width(w).height(70f).pad(4); diff --git a/core/src/io/anuke/mindustry/world/blocks/types/distribution/Sorter.java b/core/src/io/anuke/mindustry/world/blocks/types/distribution/Sorter.java index b2084e40b8c..980fdf8a399 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/distribution/Sorter.java +++ b/core/src/io/anuke/mindustry/world/blocks/types/distribution/Sorter.java @@ -48,8 +48,7 @@ public boolean acceptItem(Item item, Tile tile, Tile source){ public void handleItem(Item item, Tile tile, Tile source){ Tile to = getTileTarget(item, tile, source, true); - Timers.run(15, ()->{ - if(to == null || to.entity == null) return; + Timers.run(15, () -> { to.block().handleItem(item, to, tile); }); diff --git a/kryonet/src/io/anuke/kryonet/KryoClient.java b/kryonet/src/io/anuke/kryonet/KryoClient.java index a2eb4b07e27..f512629f1db 100644 --- a/kryonet/src/io/anuke/kryonet/KryoClient.java +++ b/kryonet/src/io/anuke/kryonet/KryoClient.java @@ -42,7 +42,7 @@ public void onFinally() { } }); - client.start(); + client.addListener(new Listener(){ @Override public void connected (Connection connection) { @@ -75,7 +75,13 @@ public void received (Connection connection, Object object) { try{ Net.handleClientReceived(object); }catch (Exception e){ - Gdx.app.postRunnable(() -> {throw new RuntimeException(e);}); + if(e instanceof KryoNetException && e.getMessage() != null && e.getMessage().toLowerCase().contains("incorrect")) { + UCore.log("Mismatch!"); + }else{ + Gdx.app.postRunnable(() -> { + throw new RuntimeException(e); + }); + } } } @@ -86,6 +92,19 @@ public void received (Connection connection, Object object) { @Override public void connect(String ip, int port) throws IOException { + //just in case + client.stop(); + + Thread updateThread = new Thread(() -> { + try{ + client.run(); + }catch (Exception e){ + handleException(e); + } + }, "Kryonet Client"); + updateThread.setDaemon(true); + updateThread.start(); + client.connect(5000, ip, port, port); } @@ -145,4 +164,14 @@ public void dispose(){ } } + private void handleException(Exception e){ + e.printStackTrace(); + if(e instanceof KryoNetException){ + Gdx.app.postRunnable(() -> Vars.ui.showError("$text.server.mismatch")); + }else{ + //TODO better exception handling. + disconnect(); + } + } + }