aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Achievements/AchievementMgr.cpp
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2020-05-18 16:57:59 +0200
committerShauren <shauren.trinity@gmail.com>2020-05-18 16:57:59 +0200
commit3e833739071a689dc34e33f7a511d8cc50e00b94 (patch)
tree987cebdbb80185ec8aae54147d1ccb22d4d19bc1 /src/server/game/Achievements/AchievementMgr.cpp
parent4055434ba6260e528c877023faebf87ba2c81a42 (diff)
Core/Achievements: Minor fixes
* Corrected criteria and modifier tree logic after implementing their operators * Account wide achievements will now show progress ingame (even if we still treat them as per-character) * Fixed more cases of achievements being granted automatically without satisfying modifier trees
Diffstat (limited to 'src/server/game/Achievements/AchievementMgr.cpp')
-rw-r--r--src/server/game/Achievements/AchievementMgr.cpp63
1 files changed, 52 insertions, 11 deletions
diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp
index ce2494c350a..a0b82470eac 100644
--- a/src/server/game/Achievements/AchievementMgr.cpp
+++ b/src/server/game/Achievements/AchievementMgr.cpp
@@ -285,6 +285,7 @@ void PlayerAchievementMgr::LoadFromDB(PreparedQueryResult achievementResult, Pre
CriteriaProgress& progress = _criteriaProgress[id];
progress.Counter = counter;
progress.Date = date;
+ progress.PlayerGUID = _owner->GetGUID();
progress.Changed = false;
} while (criteriaResult->NextRow());
}
@@ -376,6 +377,8 @@ void PlayerAchievementMgr::ResetCriteria(CriteriaCondition condition, int32 fail
void PlayerAchievementMgr::SendAllData(Player const* /*receiver*/) const
{
VisibleAchievementCheck filterInvisible;
+ WorldPackets::Achievement::AllAccountCriteria allAccountCriteria;
+
WorldPackets::Achievement::AllAchievementData achievementData;
achievementData.Data.Earned.reserve(_completedAchievements.size());
achievementData.Data.Progress.reserve(_criteriaProgress.size());
@@ -399,6 +402,8 @@ void PlayerAchievementMgr::SendAllData(Player const* /*receiver*/) const
for (auto itr = _criteriaProgress.begin(); itr != _criteriaProgress.end(); ++itr)
{
+ Criteria const* criteria = sCriteriaMgr->GetCriteria(itr->first);
+
WorldPackets::Achievement::CriteriaProgress progress;
progress.Id = itr->first;
progress.Quantity = itr->second.Counter;
@@ -408,8 +413,24 @@ void PlayerAchievementMgr::SendAllData(Player const* /*receiver*/) const
progress.TimeFromStart = 0;
progress.TimeFromCreate = 0;
achievementData.Data.Progress.push_back(progress);
+
+ if (criteria->FlagsCu & CRITERIA_FLAG_CU_ACCOUNT)
+ {
+ WorldPackets::Achievement::CriteriaProgress progress;
+ progress.Id = itr->first;
+ progress.Quantity = itr->second.Counter;
+ progress.Player = _owner->GetSession()->GetBattlenetAccountGUID();
+ progress.Flags = 0;
+ progress.Date = itr->second.Date;
+ progress.TimeFromStart = 0;
+ progress.TimeFromCreate = 0;
+ allAccountCriteria.Progress.push_back(progress);
+ }
}
+ if (!allAccountCriteria.Progress.empty())
+ SendPacket(allAccountCriteria.Write());
+
SendPacket(achievementData.Write());
}
@@ -556,20 +577,40 @@ bool PlayerAchievementMgr::ModifierTreeSatisfied(uint32 modifierTreeId) const
void PlayerAchievementMgr::SendCriteriaUpdate(Criteria const* criteria, CriteriaProgress const* progress, uint32 timeElapsed, bool timedCompleted) const
{
- WorldPackets::Achievement::CriteriaUpdate criteriaUpdate;
+ if (criteria->FlagsCu & CRITERIA_FLAG_CU_ACCOUNT)
+ {
+ WorldPackets::Achievement::AccountCriteriaUpdate criteriaUpdate;
- criteriaUpdate.CriteriaID = criteria->ID;
- criteriaUpdate.Quantity = progress->Counter;
- criteriaUpdate.PlayerGUID = _owner->GetGUID();
- criteriaUpdate.Flags = 0;
- if (criteria->Entry->StartTimer)
- criteriaUpdate.Flags = timedCompleted ? 1 : 0; // 1 is for keeping the counter at 0 in client
+ criteriaUpdate.Progress.Id = criteria->ID;
+ criteriaUpdate.Progress.Quantity = progress->Counter;
+ criteriaUpdate.Progress.Player = _owner->GetSession()->GetBattlenetAccountGUID();
+ criteriaUpdate.Progress.Flags = 0;
+ if (criteria->Entry->StartTimer)
+ criteriaUpdate.Progress.Flags = timedCompleted ? 1 : 0; // 1 is for keeping the counter at 0 in client
- criteriaUpdate.CurrentTime = progress->Date;
- criteriaUpdate.ElapsedTime = timeElapsed;
- criteriaUpdate.CreationTime = 0;
+ criteriaUpdate.Progress.Date = progress->Date;
+ criteriaUpdate.Progress.TimeFromStart = timeElapsed;
+ criteriaUpdate.Progress.TimeFromCreate = 0;
- SendPacket(criteriaUpdate.Write());
+ SendPacket(criteriaUpdate.Write());
+ }
+ else
+ {
+ WorldPackets::Achievement::CriteriaUpdate criteriaUpdate;
+
+ criteriaUpdate.CriteriaID = criteria->ID;
+ criteriaUpdate.Quantity = progress->Counter;
+ criteriaUpdate.PlayerGUID = _owner->GetGUID();
+ criteriaUpdate.Flags = 0;
+ if (criteria->Entry->StartTimer)
+ criteriaUpdate.Flags = timedCompleted ? 1 : 0; // 1 is for keeping the counter at 0 in client
+
+ criteriaUpdate.CurrentTime = progress->Date;
+ criteriaUpdate.ElapsedTime = timeElapsed;
+ criteriaUpdate.CreationTime = 0;
+
+ SendPacket(criteriaUpdate.Write());
+ }
}
void PlayerAchievementMgr::SendCriteriaProgressRemoved(uint32 criteriaId)