diff options
| author | Duarte Duarte <dnpd.dd@gmail.com> | 2014-09-27 22:08:11 +0100 | 
|---|---|---|
| committer | Duarte Duarte <dnpd.dd@gmail.com> | 2014-09-27 22:08:11 +0100 | 
| commit | e3e649c6cc4d469fcb33eb1e0c0bb88bcec97c2d (patch) | |
| tree | 879fb70979d4790c29e2d584a773a699d2009420 /src/server/game/Achievements/AchievementMgr.cpp | |
| parent | 9b14efd6f70508a25d750bd1f131610f09bf57a9 (diff) | |
| parent | 5ac63a43fb33e55a1be7bbc9fb60ac26b3d1b032 (diff) | |
Merge pull request #13209 from Dekadencee/FixGuildAchievementTracking
[4.3.4] Achievements/Guilds: Fix guild achievement tracking
Diffstat (limited to 'src/server/game/Achievements/AchievementMgr.cpp')
| -rw-r--r-- | src/server/game/Achievements/AchievementMgr.cpp | 89 | 
1 files changed, 89 insertions, 0 deletions
diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index e1c6aa2b1ca..d2835797235 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   */  | 
