Files
DarkflameServer/dGame/ObjectLoadState.h
Aaron Kimbrell 260e6cb1b1 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>
2026-10-02 08:11:58 -05:00

41 lines
1.7 KiB
C++

#ifndef OBJECTLOADSTATE_H
#define OBJECTLOADSTATE_H
#include <cstdint>
#include <initializer_list>
#include "dCommonVars.h"
#include "eReplicaComponentType.h"
class Entity;
/**
* The client's ObjectLoadState (ObjectLoader2): the object's components as its registry gives them, after the
* pre-load rules and the component whitelist, and what the component walk has found so far. Each component type's
* Allocator reads it.
*/
struct ObjectLoadState {
LOT lot{};
// The config's componentWhitelist (ApplyComponentWhitelist): only these registry components, when set
const std::initializer_list<eReplicaComponentType>* whitelist = nullptr;
bool hasModelBehaviors = false;
bool markedAsPhantom = false;
// ApplyMovementAiIfNeeded: movement AI for a scripted object or one with an attached path
bool addsMovementAI = false;
// A model with behaviors' physics id, which the physics cases leave to the model case
int32_t modelPhysicsComponentID = -1;
// The registry's id for type, defaultValue when it has none or the whitelist drops it
int32_t GetComponentID(eReplicaComponentType type, int32_t defaultValue = 0) const;
// LWOScriptComponent::Allocator (0x0104d710) and LWOBaseCombatAiComponent::Allocator (0x0104c7b0): a proximity
// monitor when there is none, and pathfinding control when the object has movement physics (controllable,
// projectile, vehicle or havok vehicle) and none yet
static void AddProximityAndPathfinding(Entity& entity);
};
// An allocator for a component type: makes the object's component(s) of that type (the client's LWOxComponent::Allocator)
using ComponentAllocator = void (*)(Entity& entity, ObjectLoadState& state);
#endif //!OBJECTLOADSTATE_H