diff --git a/dGame/dComponents/ControllablePhysicsComponent.cpp b/dGame/dComponents/ControllablePhysicsComponent.cpp index 655a9d72d..11fd10f99 100644 --- a/dGame/dComponents/ControllablePhysicsComponent.cpp +++ b/dGame/dComponents/ControllablePhysicsComponent.cpp @@ -49,11 +49,16 @@ ControllablePhysicsComponent::ControllablePhysicsComponent(Entity* entity, const m_ImmuneToStunMoveCount = 0; m_ImmuneToStunTurnCount = 0; m_ImmuneToStunUseItemCount = 0; +} - if (entity->GetLOT() != 1) // Other physics entities we care about will be added by BaseCombatAI +// After the physics config: a character's body, in the physics component's group +void ControllablePhysicsComponent::LoadConfigData() { + PhysicsComponent::LoadConfigData(); + + if (m_Parent->GetLOT() != 1) // Other physics entities we care about will be added by BaseCombatAI return; - if (entity->GetLOT() == 1) { + if (m_Parent->GetLOT() == 1) { LOG("Using patch to load minifig physics"); float radius = 1.5f; diff --git a/dGame/dComponents/ControllablePhysicsComponent.h b/dGame/dComponents/ControllablePhysicsComponent.h index 843ac4640..ada804b59 100644 --- a/dGame/dComponents/ControllablePhysicsComponent.h +++ b/dGame/dComponents/ControllablePhysicsComponent.h @@ -26,6 +26,8 @@ public: static constexpr eReplicaComponentType ComponentType = eReplicaComponentType::CONTROLLABLE_PHYSICS; ControllablePhysicsComponent(Entity* entity, const int32_t componentID); + + void LoadConfigData() override; ~ControllablePhysicsComponent() override; void Run(float deltaTime) override; diff --git a/dGame/dComponents/PhantomPhysicsComponent.cpp b/dGame/dComponents/PhantomPhysicsComponent.cpp index 9c15fb751..f6e52a4ec 100644 --- a/dGame/dComponents/PhantomPhysicsComponent.cpp +++ b/dGame/dComponents/PhantomPhysicsComponent.cpp @@ -49,6 +49,11 @@ PhantomPhysicsComponent::PhantomPhysicsComponent(Entity* parent, const int32_t c m_IsDirectional = false; m_Direction = NiPoint3(); // * m_DirectionalMultiplier +} + +// After the physics config: the volume's blocker, respawn settings and its physics +void PhantomPhysicsComponent::LoadConfigData() { + PhysicsComponent::LoadConfigData(); // A phantom volume enemies can't walk into when it carves the navmesh (e.g. the Sentinel camp walls) RegisterMovementBlocker(ComponentType, false, m_Scale); diff --git a/dGame/dComponents/PhantomPhysicsComponent.h b/dGame/dComponents/PhantomPhysicsComponent.h index 5d1a24caf..9d6eed0ab 100644 --- a/dGame/dComponents/PhantomPhysicsComponent.h +++ b/dGame/dComponents/PhantomPhysicsComponent.h @@ -28,6 +28,8 @@ public: static constexpr eReplicaComponentType ComponentType = eReplicaComponentType::PHANTOM_PHYSICS; PhantomPhysicsComponent(Entity* parent, const int32_t componentID); + + void LoadConfigData() override; ~PhantomPhysicsComponent() override; void Run(float deltaTime) override; void Serialize(RakNet::BitStream& outBitStream, bool bIsInitialUpdate) override; diff --git a/dGame/dComponents/PhysicsComponent.cpp b/dGame/dComponents/PhysicsComponent.cpp index 0e4aa5fec..a44b93620 100644 --- a/dGame/dComponents/PhysicsComponent.cpp +++ b/dGame/dComponents/PhysicsComponent.cpp @@ -52,18 +52,24 @@ PhysicsComponent::PhysicsComponent(Entity* parent, const int32_t componentID) : m_Rotation = QuatUtils::IDENTITY; m_DirtyPosition = false; + RegisterMsg(&PhysicsComponent::OnGetPosition); +} + +// The PhysicsComponent row's collision group +void PhysicsComponent::LoadDataFromTemplate() { CDPhysicsComponentTable* physicsComponentTable = CDClientManager::GetTable(); if (physicsComponentTable) { - auto* info = physicsComponentTable->GetByID(componentID); + auto* info = physicsComponentTable->GetByID(m_ComponentID); if (info) { m_CollisionGroup = info->collisionGroup; } } +} +// The level config's CollisionGroupID, when there, replaces it +void PhysicsComponent::LoadConfigData() { if (m_Parent->HasVar(u"CollisionGroupID")) m_CollisionGroup = m_Parent->GetVar(u"CollisionGroupID"); - - RegisterMsg(&PhysicsComponent::OnGetPosition); } PhysicsComponent::~PhysicsComponent() { diff --git a/dGame/dComponents/PhysicsComponent.h b/dGame/dComponents/PhysicsComponent.h index ca6c30185..da10e3146 100644 --- a/dGame/dComponents/PhysicsComponent.h +++ b/dGame/dComponents/PhysicsComponent.h @@ -24,6 +24,9 @@ class dpEntity; class PhysicsComponent : public Component { public: PhysicsComponent(Entity* parent, const int32_t componentID); + + void LoadDataFromTemplate() override; + void LoadConfigData() override; virtual ~PhysicsComponent(); void Serialize(RakNet::BitStream& outBitStream, bool bIsInitialUpdate) override; diff --git a/dGame/dComponents/RigidbodyPhantomPhysicsComponent.cpp b/dGame/dComponents/RigidbodyPhantomPhysicsComponent.cpp index 3c84eea69..62fae83e3 100644 --- a/dGame/dComponents/RigidbodyPhantomPhysicsComponent.cpp +++ b/dGame/dComponents/RigidbodyPhantomPhysicsComponent.cpp @@ -19,6 +19,11 @@ RigidbodyPhantomPhysicsComponent::RigidbodyPhantomPhysicsComponent(Entity* paren m_Position = m_Parent->GetDefaultPosition(); m_Rotation = m_Parent->GetDefaultRotation(); m_Scale = m_Parent->GetDefaultScale(); +} + +// After the physics config: its physics +void RigidbodyPhantomPhysicsComponent::LoadConfigData() { + PhysicsComponent::LoadConfigData(); if (m_Parent->GetVar(u"create_physics")) { m_dpEntity = CreatePhysicsLnv(m_Scale, ComponentType); diff --git a/dGame/dComponents/RigidbodyPhantomPhysicsComponent.h b/dGame/dComponents/RigidbodyPhantomPhysicsComponent.h index 7d0077500..532547f3c 100644 --- a/dGame/dComponents/RigidbodyPhantomPhysicsComponent.h +++ b/dGame/dComponents/RigidbodyPhantomPhysicsComponent.h @@ -23,6 +23,8 @@ public: RigidbodyPhantomPhysicsComponent(Entity* parent, const int32_t componentID); + void LoadConfigData() override; + void Run(const float deltaTime) override; void Serialize(RakNet::BitStream& outBitStream, bool bIsInitialUpdate) override; diff --git a/dGame/dComponents/SimplePhysicsComponent.cpp b/dGame/dComponents/SimplePhysicsComponent.cpp index 0a5480c96..4970fafab 100644 --- a/dGame/dComponents/SimplePhysicsComponent.cpp +++ b/dGame/dComponents/SimplePhysicsComponent.cpp @@ -20,6 +20,11 @@ SimplePhysicsComponent::SimplePhysicsComponent(Entity* parent, const int32_t com m_Position = m_Parent->GetDefaultPosition(); m_Rotation = m_Parent->GetDefaultRotation(); +} + +// After the physics config: climbable type, motion type and the blocker +void SimplePhysicsComponent::LoadConfigData() { + PhysicsComponent::LoadConfigData(); const auto& climbable_type = m_Parent->GetVar(u"climbable"); if (climbable_type == u"wall") { diff --git a/dGame/dComponents/SimplePhysicsComponent.h b/dGame/dComponents/SimplePhysicsComponent.h index 33e3dfccc..e3f1d8fa0 100644 --- a/dGame/dComponents/SimplePhysicsComponent.h +++ b/dGame/dComponents/SimplePhysicsComponent.h @@ -36,6 +36,8 @@ public: static constexpr uint32_t MOTION_TYPE_FIXED = 5; SimplePhysicsComponent(Entity* parent, const int32_t componentID); + + void LoadConfigData() override; ~SimplePhysicsComponent() override; void Run(const float deltaTime) override;