diff options
author | Dekadence <dekadence.net@gmail.com> | 2014-09-27 14:28:10 +0200 |
---|---|---|
committer | Dekadence <dekadence.net@gmail.com> | 2014-09-27 14:28:10 +0200 |
commit | 5ac63a43fb33e55a1be7bbc9fb60ac26b3d1b032 (patch) | |
tree | 78352f1f01e120afa7160b6a75065e726a560d9b /src | |
parent | b48ba56efd53e0430ec5d69a70fb1d141d7029c1 (diff) |
Achievements/Guilds: Fix guild achievement tracking
- This fix a typo on commit TrinityCore@7ec22c5
- This fix update of criteria progress on login
Thanks to @DDuarte for initial commit and help with pull request
Thanks to @Kiritoo for send me sniffs
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Achievements/AchievementMgr.cpp | 89 | ||||
-rw-r--r-- | src/server/game/Achievements/AchievementMgr.h | 1 | ||||
-rw-r--r-- | src/server/game/Guilds/Guild.cpp | 23 | ||||
-rw-r--r-- | src/server/game/Guilds/Guild.h | 3 | ||||
-rw-r--r-- | src/server/game/Handlers/GuildHandler.cpp | 10 |
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); } |