diff --git a/src/game/QuestHandler.cpp b/src/game/QuestHandler.cpp index 71c57b424..a0b787299 100644 --- a/src/game/QuestHandler.cpp +++ b/src/game/QuestHandler.cpp @@ -34,8 +34,7 @@ void WorldSession::HandleQuestgiverStatusQueryOpcode( WorldPacket & recv_data ) { uint64 guid; recv_data >> guid; - uint8 questStatus = DIALOG_STATUS_NONE; - uint8 defstatus = DIALOG_STATUS_NONE; + uint8 dialogStatus = DIALOG_STATUS_NONE; Object* questgiver = _player->GetObjectByTypeMask(guid, TYPEMASK_CREATURE_OR_GAMEOBJECT); @@ -55,10 +54,10 @@ void WorldSession::HandleQuestgiverStatusQueryOpcode( WorldPacket & recv_data ) if (!cr_questgiver->IsHostileTo(_player)) // not show quest status to enemies { - questStatus = Script->NPCDialogStatus(_player, cr_questgiver); + dialogStatus = Script->NPCDialogStatus(_player, cr_questgiver); - if (questStatus > DIALOG_STATUS_REWARD_REP) - questStatus = getDialogStatus(_player, cr_questgiver, defstatus); + if (dialogStatus > DIALOG_STATUS_REWARD_REP) + dialogStatus = getDialogStatus(_player, cr_questgiver, DIALOG_STATUS_NONE); } break; } @@ -67,10 +66,10 @@ void WorldSession::HandleQuestgiverStatusQueryOpcode( WorldPacket & recv_data ) DEBUG_LOG("WORLD: Received CMSG_QUESTGIVER_STATUS_QUERY for GameObject guid = %u", uint32(GUID_LOPART(guid))); GameObject* go_questgiver = (GameObject*)questgiver; - questStatus = Script->GODialogStatus(_player, go_questgiver); + dialogStatus = Script->GODialogStatus(_player, go_questgiver); - if (questStatus > DIALOG_STATUS_REWARD_REP) - questStatus = getDialogStatus(_player, go_questgiver, defstatus); + if (dialogStatus > DIALOG_STATUS_REWARD_REP) + dialogStatus = getDialogStatus(_player, go_questgiver, DIALOG_STATUS_NONE); break; } @@ -80,7 +79,7 @@ void WorldSession::HandleQuestgiverStatusQueryOpcode( WorldPacket & recv_data ) } //inform client about status of quest - _player->PlayerTalkClass->SendQuestGiverStatus(questStatus, guid); + _player->PlayerTalkClass->SendQuestGiverStatus(dialogStatus, guid); } void WorldSession::HandleQuestgiverHelloOpcode(WorldPacket & recv_data) @@ -550,7 +549,7 @@ void WorldSession::HandleQuestPushResult(WorldPacket& recvPacket) uint32 WorldSession::getDialogStatus(Player *pPlayer, Object* questgiver, uint32 defstatus) { - uint32 result = defstatus; + uint32 dialogStatus = defstatus; QuestRelations const* qir; QuestRelations const* qr; @@ -575,66 +574,73 @@ uint32 WorldSession::getDialogStatus(Player *pPlayer, Object* questgiver, uint32 return DIALOG_STATUS_NONE; } - for(QuestRelations::const_iterator i = qir->lower_bound(questgiver->GetEntry()); i != qir->upper_bound(questgiver->GetEntry()); ++i ) + for(QuestRelations::const_iterator i = qir->lower_bound(questgiver->GetEntry()); i != qir->upper_bound(questgiver->GetEntry()); ++i) { - uint32 result2 = 0; + uint32 dialogStatusNew = 0; uint32 quest_id = i->second; Quest const *pQuest = sObjectMgr.GetQuestTemplate(quest_id); - if ( !pQuest ) continue; - QuestStatus status = pPlayer->GetQuestStatus( quest_id ); - if( (status == QUEST_STATUS_COMPLETE && !pPlayer->GetQuestRewardStatus(quest_id)) || - (pQuest->IsAutoComplete() && pPlayer->CanTakeQuest(pQuest, false)) ) - { - if ( pQuest->IsAutoComplete() && pQuest->IsRepeatable() ) - result2 = DIALOG_STATUS_REWARD_REP; - else - result2 = DIALOG_STATUS_REWARD; - } - else if ( status == QUEST_STATUS_INCOMPLETE ) - result2 = DIALOG_STATUS_INCOMPLETE; - - if (result2 > result) - result = result2; - } - - for(QuestRelations::const_iterator i = qr->lower_bound(questgiver->GetEntry()); i != qr->upper_bound(questgiver->GetEntry()); ++i ) - { - uint32 result2 = 0; - uint32 quest_id = i->second; - Quest const *pQuest = sObjectMgr.GetQuestTemplate(quest_id); - if ( !pQuest ) + if (!pQuest) continue; - QuestStatus status = pPlayer->GetQuestStatus( quest_id ); - if ( status == QUEST_STATUS_NONE ) + QuestStatus status = pPlayer->GetQuestStatus(quest_id); + + if ((status == QUEST_STATUS_COMPLETE && !pPlayer->GetQuestRewardStatus(quest_id)) || + (pQuest->IsAutoComplete() && pPlayer->CanTakeQuest(pQuest, false))) { - if ( pPlayer->CanSeeStartQuest( pQuest ) ) + if (pQuest->IsAutoComplete() && pQuest->IsRepeatable()) + dialogStatusNew = DIALOG_STATUS_REWARD_REP; + else + dialogStatusNew = DIALOG_STATUS_REWARD; + } + else if (status == QUEST_STATUS_INCOMPLETE) + dialogStatusNew = DIALOG_STATUS_INCOMPLETE; + + if (dialogStatusNew > dialogStatus) + dialogStatus = dialogStatusNew; + } + + for(QuestRelations::const_iterator i = qr->lower_bound(questgiver->GetEntry()); i != qr->upper_bound(questgiver->GetEntry()); ++i) + { + uint32 dialogStatusNew = 0; + uint32 quest_id = i->second; + Quest const *pQuest = sObjectMgr.GetQuestTemplate(quest_id); + + if (!pQuest) + continue; + + QuestStatus status = pPlayer->GetQuestStatus(quest_id); + + if (status == QUEST_STATUS_NONE) + { + if (pPlayer->CanSeeStartQuest(pQuest)) { - if ( pPlayer->SatisfyQuestLevel(pQuest, false) ) + if (pPlayer->SatisfyQuestLevel(pQuest, false)) { - if ( pQuest->IsAutoComplete() || (pQuest->IsRepeatable() && pPlayer->getQuestStatusMap()[quest_id].m_rewarded)) - result2 = DIALOG_STATUS_REWARD_REP; - else if (pPlayer->getLevel() <= pPlayer->GetQuestLevelForPlayer(pQuest) + sWorld.getConfig(CONFIG_UINT32_QUEST_LOW_LEVEL_HIDE_DIFF) ) + if (pQuest->IsAutoComplete() || (pQuest->IsRepeatable() && pPlayer->getQuestStatusMap()[quest_id].m_rewarded)) + { + dialogStatusNew = DIALOG_STATUS_REWARD_REP; + } + else if (pPlayer->getLevel() <= pPlayer->GetQuestLevelForPlayer(pQuest) + sWorld.getConfig(CONFIG_UINT32_QUEST_LOW_LEVEL_HIDE_DIFF)) { if (pQuest->HasFlag(QUEST_FLAGS_DAILY) || pQuest->HasFlag(QUEST_FLAGS_WEEKLY)) - result2 = DIALOG_STATUS_AVAILABLE_REP; + dialogStatusNew = DIALOG_STATUS_AVAILABLE_REP; else - result2 = DIALOG_STATUS_AVAILABLE; + dialogStatusNew = DIALOG_STATUS_AVAILABLE; } else - result2 = DIALOG_STATUS_LOW_LEVEL_AVAILABLE; + dialogStatusNew = DIALOG_STATUS_LOW_LEVEL_AVAILABLE; } else - result2 = DIALOG_STATUS_UNAVAILABLE; + dialogStatusNew = DIALOG_STATUS_UNAVAILABLE; } } - if (result2 > result) - result = result2; + if (dialogStatusNew > dialogStatus) + dialogStatus = dialogStatusNew; } - return result; + return dialogStatus; } void WorldSession::HandleQuestgiverStatusMultipleQuery(WorldPacket& /*recvPacket*/) @@ -648,8 +654,7 @@ void WorldSession::HandleQuestgiverStatusMultipleQuery(WorldPacket& /*recvPacket for(ObjectGuidSet::const_iterator itr = _player->m_clientGUIDs.begin(); itr != _player->m_clientGUIDs.end(); ++itr) { - uint8 questStatus = DIALOG_STATUS_NONE; - uint8 defstatus = DIALOG_STATUS_NONE; + uint8 dialogStatus = DIALOG_STATUS_NONE; if (itr->IsCreatureOrPet()) { @@ -662,13 +667,13 @@ void WorldSession::HandleQuestgiverStatusMultipleQuery(WorldPacket& /*recvPacket if (!questgiver->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER)) continue; - questStatus = Script->NPCDialogStatus(_player, questgiver); + dialogStatus = Script->NPCDialogStatus(_player, questgiver); - if (questStatus > DIALOG_STATUS_REWARD_REP) - questStatus = getDialogStatus(_player, questgiver, defstatus); + if (dialogStatus > DIALOG_STATUS_REWARD_REP) + dialogStatus = getDialogStatus(_player, questgiver, DIALOG_STATUS_NONE); data << uint64(questgiver->GetGUID()); - data << uint8(questStatus); + data << uint8(dialogStatus); ++count; } else if (itr->IsGameobject()) @@ -681,13 +686,13 @@ void WorldSession::HandleQuestgiverStatusMultipleQuery(WorldPacket& /*recvPacket if (questgiver->GetGoType() != GAMEOBJECT_TYPE_QUESTGIVER) continue; - questStatus = Script->GODialogStatus(_player, questgiver); + dialogStatus = Script->GODialogStatus(_player, questgiver); - if (questStatus > DIALOG_STATUS_REWARD_REP) - questStatus = getDialogStatus(_player, questgiver, defstatus); + if (dialogStatus > DIALOG_STATUS_REWARD_REP) + dialogStatus = getDialogStatus(_player, questgiver, DIALOG_STATUS_NONE); data << uint64(questgiver->GetGUID()); - data << uint8(questStatus); + data << uint8(dialogStatus); ++count; } } diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 3c258e4a1..2a6f283a6 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 "10031" + #define REVISION_NR "10032" #endif // __REVISION_NR_H__