diff options
Diffstat (limited to 'src/server/game/Handlers/MiscHandler.cpp')
-rw-r--r-- | src/server/game/Handlers/MiscHandler.cpp | 29 |
1 files changed, 19 insertions, 10 deletions
diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp index 2ffacd75ff9..0f8ad12a769 100644 --- a/src/server/game/Handlers/MiscHandler.cpp +++ b/src/server/game/Handlers/MiscHandler.cpp @@ -489,9 +489,10 @@ void WorldSession::HandleAreaTriggerOpcode(WorldPackets::AreaTrigger::AreaTrigge if (player->IsAlive()) { + // not using Player::UpdateQuestObjectiveProgress, ObjectID in quest_objectives can be set to -1, areatrigger_involvedrelation then holds correct id if (std::unordered_set<uint32> const* quests = sObjectMgr->GetQuestsForAreaTrigger(packet.AreaTriggerID)) { - bool completedObjectiveInSequencedQuest = false; + bool anyObjectiveChangedCompletionState = false; for (uint32 questId : *quests) { Quest const* qInfo = sObjectMgr->GetQuestTemplate(questId); @@ -500,14 +501,22 @@ void WorldSession::HandleAreaTriggerOpcode(WorldPackets::AreaTrigger::AreaTrigge { for (QuestObjective const& obj : qInfo->Objectives) { - if (obj.Type == QUEST_OBJECTIVE_AREATRIGGER && !player->IsQuestObjectiveComplete(slot, qInfo, obj)) - { - player->SetQuestObjectiveData(obj, 1); - player->SendQuestUpdateAddCreditSimple(obj); - if (qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_SEQUENCED_OBJECTIVES)) - completedObjectiveInSequencedQuest = true; - break; - } + if (obj.Type != QUEST_OBJECTIVE_AREATRIGGER) + continue; + + if (!player->IsQuestObjectiveCompletable(slot, qInfo, obj)) + continue; + + if (player->IsQuestObjectiveComplete(slot, qInfo, obj)) + continue; + + if (obj.ObjectID != -1 && obj.ObjectID != packet.AreaTriggerID) + continue; + + player->SetQuestObjectiveData(obj, 1); + player->SendQuestUpdateAddCreditSimple(obj); + anyObjectiveChangedCompletionState = true; + break; } if (player->CanCompleteQuest(questId)) @@ -515,7 +524,7 @@ void WorldSession::HandleAreaTriggerOpcode(WorldPackets::AreaTrigger::AreaTrigge } } - if (completedObjectiveInSequencedQuest) + if (anyObjectiveChangedCompletionState) player->UpdateForQuestWorldObjects(); } } |