diff options
Diffstat (limited to 'src/server/game/Conditions/ConditionMgr.cpp')
| -rw-r--r-- | src/server/game/Conditions/ConditionMgr.cpp | 144 | 
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: | 
