aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Server/Packets
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2015-02-23 22:35:26 +0100
committerShauren <shauren.trinity@gmail.com>2015-02-23 22:35:26 +0100
commit3fcea2e9d4adf26ed97d2ffad78425346782d418 (patch)
tree87d4e7cac3e71954011dfdfa5154a6cef2f7a49a /src/server/game/Server/Packets
parent880be1bc63417290bcaae5527ddcd2995a3afeb0 (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')
-rw-r--r--src/server/game/Server/Packets/AuthenticationPackets.cpp6
-rw-r--r--src/server/game/Server/Packets/AuthenticationPackets.h24
-rw-r--r--src/server/game/Server/Packets/CharacterPackets.cpp6
-rw-r--r--src/server/game/Server/Packets/CharacterPackets.h26
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: