diff --git a/src/network/network_client.cpp b/src/network/network_client.cpp index a66786dade..e083e6c1a4 100644 --- a/src/network/network_client.cpp +++ b/src/network/network_client.cpp @@ -211,16 +211,23 @@ void ClientNetworkGameSocketHandler::ClientError(NetworkRecvStatus res) default: errorno = NETWORK_ERROR_GENERAL; break; } - /* This means we fucked up and the server closed the connection */ - if (res != NETWORK_RECV_STATUS_SERVER_ERROR && res != NETWORK_RECV_STATUS_SERVER_FULL && - res != NETWORK_RECV_STATUS_SERVER_BANNED) { + if (res == NETWORK_RECV_STATUS_SERVER_ERROR || res == NETWORK_RECV_STATUS_SERVER_FULL || + res == NETWORK_RECV_STATUS_SERVER_BANNED) { + /* This means the server closed the connection. Emergency save is + * already created if this was appropriate during handling of the + * disconnect. */ + this->CloseConnection(res); + } else { + /* This means we as client made a boo-boo. */ SendError(errorno); + + /* Close connection before we make an emergency save, as the save can + * take a bit of time; better that the server doesn't stall while we + * are doing the save, and already disconnects us. */ + this->CloseConnection(res); + ClientNetworkEmergencySave(); } - this->CloseConnection(res); - - ClientNetworkEmergencySave(); - _switch_mode = SM_MENU; _networking = false; }