- 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:
@@ -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)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user