From 0422f40d80d9a80c17fb9bab76205c12d82898af Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Tue, 26 Mar 2019 17:02:40 +0100 Subject: [PATCH] - restored calling OnRegister for event handlers after loading a savegame It should be said in no uncertain terms that OnRegister operates on an uninitialized level so it should only be used for setting up the registering process of the event handler itself and nothing else - not even the event handler's data!!! --- src/events.cpp | 7 +++++++ src/events.h | 2 ++ src/p_saveg.cpp | 1 + 3 files changed, 10 insertions(+) diff --git a/src/events.cpp b/src/events.cpp index 5b39d7f547..69de8cca54 100755 --- a/src/events.cpp +++ b/src/events.cpp @@ -46,6 +46,13 @@ EventManager staticEventManager; EventManager eventManager; +void EventManager::CallOnRegister() +{ + for (DStaticEventHandler* handler = FirstEventHandler; handler; handler = handler->next) + { + handler->OnRegister(); + } +} bool EventManager::RegisterHandler(DStaticEventHandler* handler) { diff --git a/src/events.h b/src/events.h index 79c75023a7..7608dfa1ae 100755 --- a/src/events.h +++ b/src/events.h @@ -240,6 +240,8 @@ struct EventManager ~EventManager() { Shutdown(); } bool ShouldCallStatic(bool forplay); + // for use after loading a savegame. The old handler explicitly reinstalled all handlers instead of doing a list deserialization which resulted in OnRegister being called even when a save was loaded. + void CallOnRegister(); // register bool RegisterHandler(DStaticEventHandler* handler); // unregister diff --git a/src/p_saveg.cpp b/src/p_saveg.cpp index 7421185ee3..b7584bb1df 100644 --- a/src/p_saveg.cpp +++ b/src/p_saveg.cpp @@ -994,6 +994,7 @@ void FLevelLocals::Serialize(FSerializer &arc, bool hubload) // [ZZ] serialize events arc("firstevent", localEventManager->FirstEventHandler) ("lastevent", localEventManager->LastEventHandler); + localEventManager->CallOnRegister(); Thinkers.SerializeThinkers(arc, hubload); arc("polyobjs", Polyobjects); SerializeSubsectors(arc, "subsectors");