From e3073868de31ab4142c6cfbb0c3a19a29f855e33 Mon Sep 17 00:00:00 2001 From: fallenoak Date: Wed, 29 Oct 2025 23:41:10 -0500 Subject: [PATCH] chore(glue): move component creation into CharacterSelectionDisplay --- src/glue/CCharacterSelection.cpp | 79 +++++++------------------- src/glue/CCharacterSelection.hpp | 10 +--- src/glue/CGlueMgr.cpp | 16 +++--- src/glue/CharacterSelectionDisplay.cpp | 49 ++++++++++++++++ src/glue/CharacterSelectionDisplay.hpp | 21 +++++++ src/ui/ScriptFunctionsCharSelect.cpp | 28 ++++----- 6 files changed, 115 insertions(+), 88 deletions(-) create mode 100644 src/glue/CharacterSelectionDisplay.cpp create mode 100644 src/glue/CharacterSelectionDisplay.hpp diff --git a/src/glue/CCharacterSelection.cpp b/src/glue/CCharacterSelection.cpp index 8924d6e..bc2e47c 100644 --- a/src/glue/CCharacterSelection.cpp +++ b/src/glue/CCharacterSelection.cpp @@ -8,7 +8,6 @@ #include "glue/Types.hpp" #include "model/CM2Shared.hpp" #include "net/Connection.hpp" -#include "object/client/Player_C.hpp" #include "ui/CSimpleModelFFX.hpp" int32_t CCharacterSelection::s_characterCount; @@ -62,7 +61,7 @@ void CCharacterSelection::ClearCharacterModel() { void CCharacterSelection::EnumerateCharactersCallback(const CHARACTER_INFO& info, void* param) { auto display = CCharacterSelection::s_characterList.New(); - display->info = info; + display->m_info = info; // TODO } @@ -97,7 +96,7 @@ void CCharacterSelection::RenderPrep() { return; } - auto component = character->component; + auto component = character->m_component; if (!component) { return; } @@ -141,7 +140,7 @@ void CCharacterSelection::SetFacing(float facing) { return; } - auto component = CCharacterSelection::s_characterList[CCharacterSelection::s_selectionIndex].component; + auto component = CCharacterSelection::s_characterList[CCharacterSelection::s_selectionIndex].m_component; auto model = component->m_data.model; if (!model) { @@ -163,71 +162,37 @@ void CCharacterSelection::ShowCharacter() { auto character = &CCharacterSelection::s_characterList[CCharacterSelection::s_selectionIndex]; - if (character->component) { - auto parent = CCharacterSelection::s_modelFrame->m_model; + // Create character component and pet model - if (!parent) { - return; - } - - auto characterModel = character->component->m_data.model; - auto petModel = character->petModel; - - characterModel->AttachToParent(parent, 0, nullptr, 0); - - CCharacterSelection::SetFacing(0.0f); - - if (petModel) { - petModel->AttachToParent(parent, 1, nullptr, 0); - } - - // TODO a2 may be 1 in some circumstances - CGlueLoading::StartLoad(character->component, 0); + if (!character->m_component) { + character->CreateModelData(); + } + if (!character->m_component) { return; } - auto modelData = Player_C_GetModelName(character->info.raceID, character->info.sexID); - if (!modelData || !modelData->m_modelName) { + // Attach character display to model frame + + auto parent = CCharacterSelection::s_modelFrame->m_model; + + if (!parent) { return; } - character->component = CCharacterComponent::AllocComponent(); + auto characterModel = character->m_component->m_data.model; + auto petModel = character->m_petModel; - ComponentData componentData = {}; - componentData.raceID = character->info.raceID; - componentData.sexID = character->info.sexID; - componentData.skinColorID = character->info.skinColorID; - componentData.faceID = character->info.faceID; - componentData.hairStyleID = character->info.hairStyleID; - componentData.hairColorID = character->info.hairColorID; - componentData.facialHairStyleID = character->info.facialHairStyleID; + characterModel->AttachToParent(parent, 0, nullptr, 0); - auto scene = CCharacterSelection::s_modelFrame->GetScene(); - auto model = scene->CreateModel(modelData->m_modelName, 0); + CCharacterSelection::SetFacing(0.0f); - componentData.flags |= 0x2; - componentData.model = model; + if (petModel) { + petModel->AttachToParent(parent, 1, nullptr, 0); + } - character->component->Init(&componentData, nullptr); - - // TODO lighting callback/arg - - character->component->m_data.model->SetBoneSequence( - 0xFFFFFFFF, - 0, - 0xFFFFFFFF, - 0, - 1.0f, - 1, - 1 - ); - - // TODO load pet model - - CCharacterSelection::s_characterCount++; - - // TODO + // TODO a2 may be 1 in some circumstances + CGlueLoading::StartLoad(character->m_component, 0); } void CCharacterSelection::UpdateCharacterList() { diff --git a/src/glue/CCharacterSelection.hpp b/src/glue/CCharacterSelection.hpp index bf335e7..49e0100 100644 --- a/src/glue/CCharacterSelection.hpp +++ b/src/glue/CCharacterSelection.hpp @@ -1,20 +1,12 @@ #ifndef GLUE_C_CHARACTER_SELECTION_HPP #define GLUE_C_CHARACTER_SELECTION_HPP +#include "glue/CharacterSelectionDisplay.hpp" #include "net/Types.hpp" #include -class CCharacterComponent; -class CM2Model; class CSimpleModelFFX; -struct CharacterSelectionDisplay { - CHARACTER_INFO info; - CCharacterComponent* component = nullptr; - CM2Model* petModel = nullptr; - // TODO -}; - class CCharacterSelection { public: // Static variables diff --git a/src/glue/CGlueMgr.cpp b/src/glue/CGlueMgr.cpp index 0221b92..09305de 100644 --- a/src/glue/CGlueMgr.cpp +++ b/src/glue/CGlueMgr.cpp @@ -148,7 +148,7 @@ void CGlueMgr::EnterWorld() { // Validate character flags - auto flags = CGlueMgr::m_characterInfo->info.flags; + auto flags = CGlueMgr::m_characterInfo->m_info.flags; if (flags & 0x4) { auto errorToken = ClientServices::GetErrorToken(84); @@ -173,7 +173,7 @@ void CGlueMgr::EnterWorld() { } if (!(flags & 0x2000000)) { - if (NameNeedsDeclension(CURRENT_LANGUAGE, CGlueMgr::m_characterInfo->info.name)) { + if (NameNeedsDeclension(CURRENT_LANGUAGE, CGlueMgr::m_characterInfo->m_info.name)) { FrameScript_SignalEvent(24, nullptr); return; @@ -182,8 +182,8 @@ void CGlueMgr::EnterWorld() { // Validate expansion - auto raceRec = g_chrRacesDB.GetRecord(character->info.raceID); - auto classRec = g_chrClassesDB.GetRecord(character->info.classID); + auto raceRec = g_chrRacesDB.GetRecord(character->m_info.raceID); + auto classRec = g_chrClassesDB.GetRecord(character->m_info.classID); if ( !raceRec @@ -203,7 +203,7 @@ void CGlueMgr::EnterWorld() { // TODO g_lastCharacterIndex->Set(indexStr, 1, 0, 0, 1); ClientServices::SetAccountName(CGlueMgr::m_accountName); - ClientServices::SetCharacterInfo(&CGlueMgr::m_characterInfo->info); + ClientServices::SetCharacterInfo(&CGlueMgr::m_characterInfo->m_info); // TODO game tip // TODO loading screen @@ -724,13 +724,13 @@ void CGlueMgr::PollEnterWorld() { // TODO SI Logic // TODO TLS shenanigans with guid - ClientServices::Connection()->CharacterLogin(CGlueMgr::m_characterInfo->info.guid, 0); + ClientServices::Connection()->CharacterLogin(CGlueMgr::m_characterInfo->m_info.guid, 0); return; } - uint32_t mapId = CGlueMgr::m_characterInfo->info.mapID; - C3Vector position = CGlueMgr::m_characterInfo->info.position; + uint32_t mapId = CGlueMgr::m_characterInfo->m_info.mapID; + C3Vector position = CGlueMgr::m_characterInfo->m_info.position; // TODO TLS shenanigans with guid // TODO first login logic (play intro M2?) diff --git a/src/glue/CharacterSelectionDisplay.cpp b/src/glue/CharacterSelectionDisplay.cpp new file mode 100644 index 0000000..3c0ceb9 --- /dev/null +++ b/src/glue/CharacterSelectionDisplay.cpp @@ -0,0 +1,49 @@ +#include "glue/CharacterSelectionDisplay.hpp" +#include "db/Db.hpp" +#include "glue/CCharacterSelection.hpp" +#include "component/CCharacterComponent.hpp" +#include "object/client/Player_C.hpp" +#include "ui/CSimpleModelFFX.hpp" + +void CharacterSelectionDisplay::CreateModelData() { + auto modelData = Player_C_GetModelName(this->m_info.raceID, this->m_info.sexID); + + if (!modelData || !modelData->m_modelName) { + return; + } + + this->m_component = CCharacterComponent::AllocComponent(); + + ComponentData componentData = {}; + componentData.raceID = this->m_info.raceID; + componentData.sexID = this->m_info.sexID; + componentData.skinColorID = this->m_info.skinColorID; + componentData.faceID = this->m_info.faceID; + componentData.hairStyleID = this->m_info.hairStyleID; + componentData.hairColorID = this->m_info.hairColorID; + componentData.facialHairStyleID = this->m_info.facialHairStyleID; + + auto scene = CCharacterSelection::s_modelFrame->GetScene(); + auto model = scene->CreateModel(modelData->m_modelName, 0); + + componentData.flags |= 0x2; + componentData.model = model; + + this->m_component->Init(&componentData, nullptr); + + // TODO lighting callback/arg + + this->m_component->m_data.model->SetBoneSequence( + 0xFFFFFFFF, + 0, + 0xFFFFFFFF, + 0, + 1.0f, + 1, + 1 + ); + + // TODO load pet model + + CCharacterSelection::s_characterCount++; +} diff --git a/src/glue/CharacterSelectionDisplay.hpp b/src/glue/CharacterSelectionDisplay.hpp new file mode 100644 index 0000000..52ae9bc --- /dev/null +++ b/src/glue/CharacterSelectionDisplay.hpp @@ -0,0 +1,21 @@ +#ifndef GLUE_CHARACTER_SELECTION_DISPLAY_HPP +#define GLUE_CHARACTER_SELECTION_DISPLAY_HPP + +#include "net/Types.hpp" + +class CCharacterComponent; +class CM2Model; + +class CharacterSelectionDisplay { + public: + // Member variables + CHARACTER_INFO m_info; + CCharacterComponent* m_component = nullptr; + CM2Model* m_petModel = nullptr; + // TODO + + // Member functions + void CreateModelData(); +}; + +#endif diff --git a/src/ui/ScriptFunctionsCharSelect.cpp b/src/ui/ScriptFunctionsCharSelect.cpp index 72bc793..d1c383c 100644 --- a/src/ui/ScriptFunctionsCharSelect.cpp +++ b/src/ui/ScriptFunctionsCharSelect.cpp @@ -93,26 +93,26 @@ int32_t Script_GetCharacterInfo(lua_State* L) { // Character exists at index auto& display = CCharacterSelection::s_characterList[index]; - auto sex = static_cast(display.info.sexID); + auto sex = static_cast(display.m_info.sexID); // Name - lua_pushstring(L, display.info.name); + lua_pushstring(L, display.m_info.name); // Race - auto raceRec = g_chrRacesDB.GetRecord(display.info.raceID); + auto raceRec = g_chrRacesDB.GetRecord(display.m_info.raceID); auto raceName = CGUnit_C::GetDisplayRaceNameFromRecord(raceRec, sex, nullptr); lua_pushstring(L, raceName ? raceName : ""); // Class - auto classRec = g_chrClassesDB.GetRecord(display.info.classID); + auto classRec = g_chrClassesDB.GetRecord(display.m_info.classID); auto className = CGUnit_C::GetDisplayClassNameFromRecord(classRec, sex, nullptr); lua_pushstring(L, className ? className : ""); // Level - lua_pushnumber(L, display.info.experienceLevel); + lua_pushnumber(L, display.m_info.experienceLevel); // Zone - auto areaRec = g_areaTableDB.GetRecord(display.info.zoneID); + auto areaRec = g_areaTableDB.GetRecord(display.m_info.zoneID); if (areaRec) { lua_pushstring(L, areaRec->m_areaName); } else { @@ -120,19 +120,19 @@ int32_t Script_GetCharacterInfo(lua_State* L) { } // Sex - lua_pushnumber(L, g_glueFrameScriptGenders[display.info.sexID]); + lua_pushnumber(L, g_glueFrameScriptGenders[display.m_info.sexID]); // Ghost - lua_pushboolean(L, display.info.flags & 0x2000); + lua_pushboolean(L, display.m_info.flags & 0x2000); // Paid class change - lua_pushboolean(L, display.info.customizeFlags & 0x1); + lua_pushboolean(L, display.m_info.customizeFlags & 0x1); // Paid race change - lua_pushboolean(L, display.info.customizeFlags & 0x100000); + lua_pushboolean(L, display.m_info.customizeFlags & 0x100000); // Paid faction change - lua_pushboolean(L, display.info.customizeFlags & 0x10000); + lua_pushboolean(L, display.m_info.customizeFlags & 0x10000); return 10; } @@ -224,10 +224,10 @@ int32_t Script_GetSelectBackgroundModel(lua_State* L) { // Class background - auto classID = character->info.classID; + auto classID = character->m_info.classID; if (classID == 6) { - auto classRec = g_chrClassesDB.GetRecord(character->info.classID); + auto classRec = g_chrClassesDB.GetRecord(character->m_info.classID); if (classRec) { lua_pushstring(L, classRec->m_filename); @@ -240,7 +240,7 @@ int32_t Script_GetSelectBackgroundModel(lua_State* L) { // Race background - auto raceID = character->info.raceID; + auto raceID = character->m_info.raceID; if (raceID == 7) { raceID = 3;