diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Conditions/ConditionMgr.cpp | 10 | ||||
-rw-r--r-- | src/server/game/Conditions/ConditionMgr.h | 5 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 16 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 1 |
4 files changed, 29 insertions, 3 deletions
diff --git a/src/server/game/Conditions/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp index 09965c06daf..0f3cd4ec353 100644 --- a/src/server/game/Conditions/ConditionMgr.cpp +++ b/src/server/game/Conditions/ConditionMgr.cpp @@ -905,6 +905,16 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond) } break; } + case CONDITION_SOURCE_TYPE_QUEST_ACCEPT: + { + Quest const *Quest = sObjectMgr.GetQuestTemplate(cond->mSourceEntry); + if (!Quest) + { + sLog.outErrorDb("CONDITION_SOURCE_TYPE_QUESTID specifies non-existing quest (%u), skipped", cond->mSourceEntry); + return false; + } + } + break; case CONDITION_SOURCE_TYPE_GOSSIP_MENU: case CONDITION_SOURCE_TYPE_GOSSIP_MENU_OPTION: case CONDITION_SOURCE_TYPE_NONE: diff --git a/src/server/game/Conditions/ConditionMgr.h b/src/server/game/Conditions/ConditionMgr.h index 0a0741e98ed..2a8803a6c8d 100644 --- a/src/server/game/Conditions/ConditionMgr.h +++ b/src/server/game/Conditions/ConditionMgr.h @@ -79,10 +79,11 @@ enum ConditionSourceType CONDITION_SOURCE_TYPE_GOSSIP_MENU_OPTION = 15,//DONE CONDITION_SOURCE_TYPE_CREATURE_TEMPLATE_VEHICLE = 16,//DONE CONDITION_SOURCE_TYPE_SPELL = 17,//DONE - CONDITION_SOURCE_TYPE_ITEM_REQUIRED_TARGET = 18//DONE + CONDITION_SOURCE_TYPE_ITEM_REQUIRED_TARGET = 18,//DONE + CONDITION_SOURCE_TYPE_QUEST_ACCEPT = 19//DONE }; -#define MAX_CONDITIONSOURCETYPE 19 +#define MAX_CONDITIONSOURCETYPE 20 struct Condition { diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index d5fe6e65cdd..0b972f0f469 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -14014,7 +14014,8 @@ bool Player::CanTakeQuest(Quest const *pQuest, bool msg) && SatisfyQuestPreviousQuest(pQuest, msg) && SatisfyQuestTimed(pQuest, msg) && SatisfyQuestNextChain(pQuest, msg) && SatisfyQuestPrevChain(pQuest, msg) && SatisfyQuestDay(pQuest, msg) && SatisfyQuestWeek(pQuest, msg) - && !sDisableMgr.IsDisabledFor(DISABLE_TYPE_QUEST, pQuest->GetQuestId(), this); + && !sDisableMgr.IsDisabledFor(DISABLE_TYPE_QUEST, pQuest->GetQuestId(), this) + && SatisfyQuestConditions(pQuest, msg); } bool Player::CanAddQuest(Quest const *pQuest, bool msg) @@ -14752,6 +14753,19 @@ bool Player::SatisfyQuestStatus(Quest const* qInfo, bool msg) return true; } +bool Player::SatisfyQuestConditions(Quest const* qInfo, bool msg) +{ + ConditionList conditions = sConditionMgr.GetConditionsForNotGroupedEntry(CONDITION_SOURCE_TYPE_QUEST_ACCEPT, qInfo->GetQuestId()); + if (!sConditionMgr.IsPlayerMeetToConditions(this, conditions)) + { + if (msg) + SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ); + sLog.outDebug("Player::SatisfyQuestConditions: conditions not met for quest %u", qInfo->GetQuestId()); + return false; + } + return true; +} + bool Player::SatisfyQuestTimed(Quest const* qInfo, bool msg) { if (!m_timedquests.empty() && qInfo->HasFlag(QUEST_TRINITY_FLAGS_TIMED)) diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index f60e4c9d13b..d40077aff4b 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1322,6 +1322,7 @@ class Player : public Unit, public GridObject<Player> bool SatisfyQuestRace(Quest const* qInfo, bool msg); bool SatisfyQuestReputation(Quest const* qInfo, bool msg); bool SatisfyQuestStatus(Quest const* qInfo, bool msg); + bool SatisfyQuestConditions(Quest const* qInfo, bool msg); bool SatisfyQuestTimed(Quest const* qInfo, bool msg); bool SatisfyQuestExclusiveGroup(Quest const* qInfo, bool msg); bool SatisfyQuestNextChain(Quest const* qInfo, bool msg); |