aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2025-05-08 14:30:42 +0200
committerOvahlord <dreadkiller@gmx.de>2025-05-11 11:46:58 +0200
commitf55d6c5fa0147eaea0a8fca316d93fd0b75d8b51 (patch)
treefb72b1a46bfd2b57dde764ffaf4a70459ba36553
parent412c5416f9406548c5b59569fbbcf47438f72f07 (diff)
Core/World: Move linking instance socket to WorldSession
(cherry picked from commit cb837ce926d6a8c13d5f74faea246fea19db91d0)
-rw-r--r--src/server/game/Server/WorldSession.cpp18
-rw-r--r--src/server/game/Server/WorldSession.h2
-rw-r--r--src/server/game/World/World.cpp38
-rw-r--r--src/server/game/World/World.h1
4 files changed, 28 insertions, 31 deletions
diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp
index aa44170eac5..1c8470eaae1 100644
--- a/src/server/game/Server/WorldSession.cpp
+++ b/src/server/game/Server/WorldSession.cpp
@@ -296,6 +296,24 @@ void WorldSession::SendPacket(WorldPacket const* packet, bool forced /*= false*/
m_Socket[conIdx]->SendPacket(*packet);
}
+void WorldSession::AddInstanceConnection(WorldSession* session, std::weak_ptr<WorldSocket> sockRef, ConnectToKey key)
+{
+ std::shared_ptr<WorldSocket> socket = sockRef.lock();
+ if (!socket || !socket->IsOpen())
+ return;
+
+ if (!session || session->GetConnectToInstanceKey() != key.Raw)
+ {
+ socket->SendAuthResponseError(ERROR_TIMED_OUT);
+ socket->DelayedCloseSocket();
+ return;
+ }
+
+ socket->SetWorldSession(session);
+ session->m_Socket[CONNECTION_TYPE_INSTANCE] = std::move(socket);
+ session->HandleContinuePlayerLogin();
+}
+
/// Add an incoming packet to the queue
void WorldSession::QueuePacket(WorldPacket* new_packet)
{
diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h
index 750bdb7a9cf..9384f99928d 100644
--- a/src/server/game/Server/WorldSession.h
+++ b/src/server/game/Server/WorldSession.h
@@ -913,7 +913,6 @@ class TC_GAME_API WorldSession
bool IsAddonRegistered(std::string_view prefix) const;
void SendPacket(WorldPacket const* packet, bool forced = false);
- void AddInstanceConnection(std::shared_ptr<WorldSocket> sock) { m_Socket[CONNECTION_TYPE_INSTANCE] = sock; }
void SendNotification(char const* format, ...) ATTR_PRINTF(2, 3);
void SendNotification(uint32 stringId, ...);
@@ -1742,6 +1741,7 @@ class TC_GAME_API WorldSession
};
uint64 GetConnectToInstanceKey() const { return _instanceConnectKey.Raw; }
+ static void AddInstanceConnection(WorldSession* session, std::weak_ptr<WorldSocket> sockRef, ConnectToKey key);
public:
QueryCallbackProcessor& GetQueryProcessor() { return _queryProcessor; }
diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
index 2e881abccc3..78e113aab48 100644
--- a/src/server/game/World/World.cpp
+++ b/src/server/game/World/World.cpp
@@ -103,7 +103,6 @@
#include "WeatherMgr.h"
#include "WhoListStorage.h"
#include "WorldSession.h"
-#include "WorldSocket.h"
#include "WorldStateMgr.h"
TC_GAME_API std::atomic<bool> World::m_stopEvent(false);
@@ -439,30 +438,6 @@ void World::AddSession_(WorldSession* s)
}
}
-void World::ProcessLinkInstanceSocket(std::pair<std::weak_ptr<WorldSocket>, uint64> linkInfo)
-{
- if (std::shared_ptr<WorldSocket> sock = linkInfo.first.lock())
- {
- if (!sock->IsOpen())
- return;
-
- WorldSession::ConnectToKey key;
- key.Raw = linkInfo.second;
-
- WorldSession* session = FindSession(uint32(key.Fields.AccountId));
- if (!session || session->GetConnectToInstanceKey() != linkInfo.second)
- {
- sock->SendAuthResponseError(ERROR_TIMED_OUT);
- sock->DelayedCloseSocket();
- return;
- }
-
- sock->SetWorldSession(session);
- session->AddInstanceConnection(sock);
- session->HandleContinuePlayerLogin();
- }
-}
-
bool World::HasRecentlyDisconnected(WorldSession* session)
{
if (!session)
@@ -3383,10 +3358,6 @@ void World::SendServerMessage(ServerMessageType messageID, std::string_view stri
void World::UpdateSessions(uint32 diff)
{
- std::pair<std::weak_ptr<WorldSocket>, uint64> linkInfo;
- while (_linkSocketQueue.next(linkInfo))
- ProcessLinkInstanceSocket(std::move(linkInfo));
-
{
TC_METRIC_DETAILED_NO_THRESHOLD_TIMER("world_update_time",
TC_METRIC_TAG("type", "Add sessions"),
@@ -3397,6 +3368,15 @@ void World::UpdateSessions(uint32 diff)
AddSession_(sess);
}
+ {
+ std::pair<std::weak_ptr<WorldSocket>, uint64> linkInfo;
+ while (_linkSocketQueue.next(linkInfo))
+ {
+ WorldSession::ConnectToKey key = { .Raw = linkInfo.second };
+ WorldSession::AddInstanceConnection(FindSession(key.Fields.AccountId), linkInfo.first, key);
+ }
+ }
+
///- Then send an update signal to remaining ones
for (SessionMap::iterator itr = m_sessions.begin(), next; itr != m_sessions.end(); itr = next)
{
diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h
index ccc2176e0d7..710f25666b2 100644
--- a/src/server/game/World/World.h
+++ b/src/server/game/World/World.h
@@ -880,7 +880,6 @@ class TC_GAME_API World
void AddSession_(WorldSession* s);
LockedQueue<WorldSession*> addSessQueue;
- void ProcessLinkInstanceSocket(std::pair<std::weak_ptr<WorldSocket>, uint64> linkInfo);
LockedQueue<std::pair<std::weak_ptr<WorldSocket>, uint64>> _linkSocketQueue;
// used versions