diff options
Diffstat (limited to 'src/server/game/Conditions/ConditionMgr.cpp')
-rw-r--r-- | src/server/game/Conditions/ConditionMgr.cpp | 30 |
1 files changed, 29 insertions, 1 deletions
diff --git a/src/server/game/Conditions/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp index 917e61bb8d7..667b8b14889 100644 --- a/src/server/game/Conditions/ConditionMgr.cpp +++ b/src/server/game/Conditions/ConditionMgr.cpp @@ -110,7 +110,8 @@ ConditionMgr::ConditionTypeInfo const ConditionMgr::StaticConditionTypeData[COND { "Charmed", false, false, false }, { "Pet type", true, false, false }, { "On Taxi", false, false, false }, - { "Quest state mask", true, true, false } + { "Quest state mask", true, true, false }, + { "Objective Complete", true, false, false } }; // Checks if object meets the condition @@ -500,6 +501,20 @@ bool Condition::Meets(ConditionSourceInfo& sourceInfo) const } break; } + case CONDITION_QUEST_OBJECTIVE_COMPLETE: + { + if (Player* player = object->ToPlayer()) + { + QuestObjective const* obj = sObjectMgr->GetQuestObjective(ConditionValue1); + if (!obj) + break; + Quest const* qInfo = sObjectMgr->GetQuestTemplate(obj->QuestID); + ASSERT(qInfo); + + condMeets = (!player->GetQuestRewardStatus(obj->QuestID) && player->IsQuestObjectiveComplete(qInfo, *obj)); + } + break; + } default: condMeets = false; break; @@ -696,6 +711,9 @@ uint32 Condition::GetSearcherTypeMaskForCondition() const case CONDITION_QUESTSTATE: mask |= GRID_MAP_TYPE_MASK_PLAYER; break; + case CONDITION_QUEST_OBJECTIVE_COMPLETE: + mask |= GRID_MAP_TYPE_MASK_PLAYER; + break; default: ASSERT(false && "Condition::GetSearcherTypeMaskForCondition - missing condition handling!"); break; @@ -2314,6 +2332,16 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond) const } break; } + case CONDITION_QUEST_OBJECTIVE_COMPLETE: + { + QuestObjective const* obj = sObjectMgr->GetQuestObjective(cond->ConditionValue1); + if (!obj) + { + TC_LOG_ERROR("sql.sql", "%s points to non-existing quest objective (%u), skipped.", cond->ToString(true).c_str(), cond->ConditionValue1); + return false; + } + break; + } case CONDITION_PET_TYPE: if (cond->ConditionValue1 >= (1 << MAX_PET_TYPE)) { |