Skip to content

Commit

Permalink
[11261] Check gaps in quest RewChoiceItem* data.
Browse files Browse the repository at this point in the history
Client can crash if data not continues.

Thanks Chero and Joey for help in research problem ^^
  • Loading branch information
VladimirMangos committed Mar 17, 2011
1 parent 35c203a commit a2d5f15
Showing 1 changed file with 12 additions and 1 deletion.
13 changes: 12 additions & 1 deletion src/game/ObjectMgr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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])
{
Expand All @@ -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])
{
Expand All @@ -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.",
Expand Down

0 comments on commit a2d5f15

Please sign in to comment.