From 5fce047e6948e7950a1a903e4b754ef2874b7e69 Mon Sep 17 00:00:00 2001 From: VladimirMangos Date: Thu, 17 Mar 2011 21:38:42 +0300 Subject: [PATCH] [11261] Check gaps in quest RewChoiceItem* data. Client can crash if data not continues. Thanks Chero and Joey for help in research problem ^^ --- src/game/ObjectMgr.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/game/ObjectMgr.cpp b/src/game/ObjectMgr.cpp index 79fb495e7..c3b8fca31 100644 --- a/src/game/ObjectMgr.cpp +++ b/src/game/ObjectMgr.cpp @@ -4083,7 +4083,8 @@ void ObjectMgr::LoadQuests() } } - for(int j = 0; j < QUEST_REWARD_CHOICES_COUNT; ++j ) + bool choice_found = false; + for(int j = QUEST_REWARD_CHOICES_COUNT-1; j >=0; --j ) { if (uint32 id = qinfo->RewChoiceItemId[j]) { @@ -4093,6 +4094,8 @@ void ObjectMgr::LoadQuests() qinfo->GetQuestId(),j+1,id,id); qinfo->RewChoiceItemId[j] = 0; // no changes, quest will not reward this } + else + choice_found = true; if (!qinfo->RewChoiceItemCount[j]) { @@ -4101,6 +4104,14 @@ void ObjectMgr::LoadQuests() // no changes, quest can't be done } } + else if (choice_found) // client crash if have gap in item reward choices + { + sLog.outErrorDb("Quest %u has `RewChoiceItemId%d` = 0 but `RewChoiceItemId%d` = %u, client can crash at like data.", + qinfo->GetQuestId(),j+1,j+2,qinfo->RewChoiceItemId[j+1]); + // fill gap by clone later filled choice + qinfo->RewChoiceItemId[j] = qinfo->RewChoiceItemId[j+1]; + qinfo->RewChoiceItemCount[j] = qinfo->RewChoiceItemCount[j+1]; + } else if (qinfo->RewChoiceItemCount[j]>0) { sLog.outErrorDb("Quest %u has `RewChoiceItemId%d` = 0 but `RewChoiceItemCount%d` = %u.",