diff options
| author | Shauren <shauren.trinity@gmail.com> | 2016-03-25 21:33:55 +0100 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2016-03-25 21:33:55 +0100 |
| commit | 9ad79934d3f1e33488dde2959dfad6fa80094e1d (patch) | |
| tree | 141f8ccdf3ec765ac9c5dcb4f5e91fa19788ab0f /src/server/game/Server/Packets | |
| parent | 45c857a6bf78f7913ad4032524c84df41b7efc5f (diff) | |
Core/PacketIO: Updated packet structures to 6.2.4.21355
Diffstat (limited to 'src/server/game/Server/Packets')
4 files changed, 54 insertions, 285 deletions
diff --git a/src/server/game/Server/Packets/AuthenticationPackets.cpp b/src/server/game/Server/Packets/AuthenticationPackets.cpp index 6a76f8ee3b8..648d03ec4ef 100644 --- a/src/server/game/Server/Packets/AuthenticationPackets.cpp +++ b/src/server/game/Server/Packets/AuthenticationPackets.cpp @@ -20,34 +20,39 @@ WorldPacket const* WorldPackets::Auth::AuthChallenge::Write() { - _worldPacket << uint32(Challenge); _worldPacket.append(DosChallenge, 8); + _worldPacket.append(Challenge.data(), Challenge.size()); _worldPacket << uint8(DosZeroBits); return &_worldPacket; } void WorldPackets::Auth::AuthSession::Read() { - uint32 addonDataSize; + uint32 addonDataSize, realmJoinTicketSize; - _worldPacket >> LoginServerID; _worldPacket >> Build; + _worldPacket >> BuildType; _worldPacket >> RegionID; _worldPacket >> BattlegroupID; _worldPacket >> RealmID; - _worldPacket >> LoginServerType; - _worldPacket >> BuildType; - _worldPacket >> LocalChallenge; + _worldPacket.read(LocalChallenge.data(), LocalChallenge.size()); + _worldPacket.read(Digest.data(), Digest.size()); _worldPacket >> DosResponse; - _worldPacket.read(Digest, SHA_DIGEST_LENGTH); - Account = _worldPacket.ReadString(_worldPacket.ReadBits(11)); - UseIPv6 = _worldPacket.ReadBit(); // UseIPv6 _worldPacket >> addonDataSize; if (addonDataSize) { - AddonInfo.resize(addonDataSize); - _worldPacket.read(AddonInfo.contents(), addonDataSize); + AddonInfo.resize(std::min(addonDataSize, uint32(_worldPacket.size() - _worldPacket.rpos()))); + _worldPacket.read(AddonInfo.contents(), AddonInfo.size()); + } + + _worldPacket >> realmJoinTicketSize; + if (realmJoinTicketSize) + { + RealmJoinTicket.resize(std::min(realmJoinTicketSize, uint32(_worldPacket.size() - _worldPacket.rpos()))); + _worldPacket.read(reinterpret_cast<uint8*>(&RealmJoinTicket[0]), RealmJoinTicket.size()); } + + UseIPv6 = _worldPacket.ReadBit(); // UseIPv6 } WorldPackets::Auth::AuthResponse::AuthResponse() @@ -57,7 +62,7 @@ WorldPackets::Auth::AuthResponse::AuthResponse() WorldPacket const* WorldPackets::Auth::AuthResponse::Write() { - _worldPacket << uint8(Result); + _worldPacket << uint32(Result); _worldPacket.WriteBit(SuccessInfo.is_initialized()); _worldPacket.WriteBit(WaitInfo.is_initialized()); _worldPacket.FlushBits(); @@ -294,7 +299,7 @@ WorldPacket const* WorldPackets::Auth::ConnectTo::Write() ByteBuffer payload; uint16 port = Payload.Where.port(); uint8 address[16] = { 0 }; - uint32 addressType = 3; + uint8 addressType = 3; if (Payload.Where.address().is_v4()) { memcpy(address, Payload.Where.address().to_v4().to_bytes().data(), 4); @@ -308,7 +313,7 @@ WorldPacket const* WorldPackets::Auth::ConnectTo::Write() HmacSha1 hmacHash(64, WherePacketHmac); hmacHash.UpdateData(address, 16); - hmacHash.UpdateData((uint8* const)&addressType, 4); + hmacHash.UpdateData(&addressType, 1); hmacHash.UpdateData((uint8* const)&port, 2); hmacHash.UpdateData((uint8* const)Haiku.c_str(), 71); hmacHash.UpdateData(Payload.PanamaKey, 32); @@ -316,260 +321,15 @@ WorldPacket const* WorldPackets::Auth::ConnectTo::Write() hmacHash.UpdateData(&Payload.XorMagic, 1); hmacHash.Finalize(); - uint8* hmac = hmacHash.GetDigest(); - - payload << uint8(Haiku[53]); - payload << uint8(PiDigits[12]); - payload << uint8(Haiku[27]); - payload << uint8(PiDigits[65]); - payload << uint8(PiDigits[96]); - payload << uint8(Haiku[29]); - payload << uint8(Payload.PanamaKey[12]); - payload << uint8(hmac[3]); - payload << uint8(PiDigits[10]); - payload << uint8(Payload.PanamaKey[20]); - payload << uint8(PiDigits[14]); - payload << uint8(hmac[17]); - payload << uint8(Haiku[3]); - payload << uint8(PiDigits[26]); - payload << uint8(PiDigits[94]); - payload << uint8(PiDigits[7]); - payload << uint8(PiDigits[93]); - payload << uint8(Payload.PanamaKey[8]); - payload << uint8(PiDigits[40]); - payload << uint8(PiDigits[52]); - payload << uint8(Haiku[44]); - payload << uint8(address[13]); - payload << uint8(Haiku[57]); - payload << uint8(PiDigits[59]); - payload << uint8(PiDigits[97]); - payload << uint8(PiDigits[42]); - payload << uint8(Haiku[70]); - payload << uint8(Haiku[42]); - payload << uint8(PiDigits[50]); - payload << uint8(address[3]); - payload << uint8(PiDigits[60]); - payload << uint8(address[12]); - payload << uint8(PiDigits[86]); - payload << uint8(Haiku[56]); - payload << uint8(PiDigits[70]); - payload << uint8(Haiku[26]); - payload << uint8(PiDigits[74]); - payload << uint8(PiDigits[49]); - payload << uint8(Payload.PanamaKey[28]); - payload << uint8(Haiku[69]); - payload << uint8(hmac[9]); - payload << uint8(Haiku[15]); - payload << uint8(Payload.PanamaKey[0]); - payload << uint8(Payload.PanamaKey[6]); - payload << uint8(Haiku[17]); - payload << uint8((port >> 8) & 0xFF); - payload << uint8(PiDigits[20]); - payload << uint8(PiDigits[99]); - payload << uint8(PiDigits[95]); - payload << uint8(PiDigits[100]); - payload << uint8(PiDigits[105]); - payload << uint8(hmac[13]); - payload << uint8(Payload.PanamaKey[9]); - payload << uint8(PiDigits[41]); - payload << uint8(PiDigits[35]); - payload << uint8(Haiku[10]); - payload << uint8(Haiku[20]); - payload << uint8(Haiku[14]); - payload << uint8(Haiku[47]); - payload << uint8(Payload.PanamaKey[10]); - payload << uint8(PiDigits[54]); - payload << uint8(PiDigits[67]); - payload << uint8(PiDigits[79]); - payload << uint8(Payload.PanamaKey[3]); - payload << uint8(PiDigits[84]); - payload << uint8(Haiku[33]); - payload << uint8(Haiku[23]); - payload << uint8(Haiku[48]); - payload << uint8(PiDigits[64]); - payload << uint8(PiDigits[85]); - payload << uint8(Payload.PanamaKey[24]); - payload << uint8(hmac[8]); - payload << uint8(PiDigits[101]); - payload << uint8(addressType); - payload << uint8(PiDigits[53]); - payload << uint8(Haiku[39]); - payload << uint8(hmac[19]); - payload << uint8(Payload.PanamaKey[31]); - payload << uint8(Payload.PanamaKey[18]); - payload << uint8(hmac[4]); - payload << uint8(Haiku[54]); - payload << uint8(PiDigits[76]); - payload << uint8(address[9]); - payload << uint8(hmac[7]); - payload << uint8(PiDigits[80]); - payload << uint8(hmac[2]); - payload << uint8(Haiku[13]); - payload << uint8(Haiku[11]); - payload << uint8(Payload.PanamaKey[7]); - payload << uint8(Haiku[64]); - payload << uint8(Haiku[62]); - payload << uint8(Haiku[9]); - payload << uint8(Payload.PanamaKey[26]); - payload << uint8(hmac[1]); - payload << uint8(hmac[15]); - payload << uint8(PiDigits[25]); - payload << uint8(hmac[14]); - payload << uint8(Haiku[35]); - payload << uint8(Haiku[43]); - payload << uint8(PiDigits[58]); - payload << uint8(Payload.PanamaKey[1]); - payload << uint8(PiDigits[45]); - payload << uint8(Payload.PanamaKey[25]); - payload << uint8(PiDigits[69]); - payload << uint8(PiDigits[27]); - payload << uint8(address[4]); - payload << uint8(PiDigits[11]); - payload << uint8(Payload.PanamaKey[16]); - payload << uint8(PiDigits[38]); - payload << uint8(PiDigits[82]); - payload << uint8(PiDigits[1]); - payload << uint8(PiDigits[103]); - payload << uint8(address[10]); - payload << uint8(Haiku[18]); - payload << uint8(PiDigits[91]); - payload << uint8(PiDigits[75]); - payload << uint8(PiDigits[34]); - payload << uint8(Payload.PanamaKey[27]); - payload << uint8(PiDigits[106]); - payload << uint8(PiDigits[28]); - payload << uint8(Haiku[8]); - payload << uint8(PiDigits[5]); - payload << uint8(Haiku[68]); - payload << uint8(Payload.PanamaKey[15]); - payload << uint8(address[2]); - payload << uint8(PiDigits[48]); - payload << uint8(PiDigits[107]); - payload << uint8(Payload.PanamaKey[17]); - payload << uint8(PiDigits[15]); payload << uint32(Payload.Adler32); - payload << uint8(PiDigits[36]); - payload << uint8(address[5]); - payload << uint8(PiDigits[71]); - payload << uint8(address[15]); - payload << uint8(address[0]); - payload << uint8(hmac[5]); - payload << uint8(PiDigits[83]); - payload << uint8(Payload.PanamaKey[14]); - payload << uint8(PiDigits[55]); - payload << uint8(PiDigits[31]); - payload << uint8(Haiku[52]); - payload << uint8(PiDigits[22]); - payload << uint8(PiDigits[8]); - payload << uint8(PiDigits[6]); - payload << uint8(Payload.PanamaKey[21]); - payload << uint8(port & 0xFF); - payload << uint8(PiDigits[51]); - payload << uint8(Haiku[31]); - payload << uint8(Haiku[59]); - payload << uint8(PiDigits[17]); - payload << uint8(PiDigits[88]); - payload << uint8(PiDigits[32]); - payload << uint8(address[6]); - payload << uint8(Haiku[49]); - payload << uint8(PiDigits[21]); - payload << uint8(Payload.PanamaKey[13]); - payload << uint8(address[1]); - payload << uint8(Haiku[19]); - payload << uint8(Haiku[63]); - payload << uint8(PiDigits[4]); - payload << uint8(Haiku[65]); - payload << uint8(PiDigits[39]); - payload << uint8(Haiku[21]); - payload << uint8(Haiku[32]); - payload << uint8(Haiku[25]); - payload << uint8(Haiku[1]); - payload << uint8(PiDigits[9]); - payload << uint8(Haiku[2]); - payload << uint8(Payload.PanamaKey[22]); - payload << uint8(PiDigits[78]); - payload << uint8(Haiku[4]); - payload << uint8(Haiku[50]); - payload << uint8(Payload.PanamaKey[29]); - payload << uint8(hmac[12]); - payload << uint8(PiDigits[56]); - payload << uint8(address[11]); - payload << uint8(PiDigits[102]); - payload << uint8(Payload.PanamaKey[19]); - payload << uint8(PiDigits[33]); - payload << uint8(Haiku[30]); - payload << uint8(Payload.PanamaKey[5]); - payload << uint8(PiDigits[46]); - payload << uint8(PiDigits[30]); - payload << uint8(PiDigits[98]); - payload << uint8(Haiku[66]); - payload << uint8(PiDigits[77]); - payload << uint8(PiDigits[63]); - payload << uint8(Payload.PanamaKey[11]); - payload << uint8(PiDigits[2]); - payload << uint8(Haiku[61]); - payload << uint8(address[7]); - payload << uint8(PiDigits[3]); - payload << uint8(Haiku[12]); - payload << uint8(Haiku[40]); - payload << uint8(PiDigits[57]); - payload << uint8(Haiku[28]); - payload << uint8(PiDigits[29]); - payload << uint8(Haiku[46]); - payload << uint8(PiDigits[44]); - payload << uint8(address[14]); - payload << uint8(PiDigits[16]); - payload << uint8(PiDigits[87]); - payload << uint8(PiDigits[81]); - payload << uint8(hmac[18]); - payload << uint8(address[8]); - payload << uint8(Haiku[6]); - payload << uint8(hmac[16]); - payload << uint8(PiDigits[62]); - payload << uint8(PiDigits[72]); - payload << uint8(PiDigits[18]); - payload << uint8(PiDigits[43]); - payload << uint8(Haiku[7]); - payload << uint8(Haiku[37]); + payload << uint8(addressType); + payload.append(address, 16); + payload << uint16(port); + payload.append(Haiku.data(), 71); + payload.append(Payload.PanamaKey, 32); + payload.append(PiDigits, 108); payload << uint8(Payload.XorMagic); - payload << uint8(Payload.PanamaKey[2]); - payload << uint8(PiDigits[92]); - payload << uint8(PiDigits[47]); - payload << uint8(PiDigits[13]); - payload << uint8(PiDigits[66]); - payload << uint8(Haiku[55]); - payload << uint8(PiDigits[73]); - payload << uint8(Haiku[5]); - payload << uint8(PiDigits[0]); - payload << uint8(Haiku[16]); - payload << uint8(Haiku[34]); - payload << uint8(hmac[10]); - payload << uint8(PiDigits[89]); - payload << uint8(Haiku[38]); - payload << uint8(Haiku[22]); - payload << uint8(hmac[11]); - payload << uint8(PiDigits[61]); - payload << uint8(Haiku[0]); - payload << uint8(hmac[0]); - payload << uint8(Haiku[24]); - payload << uint8(PiDigits[37]); - payload << uint8(hmac[6]); - payload << uint8(Haiku[41]); - payload << uint8(Haiku[60]); - payload << uint8(PiDigits[90]); - payload << uint8(Haiku[67]); - payload << uint8(Haiku[51]); - payload << uint8(PiDigits[24]); - payload << uint8(PiDigits[23]); - payload << uint8(Haiku[58]); - payload << uint8(Haiku[45]); - payload << uint8(PiDigits[104]); - payload << uint8(PiDigits[68]); - payload << uint8(Payload.PanamaKey[30]); - payload << uint8(Payload.PanamaKey[23]); - payload << uint8(Payload.PanamaKey[4]); - payload << uint8(Haiku[36]); - payload << uint8(PiDigits[19]); + payload.append(hmacHash.GetDigest(), hmacHash.GetLength()); BigNumber bnData; bnData.SetBinary(payload.contents(), payload.size()); @@ -594,7 +354,8 @@ void WorldPackets::Auth::AuthContinuedSession::Read() { _worldPacket >> DosResponse; _worldPacket >> Key; - _worldPacket.read(Digest, SHA_DIGEST_LENGTH); + _worldPacket.read(LocalChallenge.data(), LocalChallenge.size()); + _worldPacket.read(Digest.data(), Digest.size()); } void WorldPackets::Auth::ConnectToFailed::Read() diff --git a/src/server/game/Server/Packets/AuthenticationPackets.h b/src/server/game/Server/Packets/AuthenticationPackets.h index 123d4a24f10..5bd433ebb57 100644 --- a/src/server/game/Server/Packets/AuthenticationPackets.h +++ b/src/server/game/Server/Packets/AuthenticationPackets.h @@ -38,7 +38,7 @@ namespace WorldPackets WorldPacket const* Write() override; - uint32 Challenge = 0; + std::array<uint8, 16> Challenge; uint32 DosChallenge[8]; ///< Encryption seeds uint8 DosZeroBits = 0; }; @@ -46,26 +46,27 @@ namespace WorldPackets class AuthSession final : public ClientPacket { public: + static uint32 const DigestLength = 24; + AuthSession(WorldPacket&& packet) : ClientPacket(CMSG_AUTH_SESSION, std::move(packet)) { - memset(Digest, 0, SHA_DIGEST_LENGTH); + LocalChallenge.fill(0); + Digest.fill(0); } void Read() override; - uint32 BattlegroupID = 0; - int8 LoginServerType = 0; ///< Auth type used - 0 GRUNT, 1 battle.net - int8 BuildType = 0; - uint32 RealmID = 0; uint16 Build = 0; - uint32 LocalChallenge = 0; - int32 LoginServerID = 0; + int8 BuildType = 0; uint32 RegionID = 0; + uint32 BattlegroupID = 0; + uint32 RealmID = 0; + std::array<uint8, 16> LocalChallenge; + std::array<uint8, DigestLength> Digest; uint64 DosResponse = 0; - uint8 Digest[SHA_DIGEST_LENGTH]; - std::string Account; - bool UseIPv6 = false; ByteBuffer AddonInfo; + std::string RealmJoinTicket; + bool UseIPv6 = false; }; class AuthResponse final : public ServerPacket @@ -121,7 +122,7 @@ namespace WorldPackets Optional<AuthSuccessInfo> SuccessInfo; ///< contains the packet data in case that it has account information (It is never set when WaitInfo is set), otherwise its contents are undefined. Optional<AuthWaitInfo> WaitInfo; ///< contains the queue wait information in case the account is in the login queue. - uint8 Result = 0; ///< the result of the authentication process, it is AUTH_OK if it succeeded and the account is ready to log in. It can also be AUTH_WAIT_QUEUE if the account entered the login queue (Queued, QueuePos), possible values are @ref ResponseCodes + uint32 Result = 0; ///< the result of the authentication process, it is AUTH_OK if it succeeded and the account is ready to log in. It can also be AUTH_WAIT_QUEUE if the account entered the login queue (Queued, QueuePos), possible values are @ref ResponseCodes }; enum class ConnectToSerial : uint32 @@ -169,16 +170,20 @@ namespace WorldPackets class AuthContinuedSession final : public ClientPacket { public: + static uint32 const DigestLength = 24; + AuthContinuedSession(WorldPacket&& packet) : ClientPacket(CMSG_AUTH_CONTINUED_SESSION, std::move(packet)) { - memset(Digest, 0, SHA_DIGEST_LENGTH); + LocalChallenge.fill(0); + Digest.fill(0); } void Read() override; uint64 DosResponse = 0; uint64 Key = 0; - uint8 Digest[SHA_DIGEST_LENGTH]; + std::array<uint8, 16> LocalChallenge; + std::array<uint8, DigestLength> Digest; }; class ResumeComms final : public ServerPacket diff --git a/src/server/game/Server/Packets/CharacterPackets.cpp b/src/server/game/Server/Packets/CharacterPackets.cpp index d54402d40c7..d30779d49c2 100644 --- a/src/server/game/Server/Packets/CharacterPackets.cpp +++ b/src/server/game/Server/Packets/CharacterPackets.cpp @@ -28,8 +28,8 @@ WorldPackets::Character::EnumCharactersResult::CharacterInfo::CharacterInfo(Fiel // "characters.hairColor, characters.facialStyle, characters.level, characters.zone, characters.map, characters.position_x, characters.position_y, characters.position_z, " // 16 17 18 19 20 21 22 // "guild_member.guildid, characters.playerFlags, characters.at_login, character_pet.entry, character_pet.modelid, character_pet.level, characters.equipmentCache, " - // 23 24 25 - // "character_banned.guid, characters.slot, character_declinedname.genitive" + // 23 24 25 26 + // "character_banned.guid, characters.slot, characters.logout_time, character_declinedname.genitive" Guid = ObjectGuid::Create<HighGuid::Player>(fields[0].GetUInt64()); Name = fields[1].GetString(); @@ -72,7 +72,7 @@ WorldPackets::Character::EnumCharactersResult::CharacterInfo::CharacterInfo(Fiel if (fields[23].GetUInt64()) Flags |= CHARACTER_FLAG_LOCKED_BY_BILLING; - if (sWorld->getBoolConfig(CONFIG_DECLINED_NAMES_USED) && !fields[25].GetString().empty()) + if (sWorld->getBoolConfig(CONFIG_DECLINED_NAMES_USED) && !fields[26].GetString().empty()) Flags |= CHARACTER_FLAG_DECLINED; if (atLoginFlags & AT_LOGIN_CUSTOMIZE) @@ -102,6 +102,7 @@ WorldPackets::Character::EnumCharactersResult::CharacterInfo::CharacterInfo(Fiel Tokenizer equipment(fields[22].GetString(), ' '); ListPosition = fields[24].GetUInt8(); + LastPlayedTime = fields[25].GetUInt32(); for (uint8 slot = 0; slot < INVENTORY_SLOT_BAG_END; ++slot) { @@ -155,6 +156,7 @@ WorldPacket const* WorldPackets::Character::EnumCharactersResult::Write() _worldPacket << uint8(charInfo.VisualItems[slot].InventoryType); } + _worldPacket << uint32(charInfo.LastPlayedTime); _worldPacket.WriteBits(charInfo.Name.length(), 6); _worldPacket.WriteBit(charInfo.FirstLogin); _worldPacket.WriteBit(charInfo.BoostInProgress); diff --git a/src/server/game/Server/Packets/CharacterPackets.h b/src/server/game/Server/Packets/CharacterPackets.h index bb163b075cc..017dddd1d06 100644 --- a/src/server/game/Server/Packets/CharacterPackets.h +++ b/src/server/game/Server/Packets/CharacterPackets.h @@ -133,6 +133,7 @@ namespace WorldPackets uint32 Flags3 = 0; ///< Character flags 3 @todo research bool FirstLogin = false; uint8 unkWod61x = 0; + uint32 LastPlayedTime = 0; struct PetInfo { @@ -721,7 +722,7 @@ namespace WorldPackets { public: SetPlayerDeclinedNames(WorldPacket&& packet) : ClientPacket(CMSG_SET_PLAYER_DECLINED_NAMES, std::move(packet)) { } - + void Read() override; ObjectGuid Player; |
