From 1f6a8d1ce4386225fd8066ea095be98d2974c476 Mon Sep 17 00:00:00 2001 From: David Markowitz Date: Sun, 10 Nov 2024 13:23:28 -0800 Subject: [PATCH] fix laggy property models (and probably more) global fix correcting the initial physics motion state from 0 to 5 (confirm in client). packet captures from a few worlds (didnt scan more than 5 files) show that the value for simple physics was either 5, or 4 for property models, or 1 for property models with behaviors. properties with pre-built models no longer lag and values of physics types should be correct across the board --- dGame/dComponents/ModelComponent.cpp | 13 +++++++++++++ dGame/dComponents/SimplePhysicsComponent.cpp | 8 ++++---- dGame/dComponents/SimplePhysicsComponent.h | 4 +++- dScripts/ai/MINIGAME/SG_GF/SERVER/SGCannon.cpp | 1 + 4 files changed, 21 insertions(+), 5 deletions(-) diff --git a/dGame/dComponents/ModelComponent.cpp b/dGame/dComponents/ModelComponent.cpp index 916809872..3a273c9b6 100644 --- a/dGame/dComponents/ModelComponent.cpp +++ b/dGame/dComponents/ModelComponent.cpp @@ -7,6 +7,7 @@ #include "BehaviorStates.h" #include "ControlBehaviorMsgs.h" #include "tinyxml2.h" +#include "SimplePhysicsComponent.h" #include "Database.h" @@ -95,12 +96,24 @@ void ModelComponent::AddBehavior(AddMessage& msg) { for (auto& behavior : m_Behaviors) if (behavior.GetBehaviorId() == msg.GetBehaviorId()) return; m_Behaviors.insert(m_Behaviors.begin() + msg.GetBehaviorIndex(), PropertyBehavior()); m_Behaviors.at(msg.GetBehaviorIndex()).HandleMsg(msg); + auto* const simplePhysComponent = m_Parent->GetComponent(); + if (simplePhysComponent) { + simplePhysComponent->SetPhysicsMotionState(1); + Game::entityManager->SerializeEntity(m_Parent); + } } void ModelComponent::MoveToInventory(MoveToInventoryMessage& msg) { if (msg.GetBehaviorIndex() >= m_Behaviors.size() || m_Behaviors.at(msg.GetBehaviorIndex()).GetBehaviorId() != msg.GetBehaviorId()) return; m_Behaviors.erase(m_Behaviors.begin() + msg.GetBehaviorIndex()); // TODO move to the inventory + if (m_Behaviors.empty()) { + auto* const simplePhysComponent = m_Parent->GetComponent(); + if (simplePhysComponent) { + simplePhysComponent->SetPhysicsMotionState(4); + Game::entityManager->SerializeEntity(m_Parent); + } + } } std::array, 5> ModelComponent::GetBehaviorsForSave() const { diff --git a/dGame/dComponents/SimplePhysicsComponent.cpp b/dGame/dComponents/SimplePhysicsComponent.cpp index 3b52395e9..e3f112840 100644 --- a/dGame/dComponents/SimplePhysicsComponent.cpp +++ b/dGame/dComponents/SimplePhysicsComponent.cpp @@ -27,6 +27,7 @@ SimplePhysicsComponent::SimplePhysicsComponent(Entity* parent, uint32_t componen } else { SetClimbableType(eClimbableType::CLIMBABLE_TYPE_NOT); } + m_PhysicsMotionState = m_Parent->GetVarAs(u"motionType"); } SimplePhysicsComponent::~SimplePhysicsComponent() { @@ -47,11 +48,9 @@ void SimplePhysicsComponent::Serialize(RakNet::BitStream& outBitStream, bool bIs } // Physics motion state - if (m_PhysicsMotionState != 0) { - outBitStream.Write1(); + outBitStream.Write(m_DirtyPhysicsMotionState || bIsInitialUpdate); + if (m_DirtyPhysicsMotionState || bIsInitialUpdate) { outBitStream.Write(m_PhysicsMotionState); - } else { - outBitStream.Write0(); } PhysicsComponent::Serialize(outBitStream, bIsInitialUpdate); } @@ -61,5 +60,6 @@ uint32_t SimplePhysicsComponent::GetPhysicsMotionState() const { } void SimplePhysicsComponent::SetPhysicsMotionState(uint32_t value) { + m_DirtyPhysicsMotionState = m_PhysicsMotionState != value; m_PhysicsMotionState = value; } diff --git a/dGame/dComponents/SimplePhysicsComponent.h b/dGame/dComponents/SimplePhysicsComponent.h index c6ef52a00..b4491e127 100644 --- a/dGame/dComponents/SimplePhysicsComponent.h +++ b/dGame/dComponents/SimplePhysicsComponent.h @@ -102,7 +102,9 @@ class SimplePhysicsComponent : public PhysicsComponent { /** * The current physics motion state */ - uint32_t m_PhysicsMotionState = 0; + uint32_t m_PhysicsMotionState = 5; + + bool m_DirtyPhysicsMotionState = true; /** * Whether or not the entity is climbable diff --git a/dScripts/ai/MINIGAME/SG_GF/SERVER/SGCannon.cpp b/dScripts/ai/MINIGAME/SG_GF/SERVER/SGCannon.cpp index 56f5b257e..5b178e06f 100644 --- a/dScripts/ai/MINIGAME/SG_GF/SERVER/SGCannon.cpp +++ b/dScripts/ai/MINIGAME/SG_GF/SERVER/SGCannon.cpp @@ -61,6 +61,7 @@ void SGCannon::OnStartup(Entity* self) { if (simplePhysicsComponent != nullptr) { simplePhysicsComponent->SetPhysicsMotionState(5); } + Game::entityManager->SerializeEntity(self); } void SGCannon::OnPlayerLoaded(Entity* self, Entity* player) {