diff options
-rw-r--r-- | src/game/AchievementMgr.cpp | 61 |
1 files changed, 5 insertions, 56 deletions
diff --git a/src/game/AchievementMgr.cpp b/src/game/AchievementMgr.cpp index 60396c299a9..91567587231 100644 --- a/src/game/AchievementMgr.cpp +++ b/src/game/AchievementMgr.cpp @@ -1829,72 +1829,21 @@ void AchievementMgr::CompletedAchievement(AchievementEntry const* achievement) void AchievementMgr::SendAllAchievementData() { - uint32 size = 18 + m_completedAchievements.size()*8 + m_criteriaProgress.size() * 36; - - bool send = false; - - WorldPacket data(SMSG_ALL_ACHIEVEMENT_DATA); - if (size < 0x8000) - data.resize(size); - else - data.resize(0x7fff); - // More than this causes client trouble - - CompletedAchievementMap::const_iterator iter = m_completedAchievements.begin(); - CriteriaProgressMap::const_iterator iter2 = m_criteriaProgress.begin(); - - bool cAchievements = false; - bool cProgress = false; - while (!cAchievements || !cProgress) - { - data.clear(); - send = false; - - if (!cAchievements) - { - for (; iter != m_completedAchievements.end() && !send; ++iter) - { - data << uint32(iter->first); - data << uint32(secsToTimeBitFields(iter->second.date)); - send = data.size() > 0x7f00; - } - - if (iter == m_completedAchievements.end()) - cAchievements = true; - } - - data << int32(-1); - for (; iter2 != m_criteriaProgress.end() && !send; ++iter2) - { - data << uint32(iter2->first); - data.appendPackGUID(iter2->second.counter); - data.append(GetPlayer()->GetPackGUID()); - data << uint32(0); - data << uint32(secsToTimeBitFields(iter2->second.date)); - data << uint32(0); - data << uint32(0); - send = data.size() > 0x7f00; - } - - if (iter2 == m_criteriaProgress.end()) - cProgress = true; - - data << int32(-1); - GetPlayer()->GetSession()->SendPacket(&data); - } + WorldPacket data(SMSG_ALL_ACHIEVEMENT_DATA, m_completedAchievements.size()*8+4+m_criteriaProgress.size()*38+4); + BuildAllDataPacket(&data); + GetPlayer()->GetSession()->SendPacket(&data); } void AchievementMgr::SendRespondInspectAchievements(Player* player) { - // since we don't know the exact size of the packed GUIDs this is just an approximation - WorldPacket data(SMSG_RESPOND_INSPECT_ACHIEVEMENTS, 4+4*2+m_completedAchievements.size()*4*2+m_completedAchievements.size()*7*4); + WorldPacket data(SMSG_RESPOND_INSPECT_ACHIEVEMENTS, 9+m_completedAchievements.size()*8+4+m_criteriaProgress.size()*38+4); data.append(GetPlayer()->GetPackGUID()); BuildAllDataPacket(&data); player->GetSession()->SendPacket(&data); } /** - * used by SMSG_RESPOND_INSPECT_ACHIEVEMENT + * used by SMSG_RESPOND_INSPECT_ACHIEVEMENT and SMSG_ALL_ACHIEVEMENT_DATA */ void AchievementMgr::BuildAllDataPacket(WorldPacket *data) { |