- 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
This commit is contained in:
Machiavelli
2010-04-24 15:08:18 +02:00
parent 20b79fec28
commit 30c842480c
+5 -56
View File
@@ -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)
{