aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Achievements/AchievementMgr.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Achievements/AchievementMgr.cpp')
-rw-r--r--src/server/game/Achievements/AchievementMgr.cpp67
1 files changed, 28 insertions, 39 deletions
diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp
index a76564d8b77..1fc0b8bf304 100644
--- a/src/server/game/Achievements/AchievementMgr.cpp
+++ b/src/server/game/Achievements/AchievementMgr.cpp
@@ -426,7 +426,7 @@ bool AchievementCriteriaData::Meets(uint32 criteria_id, Player const* source, Wo
}
case ACHIEVEMENT_CRITERIA_DATA_TYPE_S_EQUIPPED_ITEM:
{
- AchievementCriteriaEntry const* entry = ASSERT_NOTNULL(sAchievementMgr->GetAchievementCriteria(criteria_id));
+ AchievementCriteriaEntry const* entry = sAchievementCriteriaStore.AssertEntry(criteria_id);
uint32 itemId = (entry->Type == ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM ? miscValue2 : miscValue1);
ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(itemId);
@@ -477,9 +477,8 @@ bool AchievementCriteriaDataSet::Meets(Player const* source, WorldObject const*
return true;
}
-AchievementMgr::AchievementMgr(Player* player)
+AchievementMgr::AchievementMgr(Player* player) : m_player(player), m_achievementPoints(0)
{
- m_player = player;
}
AchievementMgr::~AchievementMgr() { }
@@ -501,6 +500,7 @@ void AchievementMgr::Reset()
}
m_completedAchievements.clear();
+ m_achievementPoints = 0;
m_criteriaProgress.clear();
DeleteFromDB(m_player->GetGUID());
@@ -522,7 +522,7 @@ void AchievementMgr::ResetAchievementCriteria(AchievementCriteriaCondition condi
for (AchievementCriteriaEntry const* achievementCriteria : *achievementCriteriaList)
{
- AchievementEntry const* achievement = sAchievementMgr->GetAchievement(achievementCriteria->AchievementID);
+ AchievementEntry const* achievement = sAchievementStore.LookupEntry(achievementCriteria->AchievementID);
if (!achievement)
continue;
@@ -610,7 +610,7 @@ void AchievementMgr::LoadFromDB(PreparedQueryResult achievementResult, PreparedQ
uint32 achievementid = fields[0].GetUInt16();
// must not happen: cleanup at server startup in sAchievementMgr->LoadCompletedAchievements()
- AchievementEntry const* achievement = sAchievementMgr->GetAchievement(achievementid);
+ AchievementEntry const* achievement = sAchievementStore.LookupEntry(achievementid);
if (!achievement)
continue;
@@ -618,6 +618,8 @@ void AchievementMgr::LoadFromDB(PreparedQueryResult achievementResult, PreparedQ
ca.date = time_t(fields[1].GetUInt32());
ca.changed = false;
+ m_achievementPoints += achievement->Points;
+
// title achievement rewards are retroactive
if (AchievementReward const* reward = sAchievementMgr->GetAchievementReward(achievement))
if (uint32 titleId = reward->TitleId[Player::TeamForRace(GetPlayer()->GetRace()) == ALLIANCE ? 0 : 1])
@@ -636,7 +638,7 @@ void AchievementMgr::LoadFromDB(PreparedQueryResult achievementResult, PreparedQ
uint32 counter = fields[1].GetUInt32();
time_t date = time_t(fields[2].GetUInt32());
- AchievementCriteriaEntry const* criteria = sAchievementMgr->GetAchievementCriteria(id);
+ AchievementCriteriaEntry const* criteria = sAchievementCriteriaStore.LookupEntry(id);
if (!criteria)
{
// Removing non-existing criteria data for all characters
@@ -784,7 +786,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
AchievementCriteriaEntryList const& achievementCriteriaList = sAchievementMgr->GetAchievementCriteriaByType(type, miscValue1);
for (AchievementCriteriaEntry const* achievementCriteria : achievementCriteriaList)
{
- AchievementEntry const* achievement = sAchievementMgr->GetAchievement(achievementCriteria->AchievementID);
+ AchievementEntry const* achievement = sAchievementStore.LookupEntry(achievementCriteria->AchievementID);
if (!CanUpdateCriteria(achievementCriteria, achievement, miscValue1, miscValue2, ref))
continue;
@@ -1051,13 +1053,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
break;
case ACHIEVEMENT_CRITERIA_TYPE_EARN_ACHIEVEMENT_POINTS:
if (!miscValue1)
- {
- uint32 points = 0;
- for (std::pair<uint32 const, CompletedAchievementData> const& completedAchievement : m_completedAchievements)
- if (AchievementEntry const* completedAchievements = sAchievementMgr->GetAchievement(completedAchievement.first))
- points += completedAchievements->Points;
- SetCriteriaProgress(achievementCriteria, points, PROGRESS_SET);
- }
+ SetCriteriaProgress(achievementCriteria, m_achievementPoints, PROGRESS_SET);
else
SetCriteriaProgress(achievementCriteria, miscValue1, PROGRESS_ACCUMULATE);
break;
@@ -1174,7 +1170,7 @@ bool AchievementMgr::IsCompletedCriteria(AchievementCriteriaEntry const* achieve
if (!progress)
return false;
- switch (achievementCriteria->Type)
+ switch (AchievementCriteriaTypes(achievementCriteria->Type))
{
case ACHIEVEMENT_CRITERIA_TYPE_WIN_BG:
case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE:
@@ -1274,6 +1270,7 @@ bool AchievementMgr::IsCompletedCriteria(AchievementCriteriaEntry const* achieve
default:
break;
}
+
return false;
}
@@ -1415,7 +1412,7 @@ void AchievementMgr::SetCriteriaProgress(AchievementCriteriaEntry const* entry,
if (entry->StartTimer)
{
// has to exist, otherwise we wouldn't be here
- timedCompleted = IsCompletedCriteria(entry, sAchievementMgr->GetAchievement(entry->AchievementID));
+ timedCompleted = IsCompletedCriteria(entry, sAchievementStore.LookupEntry(entry->AchievementID));
// Client expects this in packet
timeElapsed = entry->StartTimer - (timedIter->second/IN_MILLISECONDS);
@@ -1452,7 +1449,7 @@ void AchievementMgr::UpdateTimedAchievements(uint32 timeDiff)
// Time is up, remove timer and reset progress
if (itr->second <= timeDiff)
{
- AchievementCriteriaEntry const* entry = sAchievementMgr->GetAchievementCriteria(itr->first);
+ AchievementCriteriaEntry const* entry = sAchievementCriteriaStore.LookupEntry(itr->first);
RemoveCriteriaProgress(entry);
m_timedAchievements.erase(itr++);
}
@@ -1472,7 +1469,7 @@ void AchievementMgr::StartTimedAchievement(AchievementCriteriaTimedTypes type, u
if (criteria->StartAsset != entry)
continue;
- AchievementEntry const* achievement = sAchievementMgr->GetAchievement(criteria->AchievementID);
+ AchievementEntry const* achievement = sAchievementStore.LookupEntry(criteria->AchievementID);
if (m_timedAchievements.find(criteria->ID) == m_timedAchievements.end() && !IsCompletedCriteria(criteria, achievement))
{
// Start the timer
@@ -1527,6 +1524,8 @@ void AchievementMgr::CompletedAchievement(AchievementEntry const* achievement)
if (achievement->Flags & (ACHIEVEMENT_FLAG_REALM_FIRST_REACH | ACHIEVEMENT_FLAG_REALM_FIRST_KILL))
sAchievementMgr->SetRealmCompleted(achievement);
+ m_achievementPoints += achievement->Points;
+
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT, achievement->ID);
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_EARN_ACHIEVEMENT_POINTS, achievement->Points);
@@ -1610,7 +1609,7 @@ void AchievementMgr::BuildAllDataPacket(Player const* receiver, WorldPacket* dat
for (std::pair<uint32 const, CompletedAchievementData> const& completedAchievement : m_completedAchievements)
{
// Skip hidden achievements
- AchievementEntry const* achievement = sAchievementMgr->GetAchievement(completedAchievement.first);
+ AchievementEntry const* achievement = sAchievementStore.LookupEntry(completedAchievement.first);
if (!achievement || achievement->Flags & ACHIEVEMENT_FLAG_HIDDEN)
continue;
@@ -2333,11 +2332,11 @@ void AchievementGlobalMgr::LoadAchievementCriteriaList()
uint32 loaded = 0;
for (uint32 entryId = 0; entryId < sAchievementCriteriaStore.GetNumRows(); ++entryId)
{
- AchievementCriteriaEntry const* criteria = sAchievementMgr->GetAchievementCriteria(entryId);
+ AchievementCriteriaEntry const* criteria = sAchievementCriteriaStore.LookupEntry(entryId);
if (!criteria)
continue;
- if (!GetAchievement(criteria->AchievementID))
+ if (!sAchievementStore.LookupEntry(criteria->AchievementID))
{
TC_LOG_DEBUG("server.loading", "Achievement {} referenced by criteria {} doesn't exist, criteria not loaded.", criteria->AchievementID, criteria->ID);
continue;
@@ -2415,7 +2414,7 @@ void AchievementGlobalMgr::LoadAchievementReferenceList()
for (uint32 entryId = 0; entryId < sAchievementStore.GetNumRows(); ++entryId)
{
- AchievementEntry const* achievement = sAchievementMgr->GetAchievement(entryId);
+ AchievementEntry const* achievement = sAchievementStore.LookupEntry(entryId);
if (!achievement || !achievement->SharesCriteria)
continue;
@@ -2424,7 +2423,7 @@ void AchievementGlobalMgr::LoadAchievementReferenceList()
}
// Once Bitten, Twice Shy (10 player) - Icecrown Citadel
- if (AchievementEntry const* achievement = sAchievementMgr->GetAchievement(4539))
+ if (AchievementEntry const* achievement = sAchievementStore.LookupEntry(4539))
const_cast<AchievementEntry*>(achievement)->InstanceID = 631; // Correct map requirement (currently has Ulduar)
TC_LOG_INFO("server.loading", ">> Loaded {} achievement references in {} ms.", count, GetMSTimeDiffToNow(oldMSTime));
@@ -2451,7 +2450,7 @@ void AchievementGlobalMgr::LoadAchievementCriteriaData()
Field* fields = result->Fetch();
uint32 criteria_id = fields[0].GetUInt32();
- AchievementCriteriaEntry const* criteria = sAchievementMgr->GetAchievementCriteria(criteria_id);
+ AchievementCriteriaEntry const* criteria = sAchievementCriteriaStore.LookupEntry(criteria_id);
if (!criteria)
{
@@ -2491,7 +2490,7 @@ void AchievementGlobalMgr::LoadAchievementCriteriaData()
// post loading checks
for (uint32 entryId = 0; entryId < sAchievementCriteriaStore.GetNumRows(); ++entryId)
{
- AchievementCriteriaEntry const* criteria = sAchievementMgr->GetAchievementCriteria(entryId);
+ AchievementCriteriaEntry const* criteria = sAchievementCriteriaStore.LookupEntry(entryId);
if (!criteria)
continue;
@@ -2517,7 +2516,7 @@ void AchievementGlobalMgr::LoadAchievementCriteriaData()
break;
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST:
{
- AchievementEntry const* achievement = sAchievementMgr->GetAchievement(criteria->AchievementID);
+ AchievementEntry const* achievement = sAchievementStore.LookupEntry(criteria->AchievementID);
if (!achievement)
continue;
@@ -2546,7 +2545,7 @@ void AchievementGlobalMgr::LoadAchievementCriteriaData()
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST:
case ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM: // only Children's Week achievements
{
- AchievementEntry const* achievement = sAchievementMgr->GetAchievement(criteria->AchievementID);
+ AchievementEntry const* achievement = sAchievementStore.LookupEntry(criteria->AchievementID);
if (!achievement)
continue;
if (achievement->Category != CATEGORY_CHILDRENS_WEEK && achievement->ID != 1785)
@@ -2589,7 +2588,7 @@ void AchievementGlobalMgr::LoadCompletedAchievements()
Field* fields = result->Fetch();
uint16 achievementId = fields[0].GetUInt16();
- AchievementEntry const* achievement = sAchievementMgr->GetAchievement(achievementId);
+ AchievementEntry const* achievement = sAchievementStore.LookupEntry(achievementId);
if (!achievement)
{
// Remove non-existing achievements from all characters
@@ -2628,7 +2627,7 @@ void AchievementGlobalMgr::LoadRewards()
{
Field* fields = result->Fetch();
uint32 id = fields[0].GetUInt32();
- AchievementEntry const* achievement = GetAchievement(id);
+ AchievementEntry const* achievement = sAchievementStore.LookupEntry(id);
if (!achievement)
{
TC_LOG_ERROR("sql.sql", "Table `achievement_reward` contains a wrong achievement ID ({}), ignored.", id);
@@ -2763,13 +2762,3 @@ void AchievementGlobalMgr::LoadRewardLocales()
TC_LOG_INFO("server.loading", ">> Loaded {} achievement reward locale strings in {} ms.", uint32(m_achievementRewardLocales.size()), GetMSTimeDiffToNow(oldMSTime));
}
-
-AchievementEntry const* AchievementGlobalMgr::GetAchievement(uint32 achievementId) const
-{
- return sAchievementStore.LookupEntry(achievementId);
-}
-
-AchievementCriteriaEntry const* AchievementGlobalMgr::GetAchievementCriteria(uint32 criteriaId) const
-{
- return sAchievementCriteriaStore.LookupEntry(criteriaId);
-}