From 2b8b682a0bfb698f1c141bd3a27accb7a50018a0 Mon Sep 17 00:00:00 2001 From: Aaron Kimbrell Date: Thu, 1 Oct 2026 08:15:58 -0500 Subject: [PATCH] refactor(component): activities load their activity in the client's phases The component ID's activity in LoadDataFromTemplate, the level's activityID in LoadConfigData; racing control picks its world's activity after both, as before. Co-Authored-By: Claude Opus 5.5 --- dGame/dComponents/ActivityComponent.cpp | 22 +++++++++++++------- dGame/dComponents/ActivityComponent.h | 3 +++ dGame/dComponents/RacingControlComponent.cpp | 9 +++++++- dGame/dComponents/RacingControlComponent.h | 2 ++ 4 files changed, 27 insertions(+), 9 deletions(-) diff --git a/dGame/dComponents/ActivityComponent.cpp b/dGame/dComponents/ActivityComponent.cpp index 5d3032186..8279d201a 100644 --- a/dGame/dComponents/ActivityComponent.cpp +++ b/dGame/dComponents/ActivityComponent.cpp @@ -38,16 +38,22 @@ namespace { ActivityComponent::ActivityComponent(Entity* parent, int32_t componentID) : Component(parent, componentID) { RegisterMsg(&ActivityComponent::OnGetObjectReportInfo); - /* - * This is precisely what the client does functionally - * Use the component id as the default activity id and load its data from the database - * if activityID is specified and if that column exists in the activities table, update the activity info with that data. - */ +} - m_ActivityID = componentID; - LoadActivityData(componentID); +/* +* This is precisely what the client does functionally +* Use the component id as the default activity id and load its data from the database +* if activityID is specified and if that column exists in the activities table, update the activity info with that data. +*/ +void ActivityComponent::LoadDataFromTemplate() { + m_ActivityID = m_ComponentID; + LoadActivityData(m_ComponentID); +} + +// The level config's activityID, when there, replaces it +void ActivityComponent::LoadConfigData() { if (m_Parent->HasVar(u"activityID")) { - m_ActivityID = parent->GetVar(u"activityID"); + m_ActivityID = m_Parent->GetVar(u"activityID"); LoadActivityData(m_ActivityID); } } diff --git a/dGame/dComponents/ActivityComponent.h b/dGame/dComponents/ActivityComponent.h index 55bd7d698..324ff2382 100644 --- a/dGame/dComponents/ActivityComponent.h +++ b/dGame/dComponents/ActivityComponent.h @@ -128,6 +128,9 @@ class ActivityComponent : public Component { public: ActivityComponent(Entity* parent, int32_t activityID); + void LoadDataFromTemplate() override; + void LoadConfigData() override; + void LoadActivityData(const int32_t activityId); void Serialize(RakNet::BitStream& outBitStream, bool bIsInitialUpdate) override; diff --git a/dGame/dComponents/RacingControlComponent.cpp b/dGame/dComponents/RacingControlComponent.cpp index 56fae884f..700347b20 100644 --- a/dGame/dComponents/RacingControlComponent.cpp +++ b/dGame/dComponents/RacingControlComponent.cpp @@ -58,11 +58,18 @@ RacingControlComponent::RacingControlComponent(Entity* parent, const int32_t com const auto worldID = Game::server->GetZoneID(); if (Game::zoneManager->CheckIfAccessibleZone((worldID / 10) * 10)) m_MainWorld = (worldID / 10) * 10; + RegisterMsg(&RacingControlComponent::MsgConfigureRacingControl); +} + +// After the activity's own loading: the race's activity is the one of this world (42 when none) +void RacingControlComponent::LoadConfigData() { + ActivityComponent::LoadConfigData(); + + const auto worldID = Game::server->GetZoneID(); m_ActivityID = 42; CDActivitiesTable* activitiesTable = CDClientManager::GetTable(); std::vector activities = activitiesTable->Query([=](CDActivities entry) {return (entry.instanceMapID == worldID); }); for (CDActivities activity : activities) m_ActivityID = activity.ActivityID; - RegisterMsg(&RacingControlComponent::MsgConfigureRacingControl); } RacingControlComponent::~RacingControlComponent() {} diff --git a/dGame/dComponents/RacingControlComponent.h b/dGame/dComponents/RacingControlComponent.h index 149116bdb..c7a5a34c4 100644 --- a/dGame/dComponents/RacingControlComponent.h +++ b/dGame/dComponents/RacingControlComponent.h @@ -126,6 +126,8 @@ public: static constexpr eReplicaComponentType ComponentType = eReplicaComponentType::RACING_CONTROL; RacingControlComponent(Entity* parentEntity, const int32_t componentID); + + void LoadConfigData() override; ~RacingControlComponent(); void Serialize(RakNet::BitStream& outBitStream, bool bIsInitialUpdate) override;