diff options
Diffstat (limited to 'src/server/game/Conditions/ConditionMgr.cpp')
-rw-r--r-- | src/server/game/Conditions/ConditionMgr.cpp | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/src/server/game/Conditions/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp index 621d48112f2..917e61bb8d7 100644 --- a/src/server/game/Conditions/ConditionMgr.cpp +++ b/src/server/game/Conditions/ConditionMgr.cpp @@ -109,7 +109,8 @@ ConditionMgr::ConditionTypeInfo const ConditionMgr::StaticConditionTypeData[COND { "Daily Quest Completed",true, false, false }, { "Charmed", false, false, false }, { "Pet type", true, false, false }, - { "On Taxi", false, false, false } + { "On Taxi", false, false, false }, + { "Quest state mask", true, true, false } }; // Checks if object meets the condition @@ -484,6 +485,21 @@ bool Condition::Meets(ConditionSourceInfo& sourceInfo) const condMeets = player->IsInFlight(); break; } + case CONDITION_QUESTSTATE: + { + if (Player* player = object->ToPlayer()) + { + if ( + ((ConditionValue2 & (1 << QUEST_STATUS_NONE)) && (player->GetQuestStatus(ConditionValue1) == QUEST_STATUS_NONE)) || + ((ConditionValue2 & (1 << QUEST_STATUS_COMPLETE)) && (player->GetQuestStatus(ConditionValue1) == QUEST_STATUS_COMPLETE)) || + ((ConditionValue2 & (1 << QUEST_STATUS_INCOMPLETE)) && (player->GetQuestStatus(ConditionValue1) == QUEST_STATUS_INCOMPLETE)) || + ((ConditionValue2 & (1 << QUEST_STATUS_FAILED)) && (player->GetQuestStatus(ConditionValue1) == QUEST_STATUS_FAILED)) || + ((ConditionValue2 & (1 << QUEST_STATUS_REWARDED)) && player->GetQuestRewardStatus(ConditionValue1)) + ) + condMeets = true; + } + break; + } default: condMeets = false; break; @@ -677,6 +693,9 @@ uint32 Condition::GetSearcherTypeMaskForCondition() const case CONDITION_TAXI: mask |= GRID_MAP_TYPE_MASK_PLAYER; break; + case CONDITION_QUESTSTATE: + mask |= GRID_MAP_TYPE_MASK_PLAYER; + break; default: ASSERT(false && "Condition::GetSearcherTypeMaskForCondition - missing condition handling!"); break; @@ -1930,6 +1949,13 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond) const } break; } + case CONDITION_QUESTSTATE: + if (cond->ConditionValue2 >= (1 << MAX_QUEST_STATUS)) + { + TC_LOG_ERROR("sql.sql", "%s has invalid state mask (%u), skipped.", cond->ToString(true).c_str(), cond->ConditionValue2); + return false; + } + // intentional missing break case CONDITION_QUESTREWARDED: case CONDITION_QUESTTAKEN: case CONDITION_QUEST_NONE: |