aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xsrc/server/game/Achievements/AchievementMgr.cpp49
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp3
-rwxr-xr-xsrc/server/game/Server/Protocol/Opcodes.h4
3 files changed, 41 insertions, 15 deletions
diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp
index d07a19c486a..aa6c39f351d 100755
--- a/src/server/game/Achievements/AchievementMgr.cpp
+++ b/src/server/game/Achievements/AchievementMgr.cpp
@@ -1957,6 +1957,9 @@ void AchievementMgr::SendAllAchievementData() const
{
WorldPacket data(SMSG_ALL_ACHIEVEMENT_DATA, m_completedAchievements.size()*8+4+m_criteriaProgress.size()*38+4);
BuildAllDataPacket(&data);
+ if (data.size() > 0x1000)
+ data.Compress(SMSG_COMPRESSED_ACHIEVEMENT_DATA);
+
GetPlayer()->GetSession()->SendPacket(&data);
}
@@ -1973,6 +1976,17 @@ void AchievementMgr::SendRespondInspectAchievements(Player* player) const
*/
void AchievementMgr::BuildAllDataPacket(WorldPacket* data) const
{
+ size_t numCriterias = m_criteriaProgress.size();
+ uint32 achievementCount = 0;
+ ByteBuffer bitBuffer(numCriterias * 2 / 8 + 1); // 2 bits per criteria/8 bits per byte
+ ByteBuffer counterBuffer(numCriterias * 8); // uint64 values
+ ByteBuffer guidBuffer(numCriterias * 8);
+ ByteBuffer criteriaDateBuffer(numCriterias * 4);
+ ByteBuffer zeros(numCriterias * 4, true); // fill with zeros
+ ByteBuffer criteriaIdBuffer(numCriterias * 4);
+ ByteBuffer achievementDateBuffer(m_completedAchievements.size() * 4);
+ ByteBuffer achievementIdBuffer(m_completedAchievements.size() * 4);
+
AchievementEntry const* achievement = NULL;
for (CompletedAchievementMap::const_iterator iter = m_completedAchievements.begin(); iter != m_completedAchievements.end(); ++iter)
{
@@ -1981,23 +1995,32 @@ void AchievementMgr::BuildAllDataPacket(WorldPacket* data) const
if (achievement->flags & ACHIEVEMENT_FLAG_HIDDEN)
continue;
- *data << uint32(iter->first);
- *data << uint32(secsToTimeBitFields(iter->second.date));
+ achievementDateBuffer << uint32(secsToTimeBitFields(iter->second.date));
+ achievementIdBuffer << uint32(achievement->ID);
+ ++achievementCount;
}
- *data << int32(-1);
- for (CriteriaProgressMap::const_iterator iter = m_criteriaProgress.begin(); iter != m_criteriaProgress.end(); ++iter)
+ for (CriteriaProgressMap::const_iterator itr = m_criteriaProgress.begin(); itr != m_criteriaProgress.end(); ++itr)
{
- *data << uint32(iter->first);
- data->appendPackGUID(iter->second.counter);
- data->append(GetPlayer()->GetPackGUID());
- *data << uint32(0);
- *data << uint32(secsToTimeBitFields(iter->second.date));
- *data << uint32(0);
- *data << uint32(0);
+ bitBuffer.WriteBits(0, 2);
+ counterBuffer << uint64(itr->second.counter);
+ guidBuffer << uint64(GetPlayer()->GetGUID());
+ criteriaDateBuffer << uint32(secsToTimeBitFields(itr->second.date));
+ criteriaIdBuffer << uint32(itr->first);
}
- *data << int32(-1);
+ bitBuffer.FlushBits();
+ *data << uint32(numCriterias);
+ data->append(bitBuffer);
+ data->append(counterBuffer);
+ *data << uint32(achievementCount);
+ data->append(achievementDateBuffer);
+ data->append(guidBuffer);
+ data->append(criteriaDateBuffer);
+ data->append(zeros);
+ data->append(achievementIdBuffer);
+ data->append(criteriaIdBuffer);
+ data->append(zeros);
}
bool AchievementMgr::HasAchieved(uint32 achievementId) const
@@ -2040,7 +2063,7 @@ bool AchievementMgr::CanUpdateCriteria(AchievementCriteriaEntry const* criteria,
break;
}
}
-
+
// additional conditions
for (int8 i = 0; i < MAX_ADDITIONAL_CRITERIA_CONDITIONS; ++i)
{
diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp
index 711bc5a4162..ca886d2b3d6 100644
--- a/src/server/game/Server/Protocol/Opcodes.cpp
+++ b/src/server/game/Server/Protocol/Opcodes.cpp
@@ -1210,7 +1210,8 @@ void InitOpcodes()
DEFINE_OPCODE_HANDLER(CMSG_PET_LEARN_TALENT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandlePetLearnTalent );
//DEFINE_OPCODE_HANDLER(CMSG_PET_UNLEARN_TALENTS, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
//DEFINE_OPCODE_HANDLER(SMSG_SET_PHASE_SHIFT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
- //DEFINE_OPCODE_HANDLER(SMSG_ALL_ACHIEVEMENT_DATA, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
+ DEFINE_OPCODE_HANDLER(SMSG_ALL_ACHIEVEMENT_DATA, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
+ DEFINE_OPCODE_HANDLER(SMSG_COMPRESSED_ACHIEVEMENT_DATA, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//DEFINE_OPCODE_HANDLER(CMSG_FORCE_SAY_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
//DEFINE_OPCODE_HANDLER(SMSG_HEALTH_UPDATE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
DEFINE_OPCODE_HANDLER(SMSG_POWER_UPDATE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h
index b86f0fddb5f..34bd89cc388 100755
--- a/src/server/game/Server/Protocol/Opcodes.h
+++ b/src/server/game/Server/Protocol/Opcodes.h
@@ -543,7 +543,7 @@ enum Opcodes
SMSG_ADD_RUNE_POWER = 0x00,
SMSG_ADDON_INFO = 0x9863,
SMSG_AI_REACTION = 0xCEC2,
- SMSG_ALL_ACHIEVEMENT_DATA = 0x00,
+ SMSG_ALL_ACHIEVEMENT_DATA = 0xE6EC,
SMSG_AREA_SPIRIT_HEALER_TIME = 0x00,
SMSG_AREA_TRIGGER_MESSAGE = 0xCC42,
SMSG_ARENA_ERROR = 0x08C7,
@@ -633,6 +633,7 @@ enum Opcodes
SMSG_COMMENTATOR_PLAYER_INFO = 0x9A6E,
SMSG_COMMENTATOR_STATE_CHANGED = 0x4EEE,
SMSG_COMPLAIN_RESULT = 0x8A4B,
+ SMSG_COMPRESSED_ACHIEVEMENT_DATA = 0x5C3B,
SMSG_COMPRESSED_CHAR_ENUM = 0x380A,
SMSG_COMPRESSED_GUILD_ROSTER = 0x5A29,
SMSG_COMPRESSED_MOVES = 0x0862,
@@ -713,6 +714,7 @@ enum Opcodes
SMSG_GROUP_LIST = 0x5C7E,
SMSG_GROUP_SET_LEADER = 0xCCF2,
SMSG_GROUP_UNINVITE = 0x00,
+ SMSG_GUILD_ACHIEVEMENT_DATA = 0xA67E,
SMSG_GUILD_BANK_LIST = 0x5EFB,
SMSG_GUILD_CANCEL = 0x08C3,
SMSG_GUILD_COMMAND_RESULT = 0xDAD7,