Core/Achievements: Add missing part of #18034

This commit is contained in:
Krudor
2016-11-07 19:09:49 +01:00
committed by Shauren
parent f9b4f686c8
commit 0abb9873ec

View File

@@ -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);