From d8716dfa8a93f1005c1c5497046e11d480bd0d50 Mon Sep 17 00:00:00 2001 From: rubidium Date: Wed, 30 Jun 2010 21:38:51 +0000 Subject: [PATCH] (svn r20039) -Fix [FS#3907]: instead of loading the intro game when loading a savegame fails on the dedicated server, generate a new game. Generating a new game is the least bad solution: * loading the intro game: desyncs due to GM_MENU on the server and GM_NORMAL on the clients, NewGRFs not being loaded on the server but being loaded on the client; * creating an empty map: OpenTTD will go crazy due to missing towns. Also clients can't properly join because of the missing towns; * loading the last saved game: doesn't always exist and loading it might fail causing an infinite loop; * stopping being a server: breaks the dedicated server horribly; if you loaded the game via rcon you can't connect with it anymore as you can't join the server; * generating a new game: should always succeed, although people might think a scenario loaded fine because there are no companies and such. --- src/openttd.cpp | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/openttd.cpp b/src/openttd.cpp index 0d37c2a8e7..2fe662fb06 100644 --- a/src/openttd.cpp +++ b/src/openttd.cpp @@ -872,6 +872,18 @@ bool SafeSaveOrLoad(const char *filename, int mode, GameMode newgm, Subdirectory case SL_OK: return true; case SL_REINIT: + if (_network_dedicated) { + /* + * We need to reinit a network map... + * We can't simply load the intro game here as that game has many + * special cases which make clients desync immediately. So we fall + * back to just generating a new game with the current settings. + */ + DEBUG(net, 0, "Loading game failed, so a new (random) game will be started!"); + MakeNewGame(false, true); + return false; + } + switch (ogm) { default: case GM_MENU: LoadIntroGame(); break; @@ -911,10 +923,10 @@ static void StartScenario() ResetGRFConfig(true); /* Load game */ - if (SaveOrLoad(_file_to_saveload.name, _file_to_saveload.mode, SCENARIO_DIR) != SL_OK) { - LoadIntroGame(); + if (!SafeSaveOrLoad(_file_to_saveload.name, _file_to_saveload.mode, GM_NORMAL, SCENARIO_DIR)) { SetDParamStr(0, GetSaveLoadErrorString()); ShowErrorMessage(STR_JUST_RAW_STRING, INVALID_STRING_ID, WL_ERROR); + return; } _settings_game.difficulty = _settings_newgame.difficulty; @@ -996,7 +1008,6 @@ void SwitchToMode(SwitchMode new_mode) ResetWindowSystem(); if (!SafeSaveOrLoad(_file_to_saveload.name, _file_to_saveload.mode, GM_NORMAL, NO_DIRECTORY)) { - LoadIntroGame(); SetDParamStr(0, GetSaveLoadErrorString()); ShowErrorMessage(STR_JUST_RAW_STRING, INVALID_STRING_ID, WL_ERROR); } else {