diff options
author | Krudor <erikstrandberg93@hotmail.com> | 2016-11-07 19:09:49 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2016-11-07 19:09:49 +0100 |
commit | 0abb9873ec3798b6476400c8d283a6410d9418fe (patch) | |
tree | 5422ad47edc03dbfc8fb94c8a3a86534b99931f3 | |
parent | f9b4f686c83bcc97fad84f1d8775963c4a108541 (diff) |
Core/Achievements: Add missing part of #18034
-rw-r--r-- | src/server/game/Achievements/AchievementMgr.cpp | 42 |
1 files changed, 27 insertions, 15 deletions
diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index 1d0d061a6db..1a6d058345b 100644 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -63,25 +63,29 @@ uint32 AchievementMgr::GetAchievementPoints() const bool AchievementMgr::CanUpdateCriteriaTree(Criteria const* criteria, CriteriaTree const* tree, Player* referencePlayer) const { - if (HasAchieved(tree->Achievement->ID)) + AchievementEntry const* achievement = tree->Achievement; + if (!achievement) + return false; + + if (HasAchieved(achievement->ID)) { TC_LOG_TRACE("criteria.achievement", "AchievementMgr::CanUpdateCriteriaTree: (Id: %u Type %s Achievement %u) Achievement already earned", - criteria->ID, CriteriaMgr::GetCriteriaTypeString(criteria->Entry->Type), tree->Achievement->ID); + criteria->ID, CriteriaMgr::GetCriteriaTypeString(criteria->Entry->Type), achievement->ID); return false; } - if (tree->Achievement->MapID != -1 && referencePlayer->GetMapId() != uint32(tree->Achievement->MapID)) + if (achievement->MapID != -1 && referencePlayer->GetMapId() != uint32(achievement->MapID)) { TC_LOG_TRACE("criteria.achievement", "AchievementMgr::CanUpdateCriteriaTree: (Id: %u Type %s Achievement %u) Wrong map", - criteria->ID, CriteriaMgr::GetCriteriaTypeString(criteria->Entry->Type), tree->Achievement->ID); + criteria->ID, CriteriaMgr::GetCriteriaTypeString(criteria->Entry->Type), achievement->ID); return false; } - if ((tree->Achievement->Faction == ACHIEVEMENT_FACTION_HORDE && referencePlayer->GetTeam() != HORDE) || - (tree->Achievement->Faction == ACHIEVEMENT_FACTION_ALLIANCE && referencePlayer->GetTeam() != ALLIANCE)) + if ((achievement->Faction == ACHIEVEMENT_FACTION_HORDE && referencePlayer->GetTeam() != HORDE) || + (achievement->Faction == ACHIEVEMENT_FACTION_ALLIANCE && referencePlayer->GetTeam() != ALLIANCE)) { TC_LOG_TRACE("criteria.achievement", "AchievementMgr::CanUpdateCriteriaTree: (Id: %u Type %s Achievement %u) Wrong faction", - criteria->ID, CriteriaMgr::GetCriteriaTypeString(criteria->Entry->Type), tree->Achievement->ID); + criteria->ID, CriteriaMgr::GetCriteriaTypeString(criteria->Entry->Type), achievement->ID); return false; } @@ -110,27 +114,35 @@ bool AchievementMgr::CanCompleteCriteriaTree(CriteriaTree const* tree) void AchievementMgr::CompletedCriteriaTree(CriteriaTree const* tree, Player* referencePlayer) { + AchievementEntry const* achievement = tree->Achievement; + if (!achievement) + return; + // counter can never complete - if (tree->Achievement->Flags & ACHIEVEMENT_FLAG_COUNTER) + if (achievement->Flags & ACHIEVEMENT_FLAG_COUNTER) return; // already completed and stored - if (HasAchieved(tree->Achievement->ID)) + if (HasAchieved(achievement->ID)) return; - if (IsCompletedAchievement(tree->Achievement)) - CompletedAchievement(tree->Achievement, referencePlayer); + if (IsCompletedAchievement(achievement)) + CompletedAchievement(achievement, referencePlayer); } void AchievementMgr::AfterCriteriaTreeUpdate(CriteriaTree const* tree, Player* referencePlayer) { + AchievementEntry const* achievement = tree->Achievement; + if (!achievement) + return; + // check again the completeness for SUMM and REQ COUNT achievements, // as they don't depend on the completed criteria but on the sum of the progress of each individual criteria - if (tree->Achievement->Flags & ACHIEVEMENT_FLAG_SUMM) - if (IsCompletedAchievement(tree->Achievement)) - CompletedAchievement(tree->Achievement, referencePlayer); + if (achievement->Flags & ACHIEVEMENT_FLAG_SUMM) + if (IsCompletedAchievement(achievement)) + CompletedAchievement(achievement, referencePlayer); - if (std::vector<AchievementEntry const*> const* achRefList = sAchievementMgr->GetAchievementByReferencedId(tree->Achievement->ID)) + if (std::vector<AchievementEntry const*> const* achRefList = sAchievementMgr->GetAchievementByReferencedId(achievement->ID)) for (AchievementEntry const* refAchievement : *achRefList) if (IsCompletedAchievement(refAchievement)) CompletedAchievement(refAchievement, referencePlayer); |