Show failure reason in message box when network savegame load fails

See: #412
This commit is contained in:
Jonathan G Rennison
2022-08-27 22:34:28 +01:00
parent edd8b29794
commit 7c78b22c48
3 changed files with 17 additions and 5 deletions

View File

@@ -646,7 +646,8 @@ bool ClientNetworkGameSocketHandler::IsConnected()
* DEF_CLIENT_RECEIVE_COMMAND has parameter: Packet *p * DEF_CLIENT_RECEIVE_COMMAND has parameter: Packet *p
************/ ************/
extern bool SafeLoad(const std::string &filename, SaveLoadOperation fop, DetailedFileType dft, GameMode newgm, Subdirectory subdir, struct LoadFilter *lf = nullptr); extern bool SafeLoad(const std::string &filename, SaveLoadOperation fop, DetailedFileType dft, GameMode newgm, Subdirectory subdir,
struct LoadFilter *lf = nullptr, std::string *error_detail = nullptr);
NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_FULL(Packet *p) NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_FULL(Packet *p)
{ {
@@ -941,14 +942,20 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_MAP_DONE(Packet
/* The map is done downloading, load it */ /* The map is done downloading, load it */
ClearErrorMessages(); ClearErrorMessages();
bool load_success = SafeLoad({}, SLO_LOAD, DFT_GAME_FILE, GM_NORMAL, NO_DIRECTORY, lf); std::string error_detail;
bool load_success = SafeLoad({}, SLO_LOAD, DFT_GAME_FILE, GM_NORMAL, NO_DIRECTORY, lf, &error_detail);
/* Long savegame loads shouldn't affect the lag calculation! */ /* Long savegame loads shouldn't affect the lag calculation! */
this->last_packet = std::chrono::steady_clock::now(); this->last_packet = std::chrono::steady_clock::now();
if (!load_success) { if (!load_success) {
DeleteWindowById(WC_NETWORK_STATUS_WINDOW, WN_NETWORK_STATUS_WINDOW_JOIN); DeleteWindowById(WC_NETWORK_STATUS_WINDOW, WN_NETWORK_STATUS_WINDOW_JOIN);
ShowErrorMessage(STR_NETWORK_ERROR_SAVEGAMEERROR, INVALID_STRING_ID, WL_CRITICAL); StringID detail = INVALID_STRING_ID;
if (!error_detail.empty()) {
detail = STR_JUST_RAW_STRING;
SetDParamStr(0, error_detail.c_str());
}
ShowErrorMessage(STR_NETWORK_ERROR_SAVEGAMEERROR, detail, WL_CRITICAL);
return NETWORK_RECV_STATUS_SAVEGAME; return NETWORK_RECV_STATUS_SAVEGAME;
} }
/* If the savegame has successfully loaded, ALL windows have been removed, /* If the savegame has successfully loaded, ALL windows have been removed,

View File

@@ -1161,8 +1161,10 @@ static void MakeNewEditorWorld()
* @param newgm switch to this mode of loading fails due to some unknown error * @param newgm switch to this mode of loading fails due to some unknown error
* @param subdir default directory to look for filename, set to 0 if not needed * @param subdir default directory to look for filename, set to 0 if not needed
* @param lf Load filter to use, if nullptr: use filename + subdir. * @param lf Load filter to use, if nullptr: use filename + subdir.
* @param error_detail Optional string to fill with detaied error information.
*/ */
bool SafeLoad(const std::string &filename, SaveLoadOperation fop, DetailedFileType dft, GameMode newgm, Subdirectory subdir, struct LoadFilter *lf = nullptr) bool SafeLoad(const std::string &filename, SaveLoadOperation fop, DetailedFileType dft, GameMode newgm, Subdirectory subdir,
struct LoadFilter *lf = nullptr, std::string *error_detail = nullptr)
{ {
assert(fop == SLO_LOAD); assert(fop == SLO_LOAD);
assert(dft == DFT_GAME_FILE || (lf == nullptr && dft == DFT_OLD_GAME_FILE)); assert(dft == DFT_GAME_FILE || (lf == nullptr && dft == DFT_OLD_GAME_FILE));
@@ -1174,6 +1176,7 @@ bool SafeLoad(const std::string &filename, SaveLoadOperation fop, DetailedFileTy
case SL_OK: return true; case SL_OK: return true;
case SL_REINIT: case SL_REINIT:
if (error_detail != nullptr) *error_detail = GetSaveLoadErrorString();
if (_network_dedicated) { if (_network_dedicated) {
/* /*
* We need to reinit a network map... * We need to reinit a network map...
@@ -1198,6 +1201,7 @@ bool SafeLoad(const std::string &filename, SaveLoadOperation fop, DetailedFileTy
return false; return false;
default: default:
if (error_detail != nullptr) *error_detail = GetSaveLoadErrorString();
_game_mode = ogm; _game_mode = ogm;
return false; return false;
} }

View File

@@ -129,7 +129,8 @@ static void *_dedicated_video_mem;
/* Whether a fork has been done. */ /* Whether a fork has been done. */
bool _dedicated_forks; bool _dedicated_forks;
extern bool SafeLoad(const std::string &filename, SaveLoadOperation fop, DetailedFileType dft, GameMode newgm, Subdirectory subdir, struct LoadFilter *lf = nullptr); extern bool SafeLoad(const std::string &filename, SaveLoadOperation fop, DetailedFileType dft, GameMode newgm, Subdirectory subdir,
struct LoadFilter *lf = nullptr, std::string *error_detail = nullptr);
static FVideoDriver_Dedicated iFVideoDriver_Dedicated; static FVideoDriver_Dedicated iFVideoDriver_Dedicated;