From a3059033f2e68eaeb9d0d84a917b126c6c8b33c0 Mon Sep 17 00:00:00 2001 From: Ivan Savenko Date: Fri, 17 Mar 2023 16:00:47 +0200 Subject: [PATCH] Fixes broken client state, e.g. movement. Effectively reverts #1663 --- ChangeLog.md | 1 - client/Client.cpp | 10 ++++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/ChangeLog.md b/ChangeLog.md index f9e598e2b..91a29cbad 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -54,7 +54,6 @@ * Hero movement speed now matches H3 * Improved performance of adventure map rendering * Fixed embarking and disembarking sounds -* Fixed loading of sleeping status and movement path of heroes * Fixed selection of "new week" animation for status window * Object render order now mostly matches H3 diff --git a/client/Client.cpp b/client/Client.cpp index 2eb619a13..d153722af 100644 --- a/client/Client.cpp +++ b/client/Client.cpp @@ -202,6 +202,15 @@ void CClient::loadGame(CGameState * initializedGameState) initPlayerEnvironments(); + // Loading of client state - disabled for now + // Since client no longer writes or loads its own state and instead receives it from server + // client state serializer will serialize its own copies of all pointers, e.g. heroes/towns/objects + // and on deserialize will create its own copies (instead of using copies from state received from server) + // Potential solutions: + // 1) Use server gamestate to deserialize pointers, so any pointer to same object will point to server instance and not our copy + // 2) Remove all serialization of pointers with instance ID's and restore them on load (including AI deserializer code) + // 3) Completely remove client savegame and send all information, like hero paths and sleeping status to server (either in form of hero properties or as some generic "client options" message +#ifdef BROKEN_CLIENT_STATE_SERIALIZATION_HAS_BEEN_FIXED // try to deserialize client data including sleepingHeroes try { @@ -219,6 +228,7 @@ void CClient::loadGame(CGameState * initializedGameState) { logGlobal->info("Cannot load client data for game %s. Error: %s", CSH->si->mapname, e.what()); } +#endif initPlayerInterfaces(); }