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.cpp154
1 files changed, 88 insertions, 66 deletions
diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp
index 39328c9f9c2..306d57ebe28 100644
--- a/src/server/game/Achievements/AchievementMgr.cpp
+++ b/src/server/game/Achievements/AchievementMgr.cpp
@@ -377,42 +377,42 @@ void PlayerAchievementMgr::SendAllData(Player const* /*receiver*/) const
if (!achievement)
continue;
- WorldPackets::Achievement::EarnedAchievement earned;
+ WorldPackets::Achievement::EarnedAchievement& earned = achievementData.Data.Earned.emplace_back();
earned.Id = completedAchievement.first;
- earned.Date = completedAchievement.second.Date;
+ earned.Date.SetUtcTimeFromUnixTime(completedAchievement.second.Date);
+ earned.Date += _owner->GetSession()->GetTimezoneOffset();
if (!(achievement->Flags & ACHIEVEMENT_FLAG_ACCOUNT))
{
earned.Owner = _owner->GetGUID();
earned.VirtualRealmAddress = earned.NativeRealmAddress = GetVirtualRealmAddress();
}
- achievementData.Data.Earned.push_back(earned);
}
for (std::pair<uint32 const, CriteriaProgress> const& criteriaProgres : _criteriaProgress)
{
Criteria const* criteria = sCriteriaMgr->GetCriteria(criteriaProgres.first);
- WorldPackets::Achievement::CriteriaProgress progress;
+ WorldPackets::Achievement::CriteriaProgress& progress = achievementData.Data.Progress.emplace_back();
progress.Id = criteriaProgres.first;
progress.Quantity = criteriaProgres.second.Counter;
progress.Player = criteriaProgres.second.PlayerGUID;
progress.Flags = 0;
- progress.Date = criteriaProgres.second.Date;
+ progress.Date.SetUtcTimeFromUnixTime(criteriaProgres.second.Date);
+ progress.Date += _owner->GetSession()->GetTimezoneOffset();
progress.TimeFromStart = Seconds::zero();
progress.TimeFromCreate = Seconds::zero();
- achievementData.Data.Progress.push_back(progress);
if (criteria->FlagsCu & CRITERIA_FLAG_CU_ACCOUNT)
{
- WorldPackets::Achievement::CriteriaProgress progress;
- progress.Id = criteriaProgres.first;
- progress.Quantity = criteriaProgres.second.Counter;
- progress.Player = _owner->GetSession()->GetBattlenetAccountGUID();
- progress.Flags = 0;
- progress.Date = criteriaProgres.second.Date;
- progress.TimeFromStart = Seconds::zero();
- progress.TimeFromCreate = Seconds::zero();
- allAccountCriteria.Progress.push_back(progress);
+ WorldPackets::Achievement::CriteriaProgress& accountProgress = allAccountCriteria.Progress.emplace_back();
+ accountProgress.Id = criteriaProgres.first;
+ accountProgress.Quantity = criteriaProgres.second.Counter;
+ accountProgress.Player = _owner->GetSession()->GetBattlenetAccountGUID();
+ accountProgress.Flags = 0;
+ accountProgress.Date.SetUtcTimeFromUnixTime(criteriaProgres.second.Date);
+ accountProgress.Date += _owner->GetSession()->GetTimezoneOffset();
+ accountProgress.TimeFromStart = Seconds::zero();
+ accountProgress.TimeFromCreate = Seconds::zero();
}
}
@@ -436,28 +436,28 @@ void PlayerAchievementMgr::SendAchievementInfo(Player* receiver, uint32 /*achiev
if (!achievement)
continue;
- WorldPackets::Achievement::EarnedAchievement earned;
+ WorldPackets::Achievement::EarnedAchievement& earned = inspectedAchievements.Data.Earned.emplace_back();
earned.Id = completedAchievement.first;
- earned.Date = completedAchievement.second.Date;
+ earned.Date.SetUtcTimeFromUnixTime(completedAchievement.second.Date);
+ earned.Date += receiver->GetSession()->GetTimezoneOffset();
if (!(achievement->Flags & ACHIEVEMENT_FLAG_ACCOUNT))
{
earned.Owner = _owner->GetGUID();
earned.VirtualRealmAddress = earned.NativeRealmAddress = GetVirtualRealmAddress();
}
- inspectedAchievements.Data.Earned.push_back(earned);
}
for (std::pair<uint32 const, CriteriaProgress> const& criteriaProgres : _criteriaProgress)
{
- WorldPackets::Achievement::CriteriaProgress progress;
+ WorldPackets::Achievement::CriteriaProgress& progress = inspectedAchievements.Data.Progress.emplace_back();
progress.Id = criteriaProgres.first;
progress.Quantity = criteriaProgres.second.Counter;
progress.Player = criteriaProgres.second.PlayerGUID;
progress.Flags = 0;
- progress.Date = criteriaProgres.second.Date;
+ progress.Date.SetUtcTimeFromUnixTime(criteriaProgres.second.Date);
+ progress.Date += receiver->GetSession()->GetTimezoneOffset();
progress.TimeFromStart = Seconds::zero();
progress.TimeFromCreate = Seconds::zero();
- inspectedAchievements.Data.Progress.push_back(progress);
}
receiver->SendDirectMessage(inspectedAchievements.Write());
@@ -578,7 +578,8 @@ void PlayerAchievementMgr::SendCriteriaUpdate(Criteria const* criteria, Criteria
if (criteria->Entry->StartTimer)
criteriaUpdate.Progress.Flags = timedCompleted ? 1 : 0; // 1 is for keeping the counter at 0 in client
- criteriaUpdate.Progress.Date = progress->Date;
+ criteriaUpdate.Progress.Date.SetUtcTimeFromUnixTime(progress->Date);
+ criteriaUpdate.Progress.Date += _owner->GetSession()->GetTimezoneOffset();
criteriaUpdate.Progress.TimeFromStart = timeElapsed;
criteriaUpdate.Progress.TimeFromCreate = Seconds::zero();
@@ -595,7 +596,8 @@ void PlayerAchievementMgr::SendCriteriaUpdate(Criteria const* criteria, Criteria
if (criteria->Entry->StartTimer)
criteriaUpdate.Flags = timedCompleted ? 1 : 0; // 1 is for keeping the counter at 0 in client
- criteriaUpdate.CurrentTime = progress->Date;
+ criteriaUpdate.CurrentTime.SetUtcTimeFromUnixTime(progress->Date);
+ criteriaUpdate.CurrentTime += _owner->GetSession()->GetTimezoneOffset();
criteriaUpdate.ElapsedTime = timeElapsed;
criteriaUpdate.CreationTime = 0;
@@ -646,16 +648,26 @@ void PlayerAchievementMgr::SendAchievementEarned(AchievementEntry const* achieve
}
}
- WorldPackets::Achievement::AchievementEarned achievementEarned;
- achievementEarned.Sender = _owner->GetGUID();
- achievementEarned.Earner = _owner->GetGUID();
- achievementEarned.EarnerNativeRealm = achievementEarned.EarnerVirtualRealm = GetVirtualRealmAddress();
- achievementEarned.AchievementID = achievement->ID;
- achievementEarned.Time = GameTime::GetGameTime();
+ auto achievementEarnedBuilder = [&](Player const* receiver)
+ {
+ WorldPackets::Achievement::AchievementEarned achievementEarned;
+ achievementEarned.Sender = _owner->GetGUID();
+ achievementEarned.Earner = _owner->GetGUID();
+ achievementEarned.EarnerNativeRealm = achievementEarned.EarnerVirtualRealm = GetVirtualRealmAddress();
+ achievementEarned.AchievementID = achievement->ID;
+ achievementEarned.Time = *GameTime::GetUtcWowTime();
+ achievementEarned.Time += receiver->GetSession()->GetTimezoneOffset();
+ receiver->SendDirectMessage(achievementEarned.Write());
+ };
+
if (!(achievement->Flags & ACHIEVEMENT_FLAG_TRACKING_FLAG))
- _owner->SendMessageToSetInRange(achievementEarned.Write(), sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY), true);
+ {
+ float dist = sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY);
+ Trinity::MessageDistDeliverer notifier(_owner, achievementEarnedBuilder, dist);
+ Cell::VisitWorldObjects(_owner, notifier, dist);
+ }
else
- _owner->SendDirectMessage(achievementEarned.Write());
+ achievementEarnedBuilder(_owner);
}
void PlayerAchievementMgr::SendPacket(WorldPacket const* data) const
@@ -679,11 +691,16 @@ void GuildAchievementMgr::Reset()
ObjectGuid guid = _owner->GetGUID();
for (std::pair<uint32 const, CompletedAchievementData> const& completedAchievement : _completedAchievements)
{
- WorldPackets::Achievement::GuildAchievementDeleted guildAchievementDeleted;
- guildAchievementDeleted.AchievementID = completedAchievement.first;
- guildAchievementDeleted.GuildGUID = guid;
- guildAchievementDeleted.TimeDeleted = GameTime::GetGameTime();
- SendPacket(guildAchievementDeleted.Write());
+ auto packetBuilder = [&](Player const* receiver)
+ {
+ WorldPackets::Achievement::GuildAchievementDeleted guildAchievementDeleted;
+ guildAchievementDeleted.AchievementID = completedAchievement.first;
+ guildAchievementDeleted.GuildGUID = guid;
+ guildAchievementDeleted.TimeDeleted = *GameTime::GetUtcWowTime();
+ guildAchievementDeleted.TimeDeleted += receiver->GetSession()->GetTimezoneOffset();
+ receiver->SendDirectMessage(guildAchievementDeleted.Write());
+ };
+ _owner->BroadcastWorker(packetBuilder);
}
_achievementPoints = 0;
@@ -830,10 +847,10 @@ void GuildAchievementMgr::SendAllData(Player const* receiver) const
if (!achievement)
continue;
- WorldPackets::Achievement::EarnedAchievement earned;
+ WorldPackets::Achievement::EarnedAchievement& earned = allGuildAchievements.Earned.emplace_back();
earned.Id = completedAchievement.first;
- earned.Date = completedAchievement.second.Date;
- allGuildAchievements.Earned.push_back(earned);
+ earned.Date.SetUtcTimeFromUnixTime(completedAchievement.second.Date);
+ earned.Date += receiver->GetSession()->GetTimezoneOffset();
}
receiver->SendDirectMessage(allGuildAchievements.Write());
@@ -846,23 +863,22 @@ void GuildAchievementMgr::SendAchievementInfo(Player* receiver, uint32 achieveme
{
if (CriteriaTree const* tree = sCriteriaMgr->GetCriteriaTree(achievement->CriteriaTree))
{
- CriteriaMgr::WalkCriteriaTree(tree, [this, &guildCriteriaUpdate](CriteriaTree const* node)
+ CriteriaMgr::WalkCriteriaTree(tree, [this, &guildCriteriaUpdate, receiver](CriteriaTree const* node)
{
if (node->Criteria)
{
auto progress = this->_criteriaProgress.find(node->Criteria->ID);
if (progress != this->_criteriaProgress.end())
{
- WorldPackets::Achievement::GuildCriteriaProgress guildCriteriaProgress;
+ WorldPackets::Achievement::GuildCriteriaProgress& guildCriteriaProgress = guildCriteriaUpdate.Progress.emplace_back();
guildCriteriaProgress.CriteriaID = node->Criteria->ID;
guildCriteriaProgress.DateCreated = 0;
guildCriteriaProgress.DateStarted = 0;
- guildCriteriaProgress.DateUpdated = progress->second.Date;
+ guildCriteriaProgress.DateUpdated.SetUtcTimeFromUnixTime(progress->second.Date);
+ guildCriteriaProgress.DateUpdated += receiver->GetSession()->GetTimezoneOffset();
guildCriteriaProgress.Quantity = progress->second.Counter;
guildCriteriaProgress.PlayerGUID = progress->second.PlayerGUID;
guildCriteriaProgress.Flags = 0;
-
- guildCriteriaUpdate.Progress.push_back(guildCriteriaProgress);
}
}
});
@@ -883,16 +899,15 @@ void GuildAchievementMgr::SendAllTrackedCriterias(Player* receiver, std::set<uin
if (progress == _criteriaProgress.end())
continue;
- WorldPackets::Achievement::GuildCriteriaProgress guildCriteriaProgress;
+ WorldPackets::Achievement::GuildCriteriaProgress& guildCriteriaProgress = guildCriteriaUpdate.Progress.emplace_back();
guildCriteriaProgress.CriteriaID = criteriaId;
guildCriteriaProgress.DateCreated = 0;
guildCriteriaProgress.DateStarted = 0;
- guildCriteriaProgress.DateUpdated = progress->second.Date;
+ guildCriteriaProgress.DateUpdated.SetUtcTimeFromUnixTime(progress->second.Date);
+ guildCriteriaProgress.DateUpdated += receiver->GetSession()->GetTimezoneOffset();
guildCriteriaProgress.Quantity = progress->second.Counter;
guildCriteriaProgress.PlayerGUID = progress->second.PlayerGUID;
guildCriteriaProgress.Flags = 0;
-
- guildCriteriaUpdate.Progress.push_back(guildCriteriaProgress);
}
receiver->SendDirectMessage(guildCriteriaUpdate.Write());
@@ -956,19 +971,21 @@ void GuildAchievementMgr::CompletedAchievement(AchievementEntry const* achieveme
void GuildAchievementMgr::SendCriteriaUpdate(Criteria const* entry, CriteriaProgress const* progress, Seconds /*timeElapsed*/, bool /*timedCompleted*/) const
{
- WorldPackets::Achievement::GuildCriteriaUpdate guildCriteriaUpdate;
- guildCriteriaUpdate.Progress.resize(1);
-
- WorldPackets::Achievement::GuildCriteriaProgress& guildCriteriaProgress = guildCriteriaUpdate.Progress[0];
- guildCriteriaProgress.CriteriaID = entry->ID;
- guildCriteriaProgress.DateCreated = 0;
- guildCriteriaProgress.DateStarted = 0;
- guildCriteriaProgress.DateUpdated = progress->Date;
- guildCriteriaProgress.Quantity = progress->Counter;
- guildCriteriaProgress.PlayerGUID = progress->PlayerGUID;
- guildCriteriaProgress.Flags = 0;
-
- _owner->BroadcastPacketIfTrackingAchievement(guildCriteriaUpdate.Write(), entry->ID);
+ for (Player const* member : _owner->GetMembersTrackingCriteria(entry->ID))
+ {
+ WorldPackets::Achievement::GuildCriteriaUpdate guildCriteriaUpdate;
+ WorldPackets::Achievement::GuildCriteriaProgress& guildCriteriaProgress = guildCriteriaUpdate.Progress.emplace_back();
+ guildCriteriaProgress.CriteriaID = entry->ID;
+ guildCriteriaProgress.DateCreated = 0;
+ guildCriteriaProgress.DateStarted = 0;
+ guildCriteriaProgress.DateUpdated.SetUtcTimeFromUnixTime(progress->Date);
+ guildCriteriaProgress.DateUpdated += member->GetSession()->GetTimezoneOffset();
+ guildCriteriaProgress.Quantity = progress->Counter;
+ guildCriteriaProgress.PlayerGUID = progress->PlayerGUID;
+ guildCriteriaProgress.Flags = 0;
+
+ member->SendDirectMessage(guildCriteriaUpdate.Write());
+ }
}
void GuildAchievementMgr::SendCriteriaProgressRemoved(uint32 criteriaId)
@@ -992,11 +1009,16 @@ void GuildAchievementMgr::SendAchievementEarned(AchievementEntry const* achievem
sWorld->SendGlobalMessage(serverFirstAchievement.Write());
}
- WorldPackets::Achievement::GuildAchievementEarned guildAchievementEarned;
- guildAchievementEarned.AchievementID = achievement->ID;
- guildAchievementEarned.GuildGUID = _owner->GetGUID();
- guildAchievementEarned.TimeEarned = GameTime::GetGameTime();
- SendPacket(guildAchievementEarned.Write());
+ auto guildAchievementEarnedBuilder = [&](Player const* receiver)
+ {
+ WorldPackets::Achievement::GuildAchievementEarned guildAchievementEarned;
+ guildAchievementEarned.AchievementID = achievement->ID;
+ guildAchievementEarned.GuildGUID = _owner->GetGUID();
+ guildAchievementEarned.TimeEarned = *GameTime::GetUtcWowTime();
+ guildAchievementEarned.TimeEarned += receiver->GetSession()->GetTimezoneOffset();
+ receiver->SendDirectMessage(guildAchievementEarned.Write());
+ };
+ _owner->BroadcastWorker(guildAchievementEarnedBuilder);
}
void GuildAchievementMgr::SendPacket(WorldPacket const* data) const