From 81cf9e3aa7b3621da27fefdbd4345e8b0734193b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udio=20Costa?= <54484196+claudiodfc@users.noreply.github.com> Date: Wed, 22 Dec 2021 11:37:01 +0000 Subject: [PATCH] fix(Core/Player): Quest Question marks (#9683) * fix(Core): Quest Question marks * extra changes * changes for players with repetable quests --- .../game/Entities/Creature/GossipDef.cpp | 8 +- .../game/Entities/Player/PlayerQuest.cpp | 84 ++++++++++++------- 2 files changed, 59 insertions(+), 33 deletions(-) diff --git a/src/server/game/Entities/Creature/GossipDef.cpp b/src/server/game/Entities/Creature/GossipDef.cpp index 5ed50ee2e..4f41cb996 100644 --- a/src/server/game/Entities/Creature/GossipDef.cpp +++ b/src/server/game/Entities/Creature/GossipDef.cpp @@ -218,8 +218,8 @@ void PlayerMenu::SendGossipMenu(uint32 titleTextId, ObjectGuid objectGUID) const data << uint32(questID); data << uint32(item.QuestIcon); data << int32(quest->GetQuestLevel()); - data << uint32(quest->GetFlags()); // 3.3.3 quest flags - data << uint8(0); // 3.3.3 changes icon: blue question or yellow exclamation + data << uint32(quest->GetFlags()); // 3.3.3 quest flags + data << uint8(quest->IsRepeatable() && !quest->IsDailyOrWeekly() && !quest->IsMonthly()); // 3.3.3 icon changes: blue question mark or yellow exclamation mark std::string title = quest->GetTitle(); int32 locale = _session->GetSessionDbLocaleIndex(); @@ -335,8 +335,8 @@ void PlayerMenu::SendQuestGiverQuestList(QEmote const& eEmote, const std::string data << uint32(questID); data << uint32(qmi.QuestIcon); data << int32(quest->GetQuestLevel()); - data << uint32(quest->GetFlags()); // 3.3.3 quest flags - data << uint8(0); // 3.3.3 changes icon: blue question or yellow exclamation + data << uint32(quest->GetFlags()); // 3.3.3 quest flags + data << uint8(quest->IsRepeatable() && !quest->IsDailyOrWeekly() && !quest->IsMonthly()); // 3.3.3 icon changes: blue question mark or yellow exclamation mark data << title; } } diff --git a/src/server/game/Entities/Player/PlayerQuest.cpp b/src/server/game/Entities/Player/PlayerQuest.cpp index bfdbf4c79..3f9e0b110 100644 --- a/src/server/game/Entities/Player/PlayerQuest.cpp +++ b/src/server/game/Entities/Player/PlayerQuest.cpp @@ -87,7 +87,9 @@ void Player::PrepareQuestMenu(ObjectGuid guid) if (!CanTakeQuest(quest, false)) continue; - if (quest->IsAutoComplete()) + if (quest->IsAutoComplete() && (!quest->IsRepeatable() || quest->IsDaily() || quest->IsWeekly() || quest->IsMonthly())) + qm.AddMenuItem(quest_id, 0); + else if (quest->IsAutoComplete()) qm.AddMenuItem(quest_id, 4); else if (GetQuestStatus(quest_id) == QUEST_STATUS_NONE) qm.AddMenuItem(quest_id, 2); @@ -1399,18 +1401,26 @@ QuestStatus Player::GetQuestStatus(uint32 quest_id) const if (quest_id) { QuestStatusMap::const_iterator itr = m_QuestStatus.find(quest_id); + if (itr != m_QuestStatus.end()) + { return itr->second.Status; + } if (Quest const* qInfo = sObjectMgr->GetQuestTemplate(quest_id)) { if (qInfo->IsSeasonal()) + { return SatisfyQuestSeasonal(qInfo, false) ? QUEST_STATUS_NONE : QUEST_STATUS_REWARDED; + } if (!qInfo->IsRepeatable() && IsQuestRewarded(quest_id)) + { return QUEST_STATUS_REWARDED; + } } } + return QUEST_STATUS_NONE; } @@ -1601,20 +1611,9 @@ QuestGiverStatus Player::GetQuestDialogStatus(Object* questgiver) QuestStatus status = GetQuestStatus(questId); if ((status == QUEST_STATUS_COMPLETE && !GetQuestRewardStatus(questId)) || (quest->IsAutoComplete() && CanTakeQuest(quest, false))) { - if (quest->IsRepeatable() && quest->IsDailyOrWeekly()) + if (quest->IsRepeatable() || quest->IsDailyOrWeekly()) { - if (quest->IsAutoComplete()) - { - result2 = DIALOG_STATUS_AVAILABLE_REP; - } - else - { - result2 = DIALOG_STATUS_REWARD_REP; - } - } - else if (quest->IsAutoComplete()) - { - result2 = DIALOG_STATUS_AVAILABLE; + result2 = DIALOG_STATUS_REWARD_REP; } else { @@ -1649,32 +1648,59 @@ QuestGiverStatus Player::GetQuestDialogStatus(Object* questgiver) { if (SatisfyQuestLevel(quest, false)) { - bool isLowLevel = (getLevel() > (GetQuestLevel(quest) + sWorld->getIntConfig(CONFIG_QUEST_LOW_LEVEL_HIDE_DIFF))); + bool isNotLowLevelQuest = getLevel() <= (GetQuestLevel(quest) + sWorld->getIntConfig(CONFIG_QUEST_LOW_LEVEL_HIDE_DIFF)); - if (quest->IsAutoComplete()) - { - if (isLowLevel) - result2 = DIALOG_STATUS_LOW_LEVEL_REWARD_REP; - else - result2 = DIALOG_STATUS_REWARD_REP; - } - else + if (quest->IsRepeatable()) { if (quest->IsDaily()) { - if (isLowLevel) - result2 = DIALOG_STATUS_LOW_LEVEL_AVAILABLE_REP; - else + if (isNotLowLevelQuest) + { result2 = DIALOG_STATUS_AVAILABLE_REP; + } + else + { + result2 = DIALOG_STATUS_LOW_LEVEL_AVAILABLE_REP; + } + } + else if (quest->IsWeekly() || quest->IsMonthly()) + { + if (isNotLowLevelQuest) + { + result2 = DIALOG_STATUS_AVAILABLE; + } + else + { + result2 = DIALOG_STATUS_LOW_LEVEL_AVAILABLE; + } + } + else if (quest->IsAutoComplete()) + { + if (isNotLowLevelQuest) + { + result2 = DIALOG_STATUS_REWARD_REP; + } + else + { + result2 = DIALOG_STATUS_LOW_LEVEL_REWARD_REP; + } } else { - if (isLowLevel) - result2 = DIALOG_STATUS_LOW_LEVEL_AVAILABLE; + if (isNotLowLevelQuest) + { + result2 = DIALOG_STATUS_REWARD_REP; + } else - result2 = DIALOG_STATUS_AVAILABLE; + { + result2 = DIALOG_STATUS_LOW_LEVEL_REWARD_REP; + } } } + else if (isNotLowLevelQuest) + { + result2 = DIALOG_STATUS_AVAILABLE; + } } else result2 = DIALOG_STATUS_UNAVAILABLE;