From fd69241de9150d1702613a0c2a805c8917000907 Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 25 Sep 2019 16:44:55 -0400 Subject: [PATCH] Bugfixes --- .../io/anuke/mindustry/core/NetServer.java | 22 ++++++++++++----- .../io/anuke/mindustry/net/NetConnection.java | 2 +- .../anuke/mindustry/server/ServerControl.java | 24 ++++++++++++------- 3 files changed, 32 insertions(+), 16 deletions(-) diff --git a/core/src/io/anuke/mindustry/core/NetServer.java b/core/src/io/anuke/mindustry/core/NetServer.java index ce80e1e2c0..4198b01538 100644 --- a/core/src/io/anuke/mindustry/core/NetServer.java +++ b/core/src/io/anuke/mindustry/core/NetServer.java @@ -405,13 +405,18 @@ public class NetServer implements ApplicationListener{ return; } - if(player.con.hasConnected){ - Events.fire(new PlayerLeave(player)); - Call.sendMessage("[accent]" + player.name + "[accent] has disconnected."); - Call.onPlayerDisconnect(player.id); + if(!player.con.hasDisconnected){ + if(player.con.hasConnected){ + Events.fire(new PlayerLeave(player)); + Call.sendMessage("[accent]" + player.name + "[accent] has disconnected."); + Call.onPlayerDisconnect(player.id); + } + + Log.info("&lm[{1}] &lc{0} has disconnected. &lg&fi({2})", player.name, player.uuid, reason); } + player.remove(); - Log.info("&lm[{1}] &lc{0} has disconnected. &lg&fi({2})", player.name, player.uuid, reason); + player.con.hasDisconnected = true; } private static float compound(float speed, float drag){ @@ -709,7 +714,12 @@ public class NetServer implements ApplicationListener{ //iterate through each player for(int i = 0; i < playerGroup.size(); i++){ Player player = playerGroup.all().get(i); - if(player.isLocal || player.con == null) continue; + if(player.isLocal) continue; + + if(player.con == null || !player.con.isConnected()){ + onDisconnect(player, "disappeared"); + continue; + } NetConnection connection = player.con; diff --git a/core/src/io/anuke/mindustry/net/NetConnection.java b/core/src/io/anuke/mindustry/net/NetConnection.java index 9334fd78c8..a6bea925ba 100644 --- a/core/src/io/anuke/mindustry/net/NetConnection.java +++ b/core/src/io/anuke/mindustry/net/NetConnection.java @@ -22,7 +22,7 @@ public abstract class NetConnection{ /** Timestamp of last recieved snapshot. */ public long lastRecievedClientTime; - public boolean hasConnected, hasBegunConnecting; + public boolean hasConnected, hasBegunConnecting, hasDisconnected; public float viewWidth, viewHeight, viewX, viewY; public NetConnection(String address){ diff --git a/server/src/io/anuke/mindustry/server/ServerControl.java b/server/src/io/anuke/mindustry/server/ServerControl.java index d554c85cbc..98f4f22a68 100644 --- a/server/src/io/anuke/mindustry/server/ServerControl.java +++ b/server/src/io/anuke/mindustry/server/ServerControl.java @@ -151,20 +151,24 @@ public class ServerControl implements ApplicationListener{ if(Core.settings.getBool("shuffle")){ if(maps.all().size > 0){ - Array maps = Vars.maps.customMaps().size == 0 ? Vars.maps.defaultMaps() : Vars.maps.customMaps(); + Array maps = Array.with(Vars.maps.customMaps().size == 0 ? Vars.maps.defaultMaps() : Vars.maps.customMaps()); + maps.shuffle(); Map previous = world.getMap(); - Map map = maps.random(previous); + Map map = maps.find(m -> lastMode.valid(m) && m != previous); - Call.onInfoMessage((state.rules.pvp - ? "[YELLOW]The " + event.winner.name() + " team is victorious![]" : "[SCARLET]Game over![]") - + "\nNext selected map:[accent] " + map.name() + "[]" - + (map.tags.containsKey("author") && !map.tags.get("author").trim().isEmpty() ? " by[accent] " + map.author() + "[]" : "") + "." + - "\nNew game begins in " + roundExtraTime + "[] seconds."); + if(map != null){ - info("Selected next map to be {0}.", map.name()); + Call.onInfoMessage((state.rules.pvp + ? "[YELLOW]The " + event.winner.name() + " team is victorious![]" : "[SCARLET]Game over![]") + + "\nNext selected map:[accent] " + map.name() + "[]" + + (map.tags.containsKey("author") && !map.tags.get("author").trim().isEmpty() ? " by[accent] " + map.author() + "[]" : "") + "." + + "\nNew game begins in " + roundExtraTime + "[] seconds."); - play(true, () -> world.loadMap(map, map.applyRules(lastMode))); + info("Selected next map to be {0}.", map.name()); + + play(true, () -> world.loadMap(map, map.applyRules(lastMode))); + } } }else{ netServer.kickAll(KickReason.gameover); @@ -813,6 +817,8 @@ public class ServerControl implements ApplicationListener{ state.rules = world.getMap().applyRules(lastMode); for(Player p : players){ + if(p.con == null) continue; + p.reset(); if(state.rules.pvp){ p.setTeam(netServer.assignTeam(p, new ArrayIterable<>(players)));