aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Achievements/AchievementMgr.cpp89
-rw-r--r--src/server/game/Achievements/AchievementMgr.h1
-rw-r--r--src/server/game/Guilds/Guild.cpp23
-rw-r--r--src/server/game/Guilds/Guild.h3
-rw-r--r--src/server/game/Handlers/GuildHandler.cpp10
5 files changed, 118 insertions, 8 deletions
diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp
index 25d6bc1f889..555b48da03b 100644
--- a/src/server/game/Achievements/AchievementMgr.cpp
+++ b/src/server/game/Achievements/AchievementMgr.cpp
@@ -998,6 +998,95 @@ void AchievementMgr<Guild>::SendCriteriaUpdate(AchievementCriteriaEntry const* e
GetOwner()->BroadcastPacketIfTrackingAchievement(&data, entry->ID);
}
+template<class T>
+void AchievementMgr<T>::SendAllTrackedCriterias(Player* receiver, std::set<uint32> const& trackedCriterias) const
+{
+}
+
+template<>
+void AchievementMgr<Guild>::SendAllTrackedCriterias(Player* receiver, std::set<uint32> const& trackedCriterias) const
+{
+ ObjectGuid counter;
+ ObjectGuid guid;
+ uint32 trackedCriteriasCount = 0;
+
+ for (std::set<uint32>::iterator itr = trackedCriterias.begin(); itr != trackedCriterias.end(); ++itr)
+ {
+ AchievementCriteriaEntry const* entry = sAchievementMgr->GetAchievementCriteria(*itr);
+
+ CriteriaProgressMap::const_iterator progress = m_criteriaProgress.find(entry->ID);
+ if (progress == m_criteriaProgress.end())
+ continue;
+
+ ++trackedCriteriasCount;
+ }
+
+ ByteBuffer criteriaBits(21 + (trackedCriteriasCount * (8 + 8)));
+ ByteBuffer criteriaData(trackedCriteriasCount * (8 + 8 + 4 + 4 + 4 + 4 + 4));
+
+ criteriaBits.WriteBits(trackedCriteriasCount, 21);
+
+ for (std::set<uint32>::iterator itr = trackedCriterias.begin(); itr != trackedCriterias.end(); ++itr)
+ {
+ AchievementCriteriaEntry const* entry = sAchievementMgr->GetAchievementCriteria(*itr);
+
+ CriteriaProgressMap::const_iterator progress = m_criteriaProgress.find(entry->ID);
+ if (progress == m_criteriaProgress.end())
+ continue;
+
+ counter.Set(progress->second.counter);
+ guid = progress->second.CompletedGUID;
+
+ criteriaBits.WriteBit(counter[4]);
+ criteriaBits.WriteBit(counter[1]);
+ criteriaBits.WriteBit(guid[2]);
+ criteriaBits.WriteBit(counter[3]);
+ criteriaBits.WriteBit(guid[1]);
+ criteriaBits.WriteBit(counter[5]);
+ criteriaBits.WriteBit(counter[0]);
+ criteriaBits.WriteBit(guid[3]);
+ criteriaBits.WriteBit(counter[2]);
+ criteriaBits.WriteBit(guid[7]);
+ criteriaBits.WriteBit(guid[5]);
+ criteriaBits.WriteBit(guid[0]);
+ criteriaBits.WriteBit(counter[6]);
+ criteriaBits.WriteBit(guid[6]);
+ criteriaBits.WriteBit(counter[7]);
+ criteriaBits.WriteBit(guid[4]);
+ criteriaBits.FlushBits();
+
+ criteriaData.WriteByteSeq(guid[5]);
+ criteriaData << uint32(progress->second.date); // unknown date
+ criteriaData.WriteByteSeq(counter[3]);
+ criteriaData.WriteByteSeq(counter[7]);
+ criteriaData << uint32(progress->second.date); // unknown date
+ criteriaData.WriteByteSeq(counter[6]);
+ criteriaData.WriteByteSeq(guid[4]);
+ criteriaData.WriteByteSeq(guid[1]);
+ criteriaData.WriteByteSeq(counter[4]);
+ criteriaData.WriteByteSeq(guid[3]);
+ criteriaData.WriteByteSeq(counter[0]);
+ criteriaData.WriteByteSeq(guid[2]);
+ criteriaData.WriteByteSeq(counter[1]);
+ criteriaData.WriteByteSeq(guid[6]);
+ criteriaData << uint32(progress->second.date); // last update time (not packed!)
+ criteriaData << uint32(entry->ID);
+ criteriaData.WriteByteSeq(counter[5]);
+ criteriaData << uint32(0);
+ criteriaData.WriteByteSeq(guid[7]);
+ criteriaData.WriteByteSeq(counter[2]);
+ criteriaData.WriteByteSeq(guid[0]);
+ }
+
+ WorldPacket data(SMSG_GUILD_CRITERIA_DATA, criteriaBits.size() + criteriaData.size());
+ data.append(criteriaBits);
+
+ if (trackedCriteriasCount)
+ data.append(criteriaData);
+
+ receiver->GetSession()->SendPacket(&data);
+}
+
/**
* called at player login. The player might have fulfilled some achievements when the achievement system wasn't working yet
*/
diff --git a/src/server/game/Achievements/AchievementMgr.h b/src/server/game/Achievements/AchievementMgr.h
index 9bbf1304f65..636f7398da6 100644
--- a/src/server/game/Achievements/AchievementMgr.h
+++ b/src/server/game/Achievements/AchievementMgr.h
@@ -264,6 +264,7 @@ class AchievementMgr
void CompletedAchievement(AchievementEntry const* entry, Player* referencePlayer);
void CheckAllAchievementCriteria(Player* referencePlayer);
void SendAllAchievementData(Player* receiver) const;
+ void SendAllTrackedCriterias(Player* receiver, std::set<uint32> const& trackedCriterias) const;
void SendAchievementInfo(Player* receiver, uint32 achievementId = 0) const;
bool HasAchieved(uint32 achievementId) const;
T* GetOwner() const { return _owner; }
diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp
index 411b986bc1f..3f346a0b8c7 100644
--- a/src/server/game/Guilds/Guild.cpp
+++ b/src/server/game/Guilds/Guild.cpp
@@ -1562,10 +1562,29 @@ void Guild::SendGuildRankInfo(WorldSession* session) const
TC_LOG_DEBUG("guild", "SMSG_GUILD_RANK [%s]", session->GetPlayerInfo().c_str());
}
-void Guild::HandleSetAchievementTracking(WorldSession* session, std::set<uint32> const& criteriaIds)
+void Guild::HandleSetAchievementTracking(WorldSession* session, std::set<uint32> const& achievementIds)
{
- if (Member* member = GetMember(session->GetPlayer()->GetGUID()))
+ Player* player = session->GetPlayer();
+
+ if (Member* member = GetMember(player->GetGUID()))
+ {
+ std::set<uint32> criteriaIds;
+
+ for (std::set<uint32>::iterator achievementId = achievementIds.begin(); achievementId != achievementIds.end(); ++achievementId)
+ {
+ if (AchievementCriteriaEntryList const* cList = sAchievementMgr->GetAchievementCriteriaByAchievement(*achievementId))
+ {
+ for (AchievementCriteriaEntryList::const_iterator itr = cList->begin(); itr != cList->end(); ++itr)
+ {
+ AchievementCriteriaEntry const* criteria = *itr;
+ criteriaIds.insert(criteria->ID);
+ }
+ }
+ }
+
member->SetTrackedCriteriaIds(criteriaIds);
+ m_achievementMgr.SendAllTrackedCriterias(player, member->GetTrackedCriteriaIds());
+ }
}
void Guild::HandleSetMOTD(WorldSession* session, std::string const& motd)
diff --git a/src/server/game/Guilds/Guild.h b/src/server/game/Guilds/Guild.h
index a4e2f9bc5ad..5448180e0ae 100644
--- a/src/server/game/Guilds/Guild.h
+++ b/src/server/game/Guilds/Guild.h
@@ -395,6 +395,7 @@ private:
uint32 GetTotalReputation() const { return m_totalReputation; }
uint32 GetWeekReputation() const { return m_weekReputation; }
+ std::set<uint32> GetTrackedCriteriaIds() const { return m_trackedCriteriaIds; }
void SetTrackedCriteriaIds(std::set<uint32> criteriaIds) { m_trackedCriteriaIds.swap(criteriaIds); }
bool IsTrackingCriteriaId(uint32 criteriaId) const { return m_trackedCriteriaIds.find(criteriaId) != m_trackedCriteriaIds.end(); }
@@ -789,7 +790,7 @@ public:
// Handle client commands
void HandleRoster(WorldSession* session);
void HandleQuery(WorldSession* session);
- void HandleSetAchievementTracking(WorldSession* session, std::set<uint32> const& criteriaIds);
+ void HandleSetAchievementTracking(WorldSession* session, std::set<uint32> const& achievementIds);
void HandleSetMOTD(WorldSession* session, std::string const& motd);
void HandleSetInfo(WorldSession* session, std::string const& info);
void HandleSetEmblem(WorldSession* session, const EmblemInfo& emblemInfo);
diff --git a/src/server/game/Handlers/GuildHandler.cpp b/src/server/game/Handlers/GuildHandler.cpp
index 3762e9aa90e..061f081919e 100644
--- a/src/server/game/Handlers/GuildHandler.cpp
+++ b/src/server/game/Handlers/GuildHandler.cpp
@@ -832,15 +832,15 @@ void WorldSession::HandleGuildSetGuildMaster(WorldPacket& recvPacket)
void WorldSession::HandleGuildSetAchievementTracking(WorldPacket& recvPacket)
{
uint32 count = recvPacket.ReadBits(24);
- std::set<uint32> criteriaIds;
+ std::set<uint32> achievementIds;
for (uint32 i = 0; i < count; ++i)
{
- uint32 criteriaId;
- recvPacket >> criteriaId;
- criteriaIds.insert(criteriaId);
+ uint32 achievementId;
+ recvPacket >> achievementId;
+ achievementIds.insert(achievementId);
}
if (Guild* guild = GetPlayer()->GetGuild())
- guild->HandleSetAchievementTracking(this, criteriaIds);
+ guild->HandleSetAchievementTracking(this, achievementIds);
}