diff options
| author | Shauren <shauren.trinity@gmail.com> | 2015-02-23 22:35:26 +0100 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2015-02-23 22:35:26 +0100 |
| commit | 3fcea2e9d4adf26ed97d2ffad78425346782d418 (patch) | |
| tree | 87d4e7cac3e71954011dfdfa5154a6cef2f7a49a /src/server/game/Server/Packets | |
| parent | 880be1bc63417290bcaae5527ddcd2995a3afeb0 (diff) | |
Core/PacketIO: Handle ConnectToFailed and allow the client to reconnect up to 5 times before aborting login to world
Closes #14214
Diffstat (limited to 'src/server/game/Server/Packets')
4 files changed, 61 insertions, 1 deletions
diff --git a/src/server/game/Server/Packets/AuthenticationPackets.cpp b/src/server/game/Server/Packets/AuthenticationPackets.cpp index 97f68e676a6..14f5de79e2c 100644 --- a/src/server/game/Server/Packets/AuthenticationPackets.cpp +++ b/src/server/game/Server/Packets/AuthenticationPackets.cpp @@ -592,3 +592,9 @@ void WorldPackets::Auth::AuthContinuedSession::Read() _worldPacket >> Key; _worldPacket.read(Digest, SHA_DIGEST_LENGTH); } + +void WorldPackets::Auth::ConnectToFailed::Read() +{ + _worldPacket >> Serial; + _worldPacket >> Con; +} diff --git a/src/server/game/Server/Packets/AuthenticationPackets.h b/src/server/game/Server/Packets/AuthenticationPackets.h index 09b528910cd..ecb6061db2c 100644 --- a/src/server/game/Server/Packets/AuthenticationPackets.h +++ b/src/server/game/Server/Packets/AuthenticationPackets.h @@ -138,6 +138,17 @@ namespace WorldPackets 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 }; + enum class ConnectToSerial : uint32 + { + None = 0, + Realm = 14, + WorldAttempt1 = 17, + WorldAttempt2 = 35, + WorldAttempt3 = 53, + WorldAttempt4 = 71, + WorldAttempt5 = 89 + }; + class ConnectTo final : public ServerPacket { static std::string const Haiku; @@ -157,7 +168,7 @@ namespace WorldPackets WorldPacket const* Write() override; uint64 Key = 0; - uint32 Serial = 0; + ConnectToSerial Serial = ConnectToSerial::None; ConnectPayload Payload; uint8 Con = 0; @@ -191,6 +202,17 @@ namespace WorldPackets WorldPacket const* Write() override { return &_worldPacket; } }; + + class ConnectToFailed final : public ClientPacket + { + public: + ConnectToFailed(WorldPacket&& packet) : ClientPacket(CMSG_CONNECT_TO_FAILED, std::move(packet)) { } + + void Read() override; + + uint32 Serial = 0; + uint8 Con = 0; + }; } } diff --git a/src/server/game/Server/Packets/CharacterPackets.cpp b/src/server/game/Server/Packets/CharacterPackets.cpp index 0eabb1ee351..f69cdee736c 100644 --- a/src/server/game/Server/Packets/CharacterPackets.cpp +++ b/src/server/game/Server/Packets/CharacterPackets.cpp @@ -357,6 +357,12 @@ WorldPacket const* WorldPackets::Character::LoginVerifyWorld::Write() return &_worldPacket; } +WorldPacket const* WorldPackets::Character::CharacterLoginFailed::Write() +{ + _worldPacket << uint8(Code); + return &_worldPacket; +} + WorldPacket const* WorldPackets::Character::LogoutResponse::Write() { _worldPacket << int32(LogoutResult); diff --git a/src/server/game/Server/Packets/CharacterPackets.h b/src/server/game/Server/Packets/CharacterPackets.h index 7784ffee417..b398af0b04b 100644 --- a/src/server/game/Server/Packets/CharacterPackets.h +++ b/src/server/game/Server/Packets/CharacterPackets.h @@ -429,6 +429,32 @@ namespace WorldPackets uint32 Reason = 0; }; + enum class LoginFailureReason : uint8 + { + Failed = 0, + NoWorld = 1, + DuplicateCharacter = 2, + NoInstances = 3, + Disabled = 4, + NoCharacter = 5, + LockedForTransfer = 6, + LockedByBilling = 7, + LockedByMobileAH = 8, + TemporaryGMLock = 9, + LockedByCharacterUpgrade = 10, + LockedByRevokedCharacterUpgrade = 11 + }; + + class CharacterLoginFailed final : public ServerPacket + { + public: + CharacterLoginFailed(LoginFailureReason code) : ServerPacket(SMSG_CHARACTER_LOGIN_FAILED, 1), Code(code) { } + + WorldPacket const* Write() override; + + LoginFailureReason Code = LoginFailureReason::Failed; + }; + class LogoutRequest final : public ClientPacket { public: |
