Core/Quest: do not save/load Dungeon Finder/daily/repeatable quests as completed (#17458)

* Core/Quest: do not save/load Dungeon Finder/daily/repeatable quests as completed
This commit is contained in:
SnapperRy
2016-07-05 09:53:08 +02:00
committed by Aokromes
parent 5ce8886050
commit a8a8ff596d
3 changed files with 15 additions and 3 deletions

View File

@@ -15124,8 +15124,11 @@ void Player::RewardQuest(Quest const* quest, uint32 reward, Object* questGiver,
SetSeasonalQuestStatus(quest_id);
RemoveActiveQuest(quest_id, false);
m_RewardedQuests.insert(quest_id);
m_RewardedQuestsSave[quest_id] = QUEST_DEFAULT_SAVE_TYPE;
if (quest->CanIncreaseRewardedQuestCounters())
{
m_RewardedQuests.insert(quest_id);
m_RewardedQuestsSave[quest_id] = QUEST_DEFAULT_SAVE_TYPE;
}
// StoreNewItem, mail reward, etc. save data directly to the database
// to prevent exploitable data desynchronisation we save the quest status to the database too
@@ -18517,7 +18520,8 @@ void Player::_LoadQuestStatusRewarded(PreparedQueryResult result)
AddQuestRewardedTalentCount(talents);
}
m_RewardedQuests.insert(quest_id);
if (quest->CanIncreaseRewardedQuestCounters())
m_RewardedQuests.insert(quest_id);
}
while (result->NextRow());
}

View File

@@ -416,3 +416,10 @@ uint32 Quest::CalculateHonorGain(uint8 level) const
return honor;
}
bool Quest::CanIncreaseRewardedQuestCounters() const
{
// Dungeon Finder/Daily/Repeatable (if not weekly, monthly or seasonal) quests are never considered rewarded serverside.
// This affects counters and client requests for completed quests.
return (!IsDFQuest() && !IsDaily() && (!IsRepeatable() || IsWeekly() || IsMonthly() || IsSeasonal()));
}

View File

@@ -302,6 +302,7 @@ class Quest
bool IsAllowedInRaid(Difficulty difficulty) const;
bool IsDFQuest() const { return (SpecialFlags & QUEST_SPECIAL_FLAGS_DF_QUEST) != 0; }
uint32 CalculateHonorGain(uint8 level) const;
bool CanIncreaseRewardedQuestCounters() const;
// multiple values
std::string ObjectiveText[QUEST_OBJECTIVES_COUNT];