@@ -150,47 +150,50 @@ BSTEventResult QuestService::OnEvent(const TESQuestStageEvent* apEvent, const Ev
150150
151151void QuestService::OnQuestUpdate (const NotifyQuestUpdate& aUpdate) noexcept
152152{
153- ModSystem& modSystem = World::Get ().GetModSystem ();
154- uint32_t formId = modSystem.GetGameId (aUpdate.Id );
155- TESQuest* pQuest = Cast<TESQuest>(TESForm::GetById (formId));
156- if (!pQuest)
153+ m_world.GetRunner ().Queue ([this , update = aUpdate]()
157154 {
158- spdlog::error (" Failed to find quest, base id: {:X}, mod id: {:X}" , aUpdate.Id .BaseId , aUpdate.Id .ModId );
159- return ;
160- }
155+ ModSystem& modSystem = World::Get ().GetModSystem ();
156+ uint32_t formId = modSystem.GetGameId (update.Id );
157+ TESQuest* pQuest = Cast<TESQuest>(TESForm::GetById (formId));
158+ if (!pQuest)
159+ {
160+ spdlog::error (" Failed to find quest, base id: {:X}, mod id: {:X}" , update.Id .BaseId , update.Id .ModId );
161+ return ;
162+ }
161163
162- if (pQuest->type == TESQuest::Type::None || pQuest->type == TESQuest::Type::Miscellaneous)
163- {
164- spdlog::info (__FUNCTION__ " : receiving type none/misc quest update gameId {:X} questStage {} questStatus {} questType {} formId {:X} name {}" ,
165- aUpdate .Id .LogFormat (), aUpdate .Stage , aUpdate .Status ,
166- aUpdate .ClientQuestType , formId, pQuest->fullName .value .AsAscii ());
167- }
164+ if (pQuest->type == TESQuest::Type::None || pQuest->type == TESQuest::Type::Miscellaneous)
165+ {
166+ spdlog::info (__FUNCTION__ " : receiving type none/misc quest update gameId {:X} questStage {} questStatus {} questType {} formId {:X} name {}" ,
167+ update .Id .LogFormat (), update .Stage , update .Status ,
168+ update .ClientQuestType , formId, pQuest->fullName .value .AsAscii ());
169+ }
168170
169- bool bResult = false ;
170- switch (aUpdate .Status )
171- {
172- case NotifyQuestUpdate::Started:
173- {
174- pQuest->ScriptSetStage (aUpdate .Stage );
175- pQuest->SetActive (true );
176- bResult = true ;
177- spdlog::info (" Remote quest started: {:X}, stage: {}" , formId, aUpdate .Stage );
178- break ;
179- }
180- case NotifyQuestUpdate::StageUpdate:
181- pQuest->ScriptSetStage (aUpdate .Stage );
182- bResult = true ;
183- spdlog::info (" Remote quest updated: {:X}, stage: {}" , formId, aUpdate .Stage );
184- break ;
185- case NotifyQuestUpdate::Stopped:
186- bResult = StopQuest (formId);
187- spdlog::info (" Remote quest stopped: {:X}, stage: {}" , formId, aUpdate .Stage );
188- break ;
189- default : break ;
190- }
171+ bool bResult = false ;
172+ switch (update .Status )
173+ {
174+ case NotifyQuestUpdate::Started:
175+ {
176+ pQuest->ScriptSetStage (update .Stage );
177+ pQuest->SetActive (true );
178+ bResult = true ;
179+ spdlog::info (" Remote quest started: {:X}, stage: {}" , formId, update .Stage );
180+ break ;
181+ }
182+ case NotifyQuestUpdate::StageUpdate:
183+ pQuest->ScriptSetStage (update .Stage );
184+ bResult = true ;
185+ spdlog::info (" Remote quest updated: {:X}, stage: {}" , formId, update .Stage );
186+ break ;
187+ case NotifyQuestUpdate::Stopped:
188+ bResult = StopQuest (formId);
189+ spdlog::info (" Remote quest stopped: {:X}, stage: {}" , formId, update .Stage );
190+ break ;
191+ default : break ;
192+ }
191193
192- if (!bResult)
193- spdlog::error (" Failed to update the client quest state, quest: {:X}, stage: {}, status: {}" , formId, aUpdate.Stage , aUpdate.Status );
194+ if (!bResult)
195+ spdlog::error (" Failed to update the client quest state, quest: {:X}, stage: {}, status: {}" , formId, update.Stage , update.Status );
196+ });
194197}
195198
196199bool QuestService::StopQuest (uint32_t aformId)
0 commit comments