refactor(entity): each component type has an allocator, as the client

DoObjectComponentLoad walks the client's load order and calls the type's
allocator from a table, like ObjectLoader2, instead of one 76-case switch.
Components with rules of their own have a static Allocator (the client's
LWOxComponent::Allocator); the rest share a registry allocator. The load
state moves to ObjectLoadState.h so the allocators can take it.

Construction bytes are identical for all 15,962 LOTs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Aaron Kimbrell
2026-10-02 08:11:58 -05:00
parent 3a79286666
commit 260e6cb1b1
52 changed files with 634 additions and 684 deletions

View File

@@ -26,6 +26,8 @@
#include "CDSkillBehaviorTable.h"
#include "ServiceType.h"
#include "MessageType/Client.h"
#include "Entity.h"
#include "ObjectLoadState.h"
ProjectileSyncEntry::ProjectileSyncEntry() {
}
@@ -565,3 +567,10 @@ void SkillComponent::Serialize(RakNet::BitStream& outBitStream, bool bIsInitialU
uint32_t SkillComponent::GetUniqueSkillId() {
return ++this->m_skillUid;
}
void SkillComponent::Allocator(Entity& entity, ObjectLoadState& state) {
const auto skillID = state.GetComponentID(eReplicaComponentType::SKILL, -1);
if (skillID > -1 || entity.GetCharacter()) {
entity.AddComponent<SkillComponent>(skillID);
}
}