From a5e7ca9a2207acf8ba7fb86d991f9fe95c32041a Mon Sep 17 00:00:00 2001 From: fallenoak Date: Sat, 4 Oct 2025 19:52:36 -0500 Subject: [PATCH] feat(ui): implement Script_GetCharacterListUpdate --- src/glue/CCharacterSelection.cpp | 13 +++++++++++++ src/glue/CCharacterSelection.hpp | 2 ++ src/glue/CGlueMgr.cpp | 14 ++++++++++++++ src/glue/CGlueMgr.hpp | 4 ++-- src/net/connection/ClientConnection.cpp | 10 ++++++++++ src/net/connection/ClientConnection.hpp | 1 + src/net/connection/RealmConnection.cpp | 10 ++++++++++ src/net/connection/RealmConnection.hpp | 1 + src/ui/ScriptFunctionsCharSelect.cpp | 4 +++- 9 files changed, 56 insertions(+), 3 deletions(-) diff --git a/src/glue/CCharacterSelection.cpp b/src/glue/CCharacterSelection.cpp index 8eb4e65..115864f 100644 --- a/src/glue/CCharacterSelection.cpp +++ b/src/glue/CCharacterSelection.cpp @@ -1,4 +1,5 @@ #include "glue/CCharacterSelection.hpp" +#include "glue/CGlueMgr.hpp" #include "model/CM2Shared.hpp" #include "ui/CSimpleModelFFX.hpp" @@ -9,6 +10,18 @@ void CCharacterSelection::ClearCharacterList() { // TODO } +void CCharacterSelection::ClearCharacterModel() { + // TODO +} + +void CCharacterSelection::OnGetCharacterList() { + CCharacterSelection::s_characterList.SetCount(0); + + CCharacterSelection::ClearCharacterModel(); + + CGlueMgr::GetCharacterList(); +} + void CCharacterSelection::RenderPrep() { // TODO } diff --git a/src/glue/CCharacterSelection.hpp b/src/glue/CCharacterSelection.hpp index 595ba82..a40fe9f 100644 --- a/src/glue/CCharacterSelection.hpp +++ b/src/glue/CCharacterSelection.hpp @@ -17,6 +17,8 @@ class CCharacterSelection { // Static functions static void ClearCharacterList(); + static void ClearCharacterModel(); + static void OnGetCharacterList(); static void RenderPrep(); static void SetBackgroundModel(const char* modelPath); }; diff --git a/src/glue/CGlueMgr.cpp b/src/glue/CGlueMgr.cpp index f515eb8..01f6e0b 100644 --- a/src/glue/CGlueMgr.cpp +++ b/src/glue/CGlueMgr.cpp @@ -171,6 +171,20 @@ void CGlueMgr::DisplayLoginStatus() { } } +void CGlueMgr::GetCharacterList() { + if (CGlueMgr::m_idleState == IDLE_WORLD_LOGIN) { + return; + } + + CGlueMgr::m_idleState = IDLE_CHARACTER_LIST; + CGlueMgr::m_showedDisconnect = 0; + + auto retrieveingText = FrameScript_GetText("CHAR_LIST_RETRIEVING", -1, GENDER_NOT_APPLICABLE); + FrameScript_SignalEvent(3, "%s%s", "CANCEL", retrieveingText); + + ClientServices::Connection()->GetCharacterList(); +} + int32_t CGlueMgr::HandleDisplaySizeChanged(const CSizeEvent& event) { if ( CGlueMgr::m_screenWidth > 0 diff --git a/src/glue/CGlueMgr.hpp b/src/glue/CGlueMgr.hpp index f0446d2..c7d5cbe 100644 --- a/src/glue/CGlueMgr.hpp +++ b/src/glue/CGlueMgr.hpp @@ -58,9 +58,9 @@ class CGlueMgr { // Static functions static void ChangeRealm(const REALM_INFO* realmInfo); static void DisplayLoginStatus(); - // TODO a1: const EVENT_DATA_IDLE* + static void GetCharacterList(); static int32_t HandleDisplaySizeChanged(const CSizeEvent& event); - static int32_t Idle(const void* a1, void* a2); + static int32_t Idle(const void* a1, void* a2); // TODO a1: const EVENT_DATA_IDLE* static void Initialize(); static void LoginServerLogin(const char* accountName, const char* password); static int32_t OnKickReasonMsg(void* param, NETMESSAGE msgId, uint32_t time, CDataStore* msg); diff --git a/src/net/connection/ClientConnection.cpp b/src/net/connection/ClientConnection.cpp index d1207ed..4fdbf91 100644 --- a/src/net/connection/ClientConnection.cpp +++ b/src/net/connection/ClientConnection.cpp @@ -173,6 +173,16 @@ int32_t ClientConnection::Disconnect() { return 0; } +void ClientConnection::GetCharacterList() { + this->Initiate(COP_GET_CHARACTERS, 43, nullptr); + + if (this->m_connected) { + this->RequestCharacterEnum(); + } else { + this->Cancel(4); + } +} + int32_t ClientConnection::HandleConnect() { this->Complete(1, 5); diff --git a/src/net/connection/ClientConnection.hpp b/src/net/connection/ClientConnection.hpp index f40c7b0..ec28c3e 100644 --- a/src/net/connection/ClientConnection.hpp +++ b/src/net/connection/ClientConnection.hpp @@ -32,6 +32,7 @@ class ClientConnection : public RealmConnection { void Complete(int32_t result, int32_t errorCode); void Connect(); int32_t Disconnect(); + void GetCharacterList(); void Initiate(WOWCS_OPS op, int32_t errorCode, void (*cleanup)()); int32_t IsConnected(); int32_t PollStatus(WOWCS_OPS& op, const char** msg, int32_t& result, int32_t& errorCode); diff --git a/src/net/connection/RealmConnection.cpp b/src/net/connection/RealmConnection.cpp index 500985e..a6c9158 100644 --- a/src/net/connection/RealmConnection.cpp +++ b/src/net/connection/RealmConnection.cpp @@ -278,6 +278,16 @@ int32_t RealmConnection::HandleCharEnum(uint32_t msgId, uint32_t time, CDataStor return 1; } +void RealmConnection::RequestCharacterEnum() { + CDataStore msg; + + msg.Put(static_cast(CMSG_ENUM_CHARACTERS)); + + msg.Finalize(); + + this->Send(&msg); +} + void RealmConnection::SetSelectedRealm(uint32_t a2, uint32_t a3, uint32_t a4) { // TODO } diff --git a/src/net/connection/RealmConnection.hpp b/src/net/connection/RealmConnection.hpp index 6159098..b7eb8a5 100644 --- a/src/net/connection/RealmConnection.hpp +++ b/src/net/connection/RealmConnection.hpp @@ -41,6 +41,7 @@ class RealmConnection : public NetClient { RealmConnection(RealmResponse* realmResponse); int32_t HandleAuthResponse(uint32_t msgId, uint32_t time, CDataStore* msg); int32_t HandleCharEnum(uint32_t msgId, uint32_t time, CDataStore* msg); + void RequestCharacterEnum(); void SetSelectedRealm(uint32_t a2, uint32_t a3, uint32_t a4); }; diff --git a/src/ui/ScriptFunctionsCharSelect.cpp b/src/ui/ScriptFunctionsCharSelect.cpp index 365aa78..579229b 100644 --- a/src/ui/ScriptFunctionsCharSelect.cpp +++ b/src/ui/ScriptFunctionsCharSelect.cpp @@ -35,7 +35,9 @@ int32_t Script_SetCharSelectBackground(lua_State* L) { } int32_t Script_GetCharacterListUpdate(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + CCharacterSelection::OnGetCharacterList(); + + return 0; } int32_t Script_GetNumCharacters(lua_State* L) {