aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/game/AchievementMgr.cpp58
1 files changed, 54 insertions, 4 deletions
diff --git a/src/game/AchievementMgr.cpp b/src/game/AchievementMgr.cpp
index 93fae0c6dd0..c6ace0d2f30 100644
--- a/src/game/AchievementMgr.cpp
+++ b/src/game/AchievementMgr.cpp
@@ -1745,10 +1745,60 @@ 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;
+ }
+ data << int32(-1);
+
+ if( iter == m_completedAchievements.end() )
+ cAchievements = true;
+ }
+
+ 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);
+ }
// since we don't know the exact size of the packed GUIDs this is just an approximation
- WorldPacket data(SMSG_ALL_ACHIEVEMENT_DATA, 4*2+m_completedAchievements.size()*4*2+m_completedAchievements.size()*7*4);
- BuildAllDataPacket(&data);
- GetPlayer()->GetSession()->SendPacket(&data);
}
void AchievementMgr::SendRespondInspectAchievements(Player* player)
@@ -1761,7 +1811,7 @@ void AchievementMgr::SendRespondInspectAchievements(Player* player)
}
/**
- * used by both SMSG_ALL_ACHIEVEMENT_DATA and SMSG_RESPOND_INSPECT_ACHIEVEMENT
+ * used by SMSG_RESPOND_INSPECT_ACHIEVEMENT
*/
void AchievementMgr::BuildAllDataPacket(WorldPacket *data)
{