aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Server/Packets
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2016-03-25 21:33:55 +0100
committerShauren <shauren.trinity@gmail.com>2016-03-25 21:33:55 +0100
commit9ad79934d3f1e33488dde2959dfad6fa80094e1d (patch)
tree141f8ccdf3ec765ac9c5dcb4f5e91fa19788ab0f /src/server/game/Server/Packets
parent45c857a6bf78f7913ad4032524c84df41b7efc5f (diff)
Core/PacketIO: Updated packet structures to 6.2.4.21355
Diffstat (limited to 'src/server/game/Server/Packets')
-rw-r--r--src/server/game/Server/Packets/AuthenticationPackets.cpp295
-rw-r--r--src/server/game/Server/Packets/AuthenticationPackets.h33
-rw-r--r--src/server/game/Server/Packets/CharacterPackets.cpp8
-rw-r--r--src/server/game/Server/Packets/CharacterPackets.h3
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;