mirror of https://github.com/OpenTTD/OpenTTD
Fix #10568: "can savegame be loaded check" failed in dedicated server
* If loading fails, it usually returns SL_REINIT which doesn't trigger check * If savegame has NewGRFs, it complains NewGRFs are not allowed in intro gamepull/10573/head
parent
be69aa6257
commit
24b5033a06
|
@ -969,37 +969,51 @@ bool SafeLoad(const std::string &filename, SaveLoadOperation fop, DetailedFileTy
|
||||||
|
|
||||||
_game_mode = newgm;
|
_game_mode = newgm;
|
||||||
|
|
||||||
switch (lf == nullptr ? SaveOrLoad(filename, fop, dft, subdir) : LoadWithFilter(lf)) {
|
SaveOrLoadResult result = (lf == nullptr) ? SaveOrLoad(filename, fop, dft, subdir) : LoadWithFilter(lf);
|
||||||
case SL_OK: return true;
|
if (result == SL_OK) return true;
|
||||||
|
|
||||||
case SL_REINIT:
|
if (_network_dedicated && ogm == GM_MENU) {
|
||||||
if (_network_dedicated) {
|
/*
|
||||||
/*
|
* If we are a dedicated server *and* we just were in the menu, then we
|
||||||
* We need to reinit a network map...
|
* are loading the first savegame. If that fails, not starting the
|
||||||
* We can't simply load the intro game here as that game has many
|
* server is a better reaction than starting the server with a newly
|
||||||
* special cases which make clients desync immediately. So we fall
|
* generated map as it is quite likely to be started from a script.
|
||||||
* back to just generating a new game with the current settings.
|
*/
|
||||||
*/
|
Debug(net, 0, "Loading requested map failed; closing server.");
|
||||||
Debug(net, 0, "Loading game failed, so a new (random) game will be started");
|
_exit_game = true;
|
||||||
MakeNewGame(false, true);
|
return false;
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (_network_server) {
|
|
||||||
/* We can't load the intro game as server, so disconnect first. */
|
|
||||||
NetworkDisconnect();
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (ogm) {
|
|
||||||
default:
|
|
||||||
case GM_MENU: LoadIntroGame(); break;
|
|
||||||
case GM_EDITOR: MakeNewEditorWorld(); break;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
|
|
||||||
default:
|
|
||||||
_game_mode = ogm;
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (result != SL_REINIT) {
|
||||||
|
_game_mode = ogm;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_network_dedicated) {
|
||||||
|
/*
|
||||||
|
* If we are a dedicated server, have already loaded/started a game,
|
||||||
|
* and then loading the savegame fails in a manner that we need to
|
||||||
|
* reinitialize everything. We must not fall back into the menu mode
|
||||||
|
* with the intro game, as that is unjoinable by clients. So there is
|
||||||
|
* nothing else to do than start a new game, as it might have failed
|
||||||
|
* trying to reload the originally loaded savegame/scenario.
|
||||||
|
*/
|
||||||
|
Debug(net, 0, "Loading game failed, so a new (random) game will be started");
|
||||||
|
MakeNewGame(false, true);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_network_server) {
|
||||||
|
/* We can't load the intro game as server, so disconnect first. */
|
||||||
|
NetworkDisconnect();
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (ogm) {
|
||||||
|
default:
|
||||||
|
case GM_MENU: LoadIntroGame(); break;
|
||||||
|
case GM_EDITOR: MakeNewEditorWorld(); break;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SwitchToMode(SwitchMode new_mode)
|
void SwitchToMode(SwitchMode new_mode)
|
||||||
|
|
|
@ -251,17 +251,6 @@ void VideoDriver_Dedicated::MainLoop()
|
||||||
/* If SwitchMode is SM_LOAD_GAME, it means that the user used the '-g' options */
|
/* If SwitchMode is SM_LOAD_GAME, it means that the user used the '-g' options */
|
||||||
if (_switch_mode != SM_LOAD_GAME) {
|
if (_switch_mode != SM_LOAD_GAME) {
|
||||||
StartNewGameWithoutGUI(GENERATE_NEW_SEED);
|
StartNewGameWithoutGUI(GENERATE_NEW_SEED);
|
||||||
} else {
|
|
||||||
/* First we need to test if the savegame can be loaded, else we will end up playing the
|
|
||||||
* intro game... */
|
|
||||||
if (SaveOrLoad(_file_to_saveload.name, _file_to_saveload.file_op, _file_to_saveload.detail_ftype, BASE_DIR) == SL_ERROR) {
|
|
||||||
/* Loading failed, pop out.. */
|
|
||||||
Debug(net, 0, "Loading requested map failed; closing server.");
|
|
||||||
return;
|
|
||||||
} else {
|
|
||||||
/* We can load this game, so go ahead */
|
|
||||||
_switch_mode = SM_LOAD_GAME;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
this->is_game_threaded = false;
|
this->is_game_threaded = false;
|
||||||
|
|
Loading…
Reference in New Issue