fix(Core/Player): Quest Question marks (#9683)

* fix(Core): Quest Question marks

* extra changes

* changes for players with repetable quests
This commit is contained in:
Cláudio Costa
2021-12-22 11:37:01 +00:00
committed by GitHub
parent d07c3c32c2
commit 81cf9e3aa7
2 changed files with 59 additions and 33 deletions

View File

@@ -218,8 +218,8 @@ void PlayerMenu::SendGossipMenu(uint32 titleTextId, ObjectGuid objectGUID) const
data << uint32(questID); data << uint32(questID);
data << uint32(item.QuestIcon); data << uint32(item.QuestIcon);
data << int32(quest->GetQuestLevel()); data << int32(quest->GetQuestLevel());
data << uint32(quest->GetFlags()); // 3.3.3 quest flags data << uint32(quest->GetFlags()); // 3.3.3 quest flags
data << uint8(0); // 3.3.3 changes icon: blue question or yellow exclamation 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(); std::string title = quest->GetTitle();
int32 locale = _session->GetSessionDbLocaleIndex(); int32 locale = _session->GetSessionDbLocaleIndex();
@@ -335,8 +335,8 @@ void PlayerMenu::SendQuestGiverQuestList(QEmote const& eEmote, const std::string
data << uint32(questID); data << uint32(questID);
data << uint32(qmi.QuestIcon); data << uint32(qmi.QuestIcon);
data << int32(quest->GetQuestLevel()); data << int32(quest->GetQuestLevel());
data << uint32(quest->GetFlags()); // 3.3.3 quest flags data << uint32(quest->GetFlags()); // 3.3.3 quest flags
data << uint8(0); // 3.3.3 changes icon: blue question or yellow exclamation data << uint8(quest->IsRepeatable() && !quest->IsDailyOrWeekly() && !quest->IsMonthly()); // 3.3.3 icon changes: blue question mark or yellow exclamation mark
data << title; data << title;
} }
} }

View File

@@ -87,7 +87,9 @@ void Player::PrepareQuestMenu(ObjectGuid guid)
if (!CanTakeQuest(quest, false)) if (!CanTakeQuest(quest, false))
continue; 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); qm.AddMenuItem(quest_id, 4);
else if (GetQuestStatus(quest_id) == QUEST_STATUS_NONE) else if (GetQuestStatus(quest_id) == QUEST_STATUS_NONE)
qm.AddMenuItem(quest_id, 2); qm.AddMenuItem(quest_id, 2);
@@ -1399,18 +1401,26 @@ QuestStatus Player::GetQuestStatus(uint32 quest_id) const
if (quest_id) if (quest_id)
{ {
QuestStatusMap::const_iterator itr = m_QuestStatus.find(quest_id); QuestStatusMap::const_iterator itr = m_QuestStatus.find(quest_id);
if (itr != m_QuestStatus.end()) if (itr != m_QuestStatus.end())
{
return itr->second.Status; return itr->second.Status;
}
if (Quest const* qInfo = sObjectMgr->GetQuestTemplate(quest_id)) if (Quest const* qInfo = sObjectMgr->GetQuestTemplate(quest_id))
{ {
if (qInfo->IsSeasonal()) if (qInfo->IsSeasonal())
{
return SatisfyQuestSeasonal(qInfo, false) ? QUEST_STATUS_NONE : QUEST_STATUS_REWARDED; return SatisfyQuestSeasonal(qInfo, false) ? QUEST_STATUS_NONE : QUEST_STATUS_REWARDED;
}
if (!qInfo->IsRepeatable() && IsQuestRewarded(quest_id)) if (!qInfo->IsRepeatable() && IsQuestRewarded(quest_id))
{
return QUEST_STATUS_REWARDED; return QUEST_STATUS_REWARDED;
}
} }
} }
return QUEST_STATUS_NONE; return QUEST_STATUS_NONE;
} }
@@ -1601,20 +1611,9 @@ QuestGiverStatus Player::GetQuestDialogStatus(Object* questgiver)
QuestStatus status = GetQuestStatus(questId); QuestStatus status = GetQuestStatus(questId);
if ((status == QUEST_STATUS_COMPLETE && !GetQuestRewardStatus(questId)) || (quest->IsAutoComplete() && CanTakeQuest(quest, false))) 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_REWARD_REP;
{
result2 = DIALOG_STATUS_AVAILABLE_REP;
}
else
{
result2 = DIALOG_STATUS_REWARD_REP;
}
}
else if (quest->IsAutoComplete())
{
result2 = DIALOG_STATUS_AVAILABLE;
} }
else else
{ {
@@ -1649,32 +1648,59 @@ QuestGiverStatus Player::GetQuestDialogStatus(Object* questgiver)
{ {
if (SatisfyQuestLevel(quest, false)) 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 (quest->IsRepeatable())
{
if (isLowLevel)
result2 = DIALOG_STATUS_LOW_LEVEL_REWARD_REP;
else
result2 = DIALOG_STATUS_REWARD_REP;
}
else
{ {
if (quest->IsDaily()) if (quest->IsDaily())
{ {
if (isLowLevel) if (isNotLowLevelQuest)
result2 = DIALOG_STATUS_LOW_LEVEL_AVAILABLE_REP; {
else
result2 = DIALOG_STATUS_AVAILABLE_REP; 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 else
{ {
if (isLowLevel) if (isNotLowLevelQuest)
result2 = DIALOG_STATUS_LOW_LEVEL_AVAILABLE; {
result2 = DIALOG_STATUS_REWARD_REP;
}
else else
result2 = DIALOG_STATUS_AVAILABLE; {
result2 = DIALOG_STATUS_LOW_LEVEL_REWARD_REP;
}
} }
} }
else if (isNotLowLevelQuest)
{
result2 = DIALOG_STATUS_AVAILABLE;
}
} }
else else
result2 = DIALOG_STATUS_UNAVAILABLE; result2 = DIALOG_STATUS_UNAVAILABLE;