From ae89a004a6f247dae16fb7a6f4192403596579a8 Mon Sep 17 00:00:00 2001 From: Anuken Date: Thu, 15 Mar 2018 12:53:47 -0400 Subject: [PATCH] Fixed port bug, possible random disconnect fix --- core/assets/bundles/bundle.properties | 1 + core/assets/version.properties | 2 +- .../io/anuke/mindustry/core/NetClient.java | 39 ++++++++----------- core/src/io/anuke/mindustry/net/Packets.java | 9 ++++- .../mindustry/ui/fragments/DebugFragment.java | 3 +- .../anuke/mindustry/server/ServerControl.java | 36 +++++++++-------- 6 files changed, 47 insertions(+), 43 deletions(-) diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 630e900ac4..7f75cb6a13 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -70,6 +70,7 @@ text.joingame.byip=Join by IP... text.joingame.title=Join Game text.joingame.ip=IP: text.disconnect=Disconnected. +text.disconnect.data=Failed to load world data! text.connecting=[accent]Connecting... text.connecting.data=[accent]Loading world data... text.connectfail=[crimson]Failed to connect to server: [orange]{0} diff --git a/core/assets/version.properties b/core/assets/version.properties index 7dd63cd907..5e49680142 100644 --- a/core/assets/version.properties +++ b/core/assets/version.properties @@ -1,5 +1,5 @@ #Autogenerated file. Do not modify. -#Thu Mar 15 12:29:06 EDT 2018 +#Thu Mar 15 12:52:13 EDT 2018 version=release androidBuildCode=388 name=Mindustry diff --git a/core/src/io/anuke/mindustry/core/NetClient.java b/core/src/io/anuke/mindustry/core/NetClient.java index a3c68f1f00..b0ad4a281c 100644 --- a/core/src/io/anuke/mindustry/core/NetClient.java +++ b/core/src/io/anuke/mindustry/core/NetClient.java @@ -40,10 +40,10 @@ public class NetClient extends Module { private Timer timer = new Timer(5); private boolean connecting = false; - private boolean gotData = false; private boolean kicked = false; private IntSet recieved = new IntSet(); private IntMap recent = new IntMap<>(); + private float timeoutTime = 0f; //data timeout counter public NetClient(){ @@ -53,8 +53,8 @@ public class NetClient extends Module { Net.setClientLoaded(false); recieved.clear(); recent.clear(); + timeoutTime = 0f; connecting = true; - gotData = false; kicked = false; ui.chatfrag.clearMessages(); @@ -77,14 +77,6 @@ public class NetClient extends Module { } Net.send(c, SendMode.tcp); - - Timers.runTask(dataTimeout, () -> { - if (!gotData) { - Log.err("Failed to load data!"); - ui.loadfrag.hide(); - Net.disconnect(); - } - }); }); Net.handleClient(Disconnect.class, packet -> { @@ -105,8 +97,6 @@ public class NetClient extends Module { NetworkIO.loadWorld(data.stream); player.set(world.getSpawnX(), world.getSpawnY()); - gotData = true; - finishConnecting(); }); @@ -123,7 +113,7 @@ public class NetClient extends Module { }); Net.handleClient(SyncPacket.class, packet -> { - if (!gotData) return; + if (connecting) return; int players = 0; int enemies = 0; @@ -180,9 +170,8 @@ public class NetClient extends Module { } }); - Net.handleClient(BreakPacket.class, (packet) -> { - Placement.breakBlock(packet.x, packet.y, true, Timers.get("breakblocksound", 10)); - }); + Net.handleClient(BreakPacket.class, (packet) -> + Placement.breakBlock(packet.x, packet.y, true, Timers.get("breakblocksound", 10))); Net.handleClient(EntitySpawnPacket.class, packet -> { EntityGroup group = packet.group; @@ -246,7 +235,7 @@ public class NetClient extends Module { kicked = true; Net.disconnect(); state.set(State.menu); - ui.showError("$text.server.kicked." + packet.reason.name()); + if(!packet.reason.quiet) ui.showError("$text.server.kicked." + packet.reason.name()); ui.loadfrag.hide(); }); @@ -316,16 +305,22 @@ public class NetClient extends Module { if(!Net.client()) return; if(!state.is(State.menu)){ - if(gotData) sync(); + if(!connecting) sync(); }else if(!connecting){ Net.disconnect(); + }else{ //...must be connecting + timeoutTime += Timers.delta(); + if(timeoutTime > dataTimeout){ + Log.err("Failed to load data!"); + ui.loadfrag.hide(); + kicked = true; + ui.showError("$text.disconnect.data"); + Net.disconnect(); + timeoutTime = 0f; + } } } - public boolean hasData(){ - return gotData; - } - public boolean isConnecting(){ return connecting; } diff --git a/core/src/io/anuke/mindustry/net/Packets.java b/core/src/io/anuke/mindustry/net/Packets.java index c639005cfb..734f33988f 100644 --- a/core/src/io/anuke/mindustry/net/Packets.java +++ b/core/src/io/anuke/mindustry/net/Packets.java @@ -377,7 +377,14 @@ public class Packets { } public enum KickReason{ - kick, invalidPassword, clientOutdated, serverOutdated, banned + kick, invalidPassword, clientOutdated, serverOutdated, banned, gameover(true); + public final boolean quiet; + + KickReason(){ quiet = false; } + + KickReason(boolean quiet){ + this.quiet = quiet; + } } public static class UpgradePacket implements Packet{ diff --git a/core/src/io/anuke/mindustry/ui/fragments/DebugFragment.java b/core/src/io/anuke/mindustry/ui/fragments/DebugFragment.java index a141e5d591..1848ed7c73 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/DebugFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/DebugFragment.java @@ -130,8 +130,7 @@ public class DebugFragment implements Fragment { Net.client() ? "chat.open: " + ui.chatfrag.chatOpen() + "\n" + "chat.messages: " + ui.chatfrag.getMessagesSize() + "\n" + - "client.connecting: " + netClient.isConnecting() + "\n" + - "client.hasdata: " + netClient.hasData() : "", + "client.connecting: " + netClient.isConnecting() + "\n" : "", "players: " + playerGroup.size(), "enemies: " + enemyGroup.size(), "tiles: " + tileGroup.size(), diff --git a/server/src/io/anuke/mindustry/server/ServerControl.java b/server/src/io/anuke/mindustry/server/ServerControl.java index 0b8da6e4f6..7299696239 100644 --- a/server/src/io/anuke/mindustry/server/ServerControl.java +++ b/server/src/io/anuke/mindustry/server/ServerControl.java @@ -11,6 +11,7 @@ import io.anuke.mindustry.game.GameMode; import io.anuke.mindustry.io.SaveIO; import io.anuke.mindustry.io.Version; import io.anuke.mindustry.net.Net; +import io.anuke.mindustry.net.NetConnection; import io.anuke.mindustry.net.NetEvents; import io.anuke.mindustry.net.Packets.ChatPacket; import io.anuke.mindustry.net.Packets.KickReason; @@ -75,25 +76,26 @@ public class ServerControl extends Module { Events.on(GameOverEvent.class, () -> { info("Game over!"); - Timers.runTask(10f, () -> { + for(NetConnection connection : Net.getConnections()){ + Net.kickConnection(connection.id, KickReason.gameover); + } + + if (mode != ShuffleMode.off) { + Array maps = mode == ShuffleMode.both ? world.maps().getAllMaps() : + mode == ShuffleMode.normal ? world.maps().getDefaultMaps() : world.maps().getCustomMaps(); + + Map previous = world.getMap(); + Map map = previous; + while (map == previous || !map.visible) map = maps.random(); + + info("Selected next map to be {0}.", map.name); + state.set(State.playing); + logic.reset(); + world.loadMap(map); + }else{ state.set(State.menu); Net.closeServer(); - - if (mode != ShuffleMode.off) { - Array maps = mode == ShuffleMode.both ? world.maps().getAllMaps() : - mode == ShuffleMode.normal ? world.maps().getDefaultMaps() : world.maps().getCustomMaps(); - - Map previous = world.getMap(); - Map map = previous; - while (map == previous || !map.visible) map = maps.random(); - - info("Selected next map to be {0}.", map.name); - state.set(State.playing); - logic.reset(); - world.loadMap(map); - host(); - } - }); + } }); info("&lcServer loaded. Type &ly'help'&lc for help.");