diff --git a/src/network/network_client.cpp b/src/network/network_client.cpp index 94aa83c0b4..319f9c5277 100644 --- a/src/network/network_client.cpp +++ b/src/network/network_client.cpp @@ -136,6 +136,7 @@ void ClientNetworkEmergencySave() { if (!_settings_client.gui.autosave_on_network_disconnect) return; if (!_networking) return; + if (!ClientNetworkGameSocketHandler::EmergencySavePossible()) return; const char *filename = "netsave.sav"; DEBUG(net, 0, "Client: Performing emergency save (%s)", filename); @@ -344,6 +345,14 @@ void ClientNetworkGameSocketHandler::ClientError(NetworkRecvStatus res) return true; } +/* static */ bool ClientNetworkGameSocketHandler::EmergencySavePossible() +{ + if (!my_client) return false; + if (my_client->emergency_save_done) return false; + my_client->emergency_save_done = true; + return true; +} + /** Our client's connection. */ ClientNetworkGameSocketHandler * ClientNetworkGameSocketHandler::my_client = nullptr; diff --git a/src/network/network_client.h b/src/network/network_client.h index 707b2cd2cc..91c0b4e6d6 100644 --- a/src/network/network_client.h +++ b/src/network/network_client.h @@ -40,6 +40,7 @@ private: FILE *desync_log_file = nullptr; std::string server_desync_log; + bool emergency_save_done = false; protected: friend void NetworkExecuteLocalCommandQueue(); @@ -111,6 +112,8 @@ public: static void Send(); static bool Receive(); static bool GameLoop(); + + static bool EmergencySavePossible(); }; /** Helper to make the code look somewhat nicer. */