aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMachiavelli <none@none>2010-04-24 15:08:18 +0200
committerMachiavelli <none@none>2010-04-24 15:08:18 +0200
commit30c842480c2279c0aa71d520d194c804e89ff379 (patch)
treeb5c6146f8238f16d666ab400fe4c6a4831b99347
parent20b79fec28663e8265c3eb9fcfe03be9859c63aa (diff)
- Fix display of recently earned achievements when the player has a high total of earned achievements.
- Fix crash in compare achievements with players with high GUIDs, by havenard. Fixes issue #1724 --HG-- branch : trunk
-rw-r--r--src/game/AchievementMgr.cpp61
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)
{