From 06eeedbb68f881c02035d9f362d6edd8a99b6bde Mon Sep 17 00:00:00 2001 From: VDm Date: Sat, 12 Apr 2025 16:58:49 +0400 Subject: [PATCH] feat(net): implement ClientServices::GetRealmList (second request of Realm List) --- src/client/ClientServices.cpp | 17 +++++++++++++++-- src/net/grunt/ClientResponse.hpp | 1 + src/net/login/GruntLogin.cpp | 4 ++++ src/net/login/GruntLogin.hpp | 1 + src/net/login/Login.cpp | 4 ++++ src/net/login/Login.hpp | 1 + src/ui/ScriptFunctionsRealmList.cpp | 3 ++- 7 files changed, 28 insertions(+), 3 deletions(-) diff --git a/src/client/ClientServices.cpp b/src/client/ClientServices.cpp index ed76def..7686ab6 100644 --- a/src/client/ClientServices.cpp +++ b/src/client/ClientServices.cpp @@ -190,7 +190,13 @@ void ClientServices::SetMessageHandler(NETMESSAGE msgId, MESSAGE_HANDLER handler } void ClientServices::GetRealmList() { - // TODO + STORM_ASSERT(ClientServices::s_currentConnection); + ClientServices::s_currentConnection->Initiate(COP_GET_REALMS, 35, nullptr); + if (ClientServices::s_loginObj->IsLoggedOn()) { + ClientServices::s_loginObj->GetRealmList(); + } else { + ClientServices::s_loginObj->Reconnect(); + } } void ClientServices::GetCharacterList() { @@ -367,6 +373,7 @@ void ClientServices::LoginServerStatus(LOGIN_STATE state, LOGIN_RESULT result, c void ClientServices::RealmEnumCallback(uint32_t a2) { auto connection = ClientServices::Connection(); + STORM_ASSERT(connection); if (a2 == 1) { connection->Complete(0, 23); @@ -378,7 +385,13 @@ void ClientServices::RealmEnumCallback(uint32_t a2) { return; } - // TODO statusCop checks + // TODO: Proper implementation + if (connection->m_statusCop != COP_CONNECT) { + if (connection->m_statusCop == COP_GET_REALMS) { + connection->Complete(1, 36); + } + return; + } if (ClientServices::LoginConnection()->GetLoginServerType() == 1) { // TODO Battlenet logic diff --git a/src/net/grunt/ClientResponse.hpp b/src/net/grunt/ClientResponse.hpp index d5e604a..0d87bb9 100644 --- a/src/net/grunt/ClientResponse.hpp +++ b/src/net/grunt/ClientResponse.hpp @@ -20,6 +20,7 @@ class Grunt::ClientResponse { virtual void RealmListResult(CDataStore* msg) = 0; virtual LOGIN_STATE NextSecurityState(LOGIN_STATE state) = 0; virtual int32_t GetServerId() = 0; + virtual void Reconnect() = 0; virtual void GetRealmList() = 0; virtual void Logon(const char* a2, const char* a3) = 0; virtual void ProveVersion(const uint8_t* versionChecksum) = 0; diff --git a/src/net/login/GruntLogin.cpp b/src/net/login/GruntLogin.cpp index 211a6f8..b0f2956 100644 --- a/src/net/login/GruntLogin.cpp +++ b/src/net/login/GruntLogin.cpp @@ -88,6 +88,10 @@ int32_t GruntLogin::GetServerId() { return 0; } +void GruntLogin::Reconnect() { + // TODO +} + void GruntLogin::GetVersionProof(const uint8_t* versionChallenge) { if (this->IsReconnect()) { // TODO diff --git a/src/net/login/GruntLogin.hpp b/src/net/login/GruntLogin.hpp index d8c33c5..0e59a4b 100644 --- a/src/net/login/GruntLogin.hpp +++ b/src/net/login/GruntLogin.hpp @@ -22,6 +22,7 @@ class GruntLogin : public Login { virtual void LogonResult(Grunt::Result result, const uint8_t* sessionKey, uint32_t sessionKeyLen, uint16_t flags); virtual LOGIN_STATE NextSecurityState(LOGIN_STATE state); virtual int32_t GetServerId(); + virtual void Reconnect(); virtual void GetRealmList(); virtual void Logon(const char* a2, const char* a3); virtual void ProveVersion(const uint8_t* versionChecksum); diff --git a/src/net/login/Login.cpp b/src/net/login/Login.cpp index ed5e38a..1bde9a9 100644 --- a/src/net/login/Login.cpp +++ b/src/net/login/Login.cpp @@ -13,6 +13,10 @@ bool Login::IsReconnect() { return this->m_reconnect; } +bool Login::IsLoggedOn() { + return this->m_loggedOn; +} + bool Login::OnlineIdle() { // TODO diff --git a/src/net/login/Login.hpp b/src/net/login/Login.hpp index f5f9228..e105ace 100644 --- a/src/net/login/Login.hpp +++ b/src/net/login/Login.hpp @@ -22,6 +22,7 @@ class Login : public Grunt::ClientResponse { virtual bool OnlineIdle(); virtual void RealmListResult(CDataStore* msg); virtual bool IsReconnect(); + virtual bool IsLoggedOn(); // Member functions void SetLogonCreds(const char* accountName, const char* password); diff --git a/src/ui/ScriptFunctionsRealmList.cpp b/src/ui/ScriptFunctionsRealmList.cpp index 202de5d..7e283e6 100644 --- a/src/ui/ScriptFunctionsRealmList.cpp +++ b/src/ui/ScriptFunctionsRealmList.cpp @@ -11,7 +11,8 @@ #include int32_t Script_RequestRealmList(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + CGlueMgr::GetRealmList(StringToBOOL(L, 1, 0)); + return 0; } int32_t Script_RealmListUpdateRate(lua_State* L) {