diff options
-rw-r--r-- | src/server/game/Handlers/CharacterHandler.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Server/Packet.h | 2 | ||||
-rw-r--r-- | src/server/game/Server/Packets/AuthenticationPackets.h | 2 | ||||
-rw-r--r-- | src/server/game/Server/WorldSocket.cpp | 24 | ||||
-rw-r--r-- | src/server/game/Server/WorldSocket.h | 5 | ||||
-rw-r--r-- | src/server/game/World/World.cpp | 25 | ||||
-rw-r--r-- | src/server/game/World/World.h | 4 |
7 files changed, 44 insertions, 20 deletions
diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index bcad74d50fd..e79cc992725 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -829,6 +829,8 @@ void WorldSession::HandleContinuePlayerLogin() return; } + SendPacket(WorldPackets::Auth::ResumeComms(CONNECTION_TYPE_INSTANCE).Write()); + _charLoginCallback = CharacterDatabase.DelayQueryHolder(holder); } diff --git a/src/server/game/Server/Packet.h b/src/server/game/Server/Packet.h index bf538803ad6..85d65e967be 100644 --- a/src/server/game/Server/Packet.h +++ b/src/server/game/Server/Packet.h @@ -45,7 +45,7 @@ namespace WorldPackets class ServerPacket : public Packet { public: - ServerPacket(OpcodeServer opcode, size_t initialSize = 200) : Packet(WorldPacket(opcode, initialSize)) { } + ServerPacket(OpcodeServer opcode, size_t initialSize = 200, ConnectionType connection = CONNECTION_TYPE_DEFAULT) : Packet(WorldPacket(opcode, initialSize, connection)) { } void Read() override final { ASSERT(!"Read not implemented for server packets."); } diff --git a/src/server/game/Server/Packets/AuthenticationPackets.h b/src/server/game/Server/Packets/AuthenticationPackets.h index eae0cae34f1..f914e18f6bc 100644 --- a/src/server/game/Server/Packets/AuthenticationPackets.h +++ b/src/server/game/Server/Packets/AuthenticationPackets.h @@ -198,7 +198,7 @@ namespace WorldPackets class ResumeComms final : public ServerPacket { public: - ResumeComms() : ServerPacket(SMSG_RESUME_COMMS, 0) { } + ResumeComms(ConnectionType connection) : ServerPacket(SMSG_RESUME_COMMS, 0, connection) { } WorldPacket const* Write() override { return &_worldPacket; } }; diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp index 2b2b2458993..949e783a3ba 100644 --- a/src/server/game/Server/WorldSocket.cpp +++ b/src/server/game/Server/WorldSocket.cpp @@ -182,6 +182,13 @@ void WorldSocket::ExtractOpcodeAndSize(ClientPktHeader const* header, uint32& op } } +void WorldSocket::SetWorldSession(WorldSession* session) +{ + std::lock_guard<std::mutex> sessionGuard(_worldSessionLock); + _worldSession = session; + _authed = true; +} + bool WorldSocket::ReadHeaderHandler() { ASSERT(_headerBuffer.GetActiveSize() == SizeOfClientHeader[_initialized][_authCrypt.IsInitialized()], "Header size " SZFMTD " different than expected %u", _headerBuffer.GetActiveSize(), SizeOfClientHeader[_initialized][_authCrypt.IsInitialized()]); @@ -724,22 +731,7 @@ void WorldSocket::HandleAuthContinuedSession(WorldPackets::Auth::AuthContinuedSe return; } - _worldSession = sWorld->FindSession(accountId); - if (!_worldSession) - { - SendAuthResponseError(AUTH_SESSION_EXPIRED); - TC_LOG_ERROR("network", "WorldSocket::HandleAuthContinuedSession: No active session found for account: %u ('%s') address: %s", accountId, login.c_str(), GetRemoteIpAddress().to_string().c_str()); - DelayedCloseSocket(); - return; - } - - _authed = true; - - WorldPackets::Auth::ResumeComms resumeComms; - SendPacketAndLogOpcode(*resumeComms.Write()); - - _worldSession->AddInstanceConnection(shared_from_this()); - _worldSession->HandleContinuePlayerLogin(); + sWorld->AddInstanceSocket(shared_from_this(), accountId); } void WorldSocket::HandleConnectToFailed(WorldPackets::Auth::ConnectToFailed& connectToFailed) diff --git a/src/server/game/Server/WorldSocket.h b/src/server/game/Server/WorldSocket.h index 482f794344b..e42a310f470 100644 --- a/src/server/game/Server/WorldSocket.h +++ b/src/server/game/Server/WorldSocket.h @@ -85,12 +85,14 @@ public: ConnectionType GetConnectionType() const { return _type; } + void SendAuthResponseError(uint8 code); + void SetWorldSession(WorldSession* session); + protected: void OnClose() override; void ReadHandler() override; bool ReadHeaderHandler(); bool ReadDataHandler(); - private: /// writes network.opcode log /// accessing WorldSession is not threadsafe, only do it when holding _worldSessionLock @@ -104,7 +106,6 @@ private: void HandleAuthSession(WorldPackets::Auth::AuthSession& authSession); void HandleAuthContinuedSession(WorldPackets::Auth::AuthContinuedSession& authSession); void HandleConnectToFailed(WorldPackets::Auth::ConnectToFailed& connectToFailed); - void SendAuthResponseError(uint8 code); bool HandlePing(WorldPacket& recvPacket); diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index cdbb15bf539..7010982dc2b 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -66,6 +66,7 @@ #include "WeatherMgr.h" #include "WorldSession.h" #include "ChatPackets.h" +#include "WorldSocket.h" #include <boost/algorithm/string.hpp> @@ -223,6 +224,11 @@ void World::AddSession(WorldSession* s) addSessQueue.add(s); } +void World::AddInstanceSocket(std::shared_ptr<WorldSocket> sock, uint32 sessionAccountId) +{ + _linkSocketQueue.add(std::make_pair(sock, sessionAccountId)); +} + void World::AddSession_(WorldSession* s) { ASSERT(s); @@ -296,6 +302,21 @@ void World::AddSession_(WorldSession* s) } } +void World::ProcessLinkInstanceSocket(std::pair<std::shared_ptr<WorldSocket>, uint32> linkInfo) +{ + WorldSession* session = FindSession(linkInfo.second); + if (!session) + { + linkInfo.first->SendAuthResponseError(AUTH_SESSION_EXPIRED); + linkInfo.first->DelayedCloseSocket(); + return; + } + + linkInfo.first->SetWorldSession(session); + session->AddInstanceConnection(linkInfo.first); + session->HandleContinuePlayerLogin(); +} + bool World::HasRecentlyDisconnected(WorldSession* session) { if (!session) @@ -2775,6 +2796,10 @@ void World::SendServerMessage(ServerMessageType type, const char *text, Player* void World::UpdateSessions(uint32 diff) { + std::pair<std::shared_ptr<WorldSocket>, uint32> linkInfo; + while (_linkSocketQueue.next(linkInfo)) + ProcessLinkInstanceSocket(std::move(linkInfo)); + ///- Add new sessions WorldSession* sess = NULL; while (addSessQueue.next(sess)) diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h index 78243b19374..b3bebca08e3 100644 --- a/src/server/game/World/World.h +++ b/src/server/game/World/World.h @@ -575,6 +575,7 @@ class World WorldSession* FindSession(uint32 id) const; void AddSession(WorldSession* s); + void AddInstanceSocket(std::shared_ptr<WorldSocket> sock, uint32 sessionAccountId); void SendAutoBroadcast(); bool RemoveSession(uint32 id); /// Get the number of current active sessions @@ -883,6 +884,9 @@ class World void AddSession_(WorldSession* s); LockedQueue<WorldSession*> addSessQueue; + void ProcessLinkInstanceSocket(std::pair<std::shared_ptr<WorldSocket>, uint32> linkInfo); + LockedQueue<std::pair<std::shared_ptr<WorldSocket>, uint32>> _linkSocketQueue; + // used versions std::string m_DBVersion; |