From 04fdc54522347d167ee1353bd18af73795b955b2 Mon Sep 17 00:00:00 2001 From: Chris Miles Date: Fri, 24 Feb 2023 13:22:47 -0600 Subject: [PATCH] [Quest API] Fix EVENT_TIMER crash when entity is no longer available (#2986) * [Quest API] Fix EVENT_TIMER crash when entity is no longer available * Update questmgr.cpp --- zone/questmgr.cpp | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/zone/questmgr.cpp b/zone/questmgr.cpp index 56c44a1f8..698b75ceb 100644 --- a/zone/questmgr.cpp +++ b/zone/questmgr.cpp @@ -88,19 +88,28 @@ void QuestManager::Process() { end = QTimerList.end(); while (cur != end) { if (cur->Timer_.Enabled() && cur->Timer_.Check()) { - if(entity_list.IsMobInZone(cur->mob)) { - if(cur->mob->IsNPC()) { + if (cur->mob && entity_list.IsMobInZone(cur->mob)) { + if (cur->mob->IsNPC()) { if (parse->HasQuestSub(cur->mob->GetNPCTypeID(), EVENT_TIMER)) { parse->EventNPC(EVENT_TIMER, cur->mob->CastToNPC(), nullptr, cur->name, 0); } - } else if (cur->mob->IsEncounter()) { - parse->EventEncounter(EVENT_TIMER, cur->mob->CastToEncounter()->GetEncounterName(), cur->name, 0, nullptr); - } else if (cur->mob->IsClient()) { + } + else if (cur->mob->IsEncounter()) { + parse->EventEncounter( + EVENT_TIMER, + cur->mob->CastToEncounter()->GetEncounterName(), + cur->name, + 0, + nullptr + ); + } + else if (cur->mob->IsClient()) { if (parse->PlayerHasQuestSub(EVENT_TIMER)) { //this is inheriently unsafe if we ever make it so more than npc/client start timers parse->EventPlayer(EVENT_TIMER, cur->mob->CastToClient(), cur->name, 0); } - } else if (cur->mob->IsBot()) { + } + else if (cur->mob->IsBot()) { if (parse->BotHasQuestSub(EVENT_TIMER)) { parse->EventBot(EVENT_TIMER, cur->mob->CastToBot(), nullptr, cur->name, 0); } @@ -109,12 +118,15 @@ void QuestManager::Process() { //we MUST reset our iterator since the quest could have removed/added any //number of timers... worst case we have to check a bunch of timers twice cur = QTimerList.begin(); - end = QTimerList.end(); //dunno if this is needed, cant hurt... - } else { + end = QTimerList.end(); //dunno if this is needed, cant hurt... + } + else { cur = QTimerList.erase(cur); } - } else + } + else { ++cur; + } } auto cur_iter = STimerList.begin();