diff --git a/src/game/ObjectMgr.cpp b/src/game/ObjectMgr.cpp index 1e7e2b0f2..dad541015 100644 --- a/src/game/ObjectMgr.cpp +++ b/src/game/ObjectMgr.cpp @@ -7397,8 +7397,7 @@ bool PlayerCondition::Meets(Player const * player) const return player->GetQuestRewardStatus(value1); case CONDITION_QUESTTAKEN: { - QuestStatus status = player->GetQuestStatus(value1); - return (status == QUEST_STATUS_INCOMPLETE); + return player->IsCurrentQuest(value1); } case CONDITION_AD_COMMISSION_AURA: { diff --git a/src/game/Player.cpp b/src/game/Player.cpp index 1ca0a2abf..1dbdefb23 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -13086,6 +13086,15 @@ bool Player::IsActiveQuest( uint32 quest_id ) const return itr != mQuestStatus.end() && itr->second.m_status != QUEST_STATUS_NONE; } +bool Player::IsCurrentQuest( uint32 quest_id ) const +{ + QuestStatusMap::const_iterator itr = mQuestStatus.find(quest_id); + if (itr == mQuestStatus.end()) + return false; + + return itr->second.m_status == QUEST_STATUS_INCOMPLETE || itr->second.m_status == QUEST_STATUS_COMPLETE && !itr->second.m_rewarded; +} + Quest const * Player::GetNextQuest( uint64 guid, Quest const *pQuest ) { Object *pObject; @@ -13760,8 +13769,7 @@ bool Player::SatisfyQuestPreviousQuest( Quest const* qInfo, bool msg ) const return true; } // If any of the negative previous quests active, return true - if (*iter < 0 && (i_prevstatus->second.m_status == QUEST_STATUS_INCOMPLETE - || (i_prevstatus->second.m_status == QUEST_STATUS_COMPLETE && !GetQuestRewardStatus(prevId)))) + if (*iter < 0 && IsCurrentQuest(prevId)) { // skip one-from-all exclusive group if (qPrevInfo->GetExclusiveGroup() >= 0) @@ -13782,12 +13790,8 @@ bool Player::SatisfyQuestPreviousQuest( Quest const* qInfo, bool msg ) const if (exclude_Id == prevId) continue; - QuestStatusMap::const_iterator i_exstatus = mQuestStatus.find( exclude_Id ); - // alternative quest from group also must be active - if (i_exstatus == mQuestStatus.end() || - i_exstatus->second.m_status != QUEST_STATUS_INCOMPLETE && - (i_prevstatus->second.m_status != QUEST_STATUS_COMPLETE || GetQuestRewardStatus(prevId))) + if (!IsCurrentQuest(exclude_Id)) { if (msg) SendCanTakeQuestResponse( INVALIDREASON_DONT_HAVE_REQ ); @@ -13939,18 +13943,12 @@ bool Player::SatisfyQuestPrevChain( Quest const* qInfo, bool msg ) const { uint32 prevId = *iter; - QuestStatusMap::const_iterator i_prevstatus = mQuestStatus.find( prevId ); - - if (i_prevstatus != mQuestStatus.end()) + // If any of the previous quests in chain active, return false + if (IsCurrentQuest(prevId)) { - // If any of the previous quests in chain active, return false - if (i_prevstatus->second.m_status == QUEST_STATUS_INCOMPLETE - || (i_prevstatus->second.m_status == QUEST_STATUS_COMPLETE && !GetQuestRewardStatus(prevId))) - { - if (msg) - SendCanTakeQuestResponse( INVALIDREASON_DONT_HAVE_REQ ); - return false; - } + if (msg) + SendCanTakeQuestResponse( INVALIDREASON_DONT_HAVE_REQ ); + return false; } // check for all quests further down the chain @@ -14083,13 +14081,10 @@ QuestStatus Player::GetQuestStatus( uint32 quest_id ) const bool Player::CanShareQuest(uint32 quest_id) const { - Quest const* qInfo = sObjectMgr.GetQuestTemplate(quest_id); - if( qInfo && qInfo->HasFlag(QUEST_FLAGS_SHARABLE) ) - { - QuestStatusMap::const_iterator itr = mQuestStatus.find( quest_id ); - if( itr != mQuestStatus.end() ) - return itr->second.m_status == QUEST_STATUS_NONE || itr->second.m_status == QUEST_STATUS_INCOMPLETE; - } + if (Quest const* qInfo = sObjectMgr.GetQuestTemplate(quest_id)) + if (qInfo->HasFlag(QUEST_FLAGS_SHARABLE)) + return IsCurrentQuest(quest_id); + return false; } diff --git a/src/game/Player.h b/src/game/Player.h index 73777085d..7567e4570 100644 --- a/src/game/Player.h +++ b/src/game/Player.h @@ -1324,7 +1324,8 @@ class MANGOS_DLL_SPEC Player : public Unit void PrepareQuestMenu( uint64 guid ); void SendPreparedQuest( uint64 guid ); - bool IsActiveQuest( uint32 quest_id ) const; + bool IsActiveQuest( uint32 quest_id ) const; // can be taken or taken + bool IsCurrentQuest( uint32 quest_id ) const; // taken and not yet rewarded Quest const *GetNextQuest( uint64 guid, Quest const *pQuest ); bool CanSeeStartQuest( Quest const *pQuest ) const; bool CanTakeQuest( Quest const *pQuest, bool msg ) const; diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 07922f557..be125c81e 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "10042" + #define REVISION_NR "10043" #endif // __REVISION_NR_H__