From 140bcde4934e018ef8b905404bfa80e4310441b4 Mon Sep 17 00:00:00 2001 From: VDm Date: Sun, 30 Mar 2025 00:02:58 +0400 Subject: [PATCH] feat(client): prepare EnterWorld classes and methods --- src/client/CMakeLists.txt | 1 + src/client/Client.cpp | 7 +++ src/client/Client.hpp | 3 ++ src/client/ClientServices.cpp | 4 ++ src/client/ClientServices.hpp | 2 + src/glue/CGlueMgr.cpp | 50 ++++++++++++++++++++-- src/glue/CGlueMgr.hpp | 11 +++-- src/net/connection/ClientConnection.cpp | 9 ++++ src/net/connection/ClientConnection.hpp | 1 + src/net/connection/RealmConnection.cpp | 8 ++++ src/net/connection/RealmConnection.hpp | 1 + src/ui/ScriptFunctionsGlueScriptEvents.cpp | 3 +- 12 files changed, 93 insertions(+), 7 deletions(-) diff --git a/src/client/CMakeLists.txt b/src/client/CMakeLists.txt index b6d1a64..9afeb6f 100644 --- a/src/client/CMakeLists.txt +++ b/src/client/CMakeLists.txt @@ -39,6 +39,7 @@ target_link_libraries(client console db event + gameui gx model net diff --git a/src/client/Client.cpp b/src/client/Client.cpp index b9caffe..467e246 100644 --- a/src/client/Client.cpp +++ b/src/client/Client.cpp @@ -9,6 +9,7 @@ #include "console/Command.hpp" #include "db/Db.hpp" #include "glue/CGlueMgr.hpp" +#include "gameui/CGGameUI.hpp" #include "gx/Screen.hpp" #include "gx/Texture.hpp" #include "model/Model2.hpp" @@ -662,3 +663,9 @@ void WowClientInit() { EventRegister(EVENT_ID_POLL, &PollNet); } + +void ClientInitializeGame(int32_t continentID, const C3Vector& position) { + // TODO + CGGameUI::InitializeGame(); + // TODO +} diff --git a/src/client/Client.hpp b/src/client/Client.hpp index 1c580ff..0569966 100644 --- a/src/client/Client.hpp +++ b/src/client/Client.hpp @@ -2,6 +2,7 @@ #define CLIENT_CLIENT_HPP #include "event/Event.hpp" +#include "tempest/Vector.hpp" #include class CVar; @@ -27,4 +28,6 @@ void StormInitialize(); void WowClientInit(); +void ClientInitializeGame(int32_t continentID, const C3Vector& position); + #endif diff --git a/src/client/ClientServices.cpp b/src/client/ClientServices.cpp index 7ce248e..76a5502 100644 --- a/src/client/ClientServices.cpp +++ b/src/client/ClientServices.cpp @@ -74,6 +74,10 @@ void ClientServices::GetCharacterList() { ClientServices::s_currentConnection->GetCharacterList(); } +void ClientServices::CharacterLogin(uint64_t id, const C3Vector& position) { + // TODO +} + REALM_INFO* ClientServices::GetRealmInfoByIndex(int32_t index) { if (index >= ClientServices::GetInstance()->m_realmList.Count()) { return nullptr; diff --git a/src/client/ClientServices.hpp b/src/client/ClientServices.hpp index f664f92..e767685 100644 --- a/src/client/ClientServices.hpp +++ b/src/client/ClientServices.hpp @@ -2,6 +2,7 @@ #define CLIENT_CLIENT_SERVICES_HPP #include "net/login/LoginResponse.hpp" +#include class ClientConnection; class CVar; @@ -35,6 +36,7 @@ class ClientServices : public LoginResponse { static ClientServices* GetInstance(); static void GetRealmList(); static void GetCharacterList(); + static void CharacterLogin(uint64_t id, const C3Vector& position); static REALM_INFO* GetRealmInfoByIndex(int32_t index); static const char* GetSelectedRealmName(); static const REALM_INFO* GetSelectedRealm(); diff --git a/src/glue/CGlueMgr.cpp b/src/glue/CGlueMgr.cpp index e8a43fd..0d8453e 100644 --- a/src/glue/CGlueMgr.cpp +++ b/src/glue/CGlueMgr.cpp @@ -77,6 +77,8 @@ int32_t CGlueMgr::m_surveyDownload; int32_t CGlueMgr::m_patchDownload; bool CGlueMgr::m_deleteLocalPatch; +CHARACTER_INFO* CGlueMgr::m_characterInfo = nullptr; + float CalculateAspectRatio() { auto widescreenVar = CVar::Lookup("widescreen"); @@ -300,6 +302,11 @@ int32_t CGlueMgr::Idle(const void* a1, void* a2) { break; } + case IDLE_ENTER_WORLD: { + CGlueMgr::PollEnterWorld(); + break; + } + case IDLE_12: { if (CGlueMgr::m_patchDownload) { CGlueMgr::PatchDownloadIdle(); @@ -411,6 +418,20 @@ void CGlueMgr::QuitGame() { ClientPostClose(0); } +void CGlueMgr::EnterWorld() { + // TODO: Proper implementation + if (CCharacterSelection::GetNumCharacters() < 1) { + return; + } + CGlueMgr::m_characterInfo = &CCharacterSelection::s_characterList[0].m_characterInfo; + if (!m_characterInfo || !ClientServices::Connection()->IsConnected()) { + return; + } + + CGlueMgr::m_idleState = IDLE_ENTER_WORLD; + CGlueMgr::m_showedDisconnect = 0; +} + void CGlueMgr::PollAccountLogin(int32_t errorCode, const char* msg, int32_t complete, int32_t result, WOWCS_OPS op) { auto login = ClientServices::LoginConnection(); @@ -820,9 +841,9 @@ void CGlueMgr::StatusDialogClick() { } case IDLE_REALM_LIST: - case IDLE_5: - case IDLE_6: - case IDLE_10: { + case IDLE_CREATE_CHARACTER: + case IDLE_DELETE_CHARACTER: + case IDLE_ENTER_WORLD: { ClientServices::Connection()->Cancel(2); CGlueMgr::m_showedDisconnect = 0; @@ -899,6 +920,29 @@ bool CGlueMgr::HandleBattlenetDisconnect() { return false; } +void CGlueMgr::PollEnterWorld() { + //if (!LoadingScreenDrawing()) + // return; + + if (CGlueMgr::m_suspended) { + CGlueMgr::m_idleState = IDLE_NONE; + CGlueMgr::m_showedDisconnect = 0; + //SI3::StopGlueMusic(3.0); + //SI3::StopGlueAmbience(-1.0); + ClientServices::CharacterLogin(CGlueMgr::m_characterInfo->guid, C3Vector()); + return; + } + + auto info = CGlueMgr::m_characterInfo; + + //if (*(_BYTE*)(info + 385)) + // sub_4D9660(*(_BYTE*)(info + 377), (int)v51, *(_BYTE*)(info + 376), (int)&v68); + + + CGlueMgr::Suspend(); + ClientInitializeGame(info->mapID, info->position); +} + void CGlueMgr::SurveyDownloadStart() { } diff --git a/src/glue/CGlueMgr.hpp b/src/glue/CGlueMgr.hpp index 7732aba..5623dad 100644 --- a/src/glue/CGlueMgr.hpp +++ b/src/glue/CGlueMgr.hpp @@ -21,12 +21,12 @@ class CGlueMgr { IDLE_ACCOUNT_LOGIN = 2, IDLE_CHARACTER_LIST = 3, IDLE_REALM_LIST = 4, - IDLE_5 = 5, - IDLE_6 = 6, + IDLE_CREATE_CHARACTER = 5, + IDLE_DELETE_CHARACTER = 6, IDLE_7 = 7, IDLE_8 = 8, IDLE_9 = 9, - IDLE_10 = 10, + IDLE_ENTER_WORLD = 10, IDLE_WORLD_LOGIN = 11, IDLE_12 = 12, IDLE_13 = 13 @@ -69,6 +69,8 @@ class CGlueMgr { static int32_t m_patchDownload; static bool m_deleteLocalPatch; + static CHARACTER_INFO* m_characterInfo; + // Static functions static void ChangeRealm(const REALM_INFO* realmInfo); static void DisplayLoginStatus(); @@ -81,6 +83,7 @@ class CGlueMgr { static void InitCursor(); static void LoginServerLogin(const char* accountName, const char* password); static void QuitGame(); + static void EnterWorld(); static void PollAccountLogin(int32_t errorCode, const char* msg, int32_t complete, int32_t result, WOWCS_OPS op); static void PollLoginServerLogin(); static void PollCharacterList(int32_t errorCode, const char* msg, int32_t complete, int32_t result, WOWCS_OPS op); @@ -95,6 +98,8 @@ class CGlueMgr { static void UpdateCurrentScreen(const char* screen); static bool HandleBattlenetDisconnect(); + static void PollEnterWorld(); + // Survey Download System static void SurveyDownloadStart(); static void SurveyDownloadCancel(); diff --git a/src/net/connection/ClientConnection.cpp b/src/net/connection/ClientConnection.cpp index 64ca443..9138d20 100644 --- a/src/net/connection/ClientConnection.cpp +++ b/src/net/connection/ClientConnection.cpp @@ -141,6 +141,15 @@ void ClientConnection::GetCharacterList() { } } +void ClientConnection::CharacterLogin(uint64_t id) { + this->Initiate(COP_LOGIN_CHARACTER, 76, nullptr); + if (this->m_connected) { + this->RequestCharacterLogin(id); + } else { + this->Cancel(4); + } +} + void ClientConnection::Cancel(int32_t errorCode) { this->Complete(0, errorCode); } diff --git a/src/net/connection/ClientConnection.hpp b/src/net/connection/ClientConnection.hpp index 9e7e866..a579464 100644 --- a/src/net/connection/ClientConnection.hpp +++ b/src/net/connection/ClientConnection.hpp @@ -28,6 +28,7 @@ class ClientConnection : public RealmConnection { void AccountLogin_Finish(int32_t authResult); void AccountLogin_Queued(); void GetCharacterList(); + void CharacterLogin(uint64_t id); void Cancel(int32_t errorCode); void Cleanup(); void Connect(); diff --git a/src/net/connection/RealmConnection.cpp b/src/net/connection/RealmConnection.cpp index 19b9b12..1a24ca4 100644 --- a/src/net/connection/RealmConnection.cpp +++ b/src/net/connection/RealmConnection.cpp @@ -281,3 +281,11 @@ void RealmConnection::RequestCharacterEnum() { msg.Finalize(); this->Send(&msg); } + +void RealmConnection::RequestCharacterLogin(uint64_t id) { + CDataStore msg; + msg.Put(static_cast(CMSG_PLAYER_LOGIN)); + msg.Put(id); + msg.Finalize(); + this->Send(&msg); +} diff --git a/src/net/connection/RealmConnection.hpp b/src/net/connection/RealmConnection.hpp index 28a8531..211060e 100644 --- a/src/net/connection/RealmConnection.hpp +++ b/src/net/connection/RealmConnection.hpp @@ -43,6 +43,7 @@ class RealmConnection : public NetClient { int32_t HandleCharEnum(uint32_t msgId, uint32_t time, CDataStore* msg); void SetSelectedRealm(uint32_t a2, uint32_t a3, uint32_t a4); void RequestCharacterEnum(); + void RequestCharacterLogin(uint64_t id); }; #endif diff --git a/src/ui/ScriptFunctionsGlueScriptEvents.cpp b/src/ui/ScriptFunctionsGlueScriptEvents.cpp index 8b7fcf7..85ebadb 100644 --- a/src/ui/ScriptFunctionsGlueScriptEvents.cpp +++ b/src/ui/ScriptFunctionsGlueScriptEvents.cpp @@ -294,7 +294,8 @@ int32_t Script_IsConnectedToServer(lua_State* L) { } int32_t Script_EnterWorld(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + CGlueMgr::EnterWorld(); + return 0; } int32_t Script_Screenshot(lua_State* L) {