aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Conditions/ConditionMgr.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Conditions/ConditionMgr.cpp')
-rw-r--r--src/server/game/Conditions/ConditionMgr.cpp144
1 files changed, 96 insertions, 48 deletions
diff --git a/src/server/game/Conditions/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp
index 71ee0029477..df88362328a 100644
--- a/src/server/game/Conditions/ConditionMgr.cpp
+++ b/src/server/game/Conditions/ConditionMgr.cpp
@@ -67,54 +67,56 @@ char const* const ConditionMgr::StaticSourceTypeData[CONDITION_SOURCE_TYPE_MAX]
ConditionMgr::ConditionTypeInfo const ConditionMgr::StaticConditionTypeData[CONDITION_MAX] =
{
- { "None", false, false, false },
- { "Aura", true, true, true },
- { "Item Stored", true, true, true },
- { "Item Equipped", true, false, false },
- { "Zone", true, false, false },
- { "Reputation", true, true, false },
- { "Team", true, false, false },
- { "Skill", true, true, false },
- { "Quest Rewarded", true, false, false },
- { "Quest Taken", true, false, false },
- { "Drunken", true, false, false },
- { "WorldState", true, true, false },
- { "Active Event", true, false, false },
- { "Instance Info", true, true, true },
- { "Quest None", true, false, false },
- { "Class", true, false, false },
- { "Race", true, false, false },
- { "Achievement", true, false, false },
- { "Title", true, false, false },
- { "SpawnMask", true, false, false },
- { "Gender", true, false, false },
- { "Unit State", true, false, false },
- { "Map", true, false, false },
- { "Area", true, false, false },
- { "CreatureType", true, false, false },
- { "Spell Known", true, false, false },
- { "PhaseMask", true, false, false },
- { "Level", true, true, false },
- { "Quest Completed", true, false, false },
- { "Near Creature", true, true, true },
- { "Near GameObject", true, true, false },
- { "Object Entry or Guid", true, true, true },
- { "Object TypeMask", true, false, false },
- { "Relation", true, true, false },
- { "Reaction", true, true, false },
- { "Distance", true, true, true },
- { "Alive", false, false, false },
- { "Health Value", true, true, false },
- { "Health Pct", true, true, false },
- { "Realm Achievement", true, false, false },
- { "In Water", false, false, false },
- { "Terrain Swap", false, false, false },
- { "Sit/stand state", true, true, false },
- { "Daily Quest Completed",true, false, false },
- { "Charmed", false, false, false },
- { "Pet type", true, false, false },
- { "On Taxi", false, false, false },
- { "Quest state mask", true, true, false }
+ { "None", false, false, false },
+ { "Aura", true, true, true },
+ { "Item Stored", true, true, true },
+ { "Item Equipped", true, false, false },
+ { "Zone", true, false, false },
+ { "Reputation", true, true, false },
+ { "Team", true, false, false },
+ { "Skill", true, true, false },
+ { "Quest Rewarded", true, false, false },
+ { "Quest Taken", true, false, false },
+ { "Drunken", true, false, false },
+ { "WorldState", true, true, false },
+ { "Active Event", true, false, false },
+ { "Instance Info", true, true, true },
+ { "Quest None", true, false, false },
+ { "Class", true, false, false },
+ { "Race", true, false, false },
+ { "Achievement", true, false, false },
+ { "Title", true, false, false },
+ { "SpawnMask", true, false, false },
+ { "Gender", true, false, false },
+ { "Unit State", true, false, false },
+ { "Map", true, false, false },
+ { "Area", true, false, false },
+ { "CreatureType", true, false, false },
+ { "Spell Known", true, false, false },
+ { "PhaseMask", true, false, false },
+ { "Level", true, true, false },
+ { "Quest Completed", true, false, false },
+ { "Near Creature", true, true, true },
+ { "Near GameObject", true, true, false },
+ { "Object Entry or Guid", true, true, true },
+ { "Object TypeMask", true, false, false },
+ { "Relation", true, true, false },
+ { "Reaction", true, true, false },
+ { "Distance", true, true, true },
+ { "Alive", false, false, false },
+ { "Health Value", true, true, false },
+ { "Health Pct", true, true, false },
+ { "Realm Achievement", true, false, false },
+ { "In Water", false, false, false },
+ { "Terrain Swap", false, false, false },
+ { "Sit/stand state", true, true, false },
+ { "Daily Quest Completed", true, false, false },
+ { "Charmed", false, false, false },
+ { "Pet type", true, false, false },
+ { "On Taxi", false, false, false },
+ { "Quest state mask", true, true, false },
+ { "Quest objective progress", true, true, true },
+ { "Is Gamemaster", true, false, false }
};
// Checks if object meets the condition
@@ -499,6 +501,21 @@ bool Condition::Meets(ConditionSourceInfo& sourceInfo) const
}
break;
}
+ case CONDITION_QUEST_OBJECTIVE_PROGRESS:
+ {
+ if (Player* player = object->ToPlayer())
+ {
+ const Quest* quest = sObjectMgr->GetQuestTemplate(ConditionValue1);
+ uint16 log_slot = player->FindQuestSlot(quest->GetQuestId());
+ uint32 progressCount = 0;
+ if (log_slot < MAX_QUEST_LOG_SIZE)
+ progressCount = player->GetQuestSlotCounter(log_slot, ConditionValue2);
+ if (progressCount == ConditionValue3)
+ condMeets = true;
+ }
+ break;
+ }
+
case CONDITION_GAMEMASTER:
{
if (Player* player = object->ToPlayer())
@@ -697,6 +714,9 @@ uint32 Condition::GetSearcherTypeMaskForCondition() const
case CONDITION_QUESTSTATE:
mask |= GRID_MAP_TYPE_MASK_PLAYER;
break;
+ case CONDITION_QUEST_OBJECTIVE_PROGRESS:
+ mask |= GRID_MAP_TYPE_MASK_PLAYER;
+ break;
case CONDITION_GAMEMASTER:
mask |= GRID_MAP_TYPE_MASK_PLAYER;
break;
@@ -2270,6 +2290,34 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond) const
return false;
}
break;
+ case CONDITION_QUEST_OBJECTIVE_PROGRESS:
+ {
+ const Quest* quest = sObjectMgr->GetQuestTemplate(cond->ConditionValue1);
+ if (!quest)
+ {
+ TC_LOG_ERROR("sql.sql", "%s points to non-existing quest (%u), skipped.", cond->ToString(true).c_str(), cond->ConditionValue1);
+ return false;
+ }
+
+ if (cond->ConditionValue2 < 0 || cond->ConditionValue2 > 3)
+ {
+ TC_LOG_ERROR("sql.sql", "%s has out-of-range quest objective index specified (%u), it must be a number between 0 and 3. skipped.", cond->ToString(true).c_str(), cond->ConditionValue2);
+ return false;
+ }
+
+ if (quest->RequiredNpcOrGo[cond->ConditionValue2] == 0)
+ {
+ TC_LOG_ERROR("sql.sql", "%s has quest objective %u for quest %u, but the field RequiredNPCOrGo%u is 0, skipped.", cond->ToString(true).c_str(), cond->ConditionValue2, cond->ConditionValue1, cond->ConditionValue2);
+ return false;
+ }
+
+ if (cond->ConditionValue3 > quest->RequiredNpcOrGoCount[cond->ConditionValue2])
+ {
+ TC_LOG_ERROR("sql.sql", "%s has quest objective count %u in value3, but quest %u has a maximum objective count of %u in RequiredNPCOrGOCount%u, skipped.", cond->ToString(true).c_str(), cond->ConditionValue3, cond->ConditionValue2, quest->RequiredNpcOrGoCount[cond->ConditionValue2], cond->ConditionValue2);
+ return false;
+ }
+ break;
+ }
case CONDITION_IN_WATER:
case CONDITION_CHARMED:
case CONDITION_TAXI: