diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index 6e75fa7063..8315735476 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -752,7 +752,10 @@ void WorldSession::HandlePlayerLoginOpcode(WorldPackets::Character::PlayerLogin& return; } - SendConnectToInstance(WorldPackets::Auth::ConnectToSerial::WorldAttempt1); + if (_legacyConnectionModeEnabled) + HandleContinuePlayerLogin(); + else + SendConnectToInstance(WorldPackets::Auth::ConnectToSerial::WorldAttempt1); } void WorldSession::HandleContinuePlayerLogin() @@ -770,7 +773,8 @@ void WorldSession::HandleContinuePlayerLogin() return; } - SendPacket(WorldPackets::Auth::ResumeComms(CONNECTION_TYPE_INSTANCE).Write()); + if (!_legacyConnectionModeEnabled) + SendPacket(WorldPackets::Auth::ResumeComms(CONNECTION_TYPE_INSTANCE).Write()); AddQueryHolderCallback(CharacterDatabase.DelayQueryHolder(holder)).AfterComplete([this](SQLQueryHolderBase const& holder) { diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index e21f991a32..8a669eef72 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -16,13 +16,16 @@ */ #include "Opcodes.h" -#include "Log.h" -#include "WorldSession.h" -#include "Packets/AllPackets.h" + #include #include -template +#include "Log.h" +#include "Packets/AllPackets.h" +#include "World.h" +#include "WorldSession.h" + +template class PacketHandler : public ClientOpcodeHandler { public: @@ -128,6 +131,10 @@ void OpcodeTable::ValidateAndSetServerOpcode(OpcodeServer opcode, char const* na return; } + // If the legacy connection mode has been enabled, all packets will get sent on one connection + if (sWorld->getBoolConfig(CONFIG_LEGACY_CONNECTION_MODE)) + conIdx = CONNECTION_TYPE_REALM; + if (_internalTableServer[opcode] != nullptr) { TC_LOG_ERROR("network", "Tried to override server handler of %s with %s (opcode %u)", opcodeTable[opcode]->Name, name, opcode); diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index 29b5930951..ea6d66535a 100644 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -140,7 +140,8 @@ WorldSession::WorldSession(uint32 id, std::string&& name, uint32 battlenetAccoun _timeSyncClockDeltaQueue(std::make_unique>>(6)), _timeSyncClockDelta(0), _pendingTimeSyncRequests(), - _gameClient(new GameClient(this)) + _gameClient(new GameClient(this)), + _legacyConnectionModeEnabled(sWorld->getBoolConfig(CONFIG_LEGACY_CONNECTION_MODE)) { memset(m_Tutorials, 0, sizeof(m_Tutorials)); diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 0aa183a59e..fe2a05008d 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -1420,6 +1420,7 @@ class TC_GAME_API WorldSession ConnectToKey _instanceConnectKey; GameClient* _gameClient; + bool _legacyConnectionModeEnabled; WorldSession(WorldSession const& right) = delete; WorldSession& operator=(WorldSession const& right) = delete; diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 0977c3b799..daf3a151c6 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -1644,6 +1644,9 @@ void World::LoadConfigSettings(bool reload) // Anti movement cheat measure. Time each client have to acknowledge a movement change until they are kicked m_int_configs[CONFIG_PENDING_MOVE_CHANGES_TIMEOUT] = sConfigMgr->GetIntDefault("AntiCheat.PendingMoveChangesTimeoutTime", 0); + // Legacy connection mode + m_bool_configs[CONFIG_LEGACY_CONNECTION_MODE] = sConfigMgr->GetBoolDefault("LegacyConnectionModeEnabled", false); + // call ScriptMgr if we're reloading the configuration if (reload) sScriptMgr->OnConfigLoad(reload); diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h index 856f44eea8..81426b7e73 100644 --- a/src/server/game/World/World.h +++ b/src/server/game/World/World.h @@ -186,6 +186,7 @@ enum WorldBoolConfigs : uint8 CONFIG_CHECK_GOBJECT_LOS, CONFIG_RESPAWN_DYNAMIC_ESCORTNPC, CONFIG_CACHE_DATA_QUERIES, + CONFIG_LEGACY_CONNECTION_MODE, BOOL_CONFIG_VALUE_COUNT }; diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist index 43ad099497..9c3d1022c8 100644 --- a/src/server/worldserver/worldserver.conf.dist +++ b/src/server/worldserver/worldserver.conf.dist @@ -266,6 +266,15 @@ ProcessPriority = 0 Compression = 1 +# +# LegacyConnectionModeEnabled +# Description: Enables/Disables the legacy connection handling in which only one connection socket +# is being used to send and receive packets. This allows older pre-patched clients to connect. +# Default: 0 - (Disabled, Both sockets are used and required) +# 1 - (Enabled, One the first socket is being used) + +LegacyConnectionModeEnabled = 0 + # # PlayerLimit # Description: Maximum number of players in the world. Excluding Mods, GMs and Admins.