diff options
-rwxr-xr-x | src/server/game/Achievements/AchievementMgr.cpp | 49 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 3 | ||||
-rwxr-xr-x | src/server/game/Server/Protocol/Opcodes.h | 4 |
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, |