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 <noreply@anthropic.com>
This commit is contained in:
Aaron Kimbrell
2026-10-01 08:15:58 -05:00
parent 14a11ac6ce
commit 2b8b682a0b
4 changed files with 27 additions and 9 deletions

View File

@@ -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<int32_t>(u"activityID");
m_ActivityID = m_Parent->GetVar<int32_t>(u"activityID");
LoadActivityData(m_ActivityID);
}
}

View File

@@ -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;

View File

@@ -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<CDActivitiesTable>();
std::vector<CDActivities> activities = activitiesTable->Query([=](CDActivities entry) {return (entry.instanceMapID == worldID); });
for (CDActivities activity : activities) m_ActivityID = activity.ActivityID;
RegisterMsg(&RacingControlComponent::MsgConfigureRacingControl);
}
RacingControlComponent::~RacingControlComponent() {}

View File

@@ -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;