From c6063aac664e5dc486255f12d0945a90e11b5ca4 Mon Sep 17 00:00:00 2001 From: David Markowitz Date: Mon, 26 Jun 2023 22:58:35 -0700 Subject: [PATCH] Component serialization updates - Fix serialization in multiple components so they don't get dirty flags reset when it was not intentional --- dGame/dComponents/BaseCombatAIComponent.cpp | 6 +- dGame/dComponents/BouncerComponent.cpp | 2 +- .../ControllablePhysicsComponent.cpp | 78 ++++++------------- .../ControllablePhysicsComponent.h | 10 +-- 4 files changed, 33 insertions(+), 63 deletions(-) diff --git a/dGame/dComponents/BaseCombatAIComponent.cpp b/dGame/dComponents/BaseCombatAIComponent.cpp index 33772459..a7465046 100644 --- a/dGame/dComponents/BaseCombatAIComponent.cpp +++ b/dGame/dComponents/BaseCombatAIComponent.cpp @@ -506,11 +506,11 @@ std::vector BaseCombatAIComponent::GetTargetWithinAggroRange() const { } void BaseCombatAIComponent::Serialize(RakNet::BitStream* outBitStream, bool bIsInitialUpdate, unsigned int& flags) { - outBitStream->Write(m_DirtyStateOrTarget || bIsInitialUpdate); - if (m_DirtyStateOrTarget || bIsInitialUpdate) { + outBitStream->Write(m_DirtyStateOrTarget); + if (bIsInitialUpdate || m_DirtyStateOrTarget) { outBitStream->Write(m_State); outBitStream->Write(m_Target); - m_DirtyStateOrTarget = false; + if (!bIsInitialUpdate) m_DirtyStateOrTarget = false; } } diff --git a/dGame/dComponents/BouncerComponent.cpp b/dGame/dComponents/BouncerComponent.cpp index 4ed6df78..b9fd4fed 100644 --- a/dGame/dComponents/BouncerComponent.cpp +++ b/dGame/dComponents/BouncerComponent.cpp @@ -22,7 +22,7 @@ void BouncerComponent::Serialize(RakNet::BitStream* outBitStream, bool bIsInitia outBitStream->Write(bIsInitialUpdate || m_DirtyBounceInfo); if (bIsInitialUpdate || m_DirtyBounceInfo) { outBitStream->Write(m_BounceOnCollision); - m_DirtyBounceInfo = false; + if (!bIsInitialUpdate) m_DirtyBounceInfo = false; } } diff --git a/dGame/dComponents/ControllablePhysicsComponent.cpp b/dGame/dComponents/ControllablePhysicsComponent.cpp index 59661fd7..d70d979b 100644 --- a/dGame/dComponents/ControllablePhysicsComponent.cpp +++ b/dGame/dComponents/ControllablePhysicsComponent.cpp @@ -64,9 +64,8 @@ ControllablePhysicsComponent::ControllablePhysicsComponent(Entity* entity) : Com } ControllablePhysicsComponent::~ControllablePhysicsComponent() { - if (m_dpEntity) { - dpWorld::Instance().RemoveEntity(m_dpEntity); - } + if (!m_dpEntity) return; + dpWorld::Instance().RemoveEntity(m_dpEntity); } void ControllablePhysicsComponent::Startup() { @@ -76,19 +75,7 @@ void ControllablePhysicsComponent::Startup() { SetRotation(rot); } -void ControllablePhysicsComponent::LoadConfigData() { - -} - -void ControllablePhysicsComponent::LoadTemplateData() { - -} - void ControllablePhysicsComponent::Serialize(RakNet::BitStream* outBitStream, bool bIsInitialUpdate, unsigned int& flags) { - //If this is a creation, then we assume the position is dirty, even when it isn't. - //This is because new clients will still need to receive the position. - //if (bIsInitialUpdate) m_DirtyPosition = true; - if (bIsInitialUpdate) { outBitStream->Write(m_InJetpackMode); if (m_InJetpackMode) { @@ -109,33 +96,32 @@ void ControllablePhysicsComponent::Serialize(RakNet::BitStream* outBitStream, bo if (m_IgnoreMultipliers) m_DirtyCheats = false; - outBitStream->Write(m_DirtyCheats); - if (m_DirtyCheats) { + outBitStream->Write(bIsInitialUpdate || m_DirtyCheats); + if (bIsInitialUpdate || m_DirtyCheats) { outBitStream->Write(m_GravityScale); outBitStream->Write(m_SpeedMultiplier); - - m_DirtyCheats = false; + if (!bIsInitialUpdate) m_DirtyCheats = false; } - outBitStream->Write(m_DirtyEquippedItemInfo); - if (m_DirtyEquippedItemInfo) { + outBitStream->Write(bIsInitialUpdate || m_DirtyEquippedItemInfo); + if (bIsInitialUpdate || m_DirtyEquippedItemInfo) { outBitStream->Write(m_PickupRadius); outBitStream->Write(m_InJetpackMode); - m_DirtyEquippedItemInfo = false; + if (!bIsInitialUpdate) m_DirtyEquippedItemInfo = false; } - outBitStream->Write(m_DirtyBubble); - if (m_DirtyBubble) { + outBitStream->Write(bIsInitialUpdate || m_DirtyBubble); + if (bIsInitialUpdate || m_DirtyBubble) { outBitStream->Write(m_IsInBubble); if (m_IsInBubble) { outBitStream->Write(m_BubbleType); outBitStream->Write(m_SpecialAnims); } - m_DirtyBubble = false; + if (!bIsInitialUpdate) m_DirtyBubble = false; } - outBitStream->Write(m_DirtyPosition || bIsInitialUpdate); - if (m_DirtyPosition || bIsInitialUpdate) { + outBitStream->Write(bIsInitialUpdate || m_DirtyPosition); + if (bIsInitialUpdate || m_DirtyPosition) { outBitStream->Write(m_Position.x); outBitStream->Write(m_Position.y); outBitStream->Write(m_Position.z); @@ -148,20 +134,22 @@ void ControllablePhysicsComponent::Serialize(RakNet::BitStream* outBitStream, bo outBitStream->Write(m_IsOnGround); outBitStream->Write(m_IsOnRail); - outBitStream->Write(m_DirtyVelocity); - if (m_DirtyVelocity) { + outBitStream->Write(bIsInitialUpdate || m_DirtyVelocity); + if (bIsInitialUpdate || m_DirtyVelocity) { outBitStream->Write(m_Velocity.x); outBitStream->Write(m_Velocity.y); outBitStream->Write(m_Velocity.z); + if (!bIsInitialUpdate) m_DirtyVelocity = false; } - outBitStream->Write(m_DirtyAngularVelocity); - if (m_DirtyAngularVelocity) { + outBitStream->Write(bIsInitialUpdate || m_DirtyAngularVelocity); + if (bIsInitialUpdate || m_DirtyAngularVelocity) { outBitStream->Write(m_AngularVelocity.x); outBitStream->Write(m_AngularVelocity.y); outBitStream->Write(m_AngularVelocity.z); + if (!bIsInitialUpdate) m_DirtyAngularVelocity = false; } - + if (!bIsInitialUpdate) m_DirtyPosition = false; outBitStream->Write0(); } @@ -261,9 +249,7 @@ void ControllablePhysicsComponent::SetRotation(const NiQuaternion& rot) { } void ControllablePhysicsComponent::SetVelocity(const NiPoint3& vel) { - if (m_Static) { - return; - } + if (m_Static || m_Velocity == vel) return; m_Velocity = vel; m_DirtyPosition = true; @@ -273,9 +259,7 @@ void ControllablePhysicsComponent::SetVelocity(const NiPoint3& vel) { } void ControllablePhysicsComponent::SetAngularVelocity(const NiPoint3& vel) { - if (m_Static || vel == m_AngularVelocity) { - return; - } + if (m_Static || vel == m_AngularVelocity) return; m_AngularVelocity = vel; m_DirtyPosition = true; @@ -294,18 +278,6 @@ void ControllablePhysicsComponent::SetIsOnRail(bool val) { m_DirtyPosition = true; } -void ControllablePhysicsComponent::SetDirtyPosition(bool val) { - m_DirtyPosition = val; -} - -void ControllablePhysicsComponent::SetDirtyVelocity(bool val) { - m_DirtyVelocity = val; -} - -void ControllablePhysicsComponent::SetDirtyAngularVelocity(bool val) { - m_DirtyAngularVelocity = val; -} - void ControllablePhysicsComponent::AddPickupRadiusScale(float value) { m_ActivePickupRadiusScales.push_back(value); if (value > m_PickupRadius) { @@ -328,7 +300,7 @@ void ControllablePhysicsComponent::RemovePickupRadiusScale(float value) { m_PickupRadius = 0.0f; m_DirtyEquippedItemInfo = true; for (uint32_t i = 0; i < m_ActivePickupRadiusScales.size(); i++) { - auto candidateRadius = m_ActivePickupRadiusScales[i]; + auto candidateRadius = m_ActivePickupRadiusScales.at(i); if (m_PickupRadius < candidateRadius) m_PickupRadius = candidateRadius; } EntityManager::Instance()->SerializeEntity(m_ParentEntity); @@ -350,7 +322,7 @@ void ControllablePhysicsComponent::RemoveSpeedboost(float value) { } // Recalculate speedboost since we removed one - m_SpeedBoost = 0.0f; + m_SpeedBoost = 500.0f; if (m_ActiveSpeedBoosts.empty()) { // no active speed boosts left, so return to base speed auto* levelProgressionComponent = m_ParentEntity->GetComponent(); if (levelProgressionComponent) m_SpeedBoost = levelProgressionComponent->GetSpeedBase(); @@ -363,7 +335,7 @@ void ControllablePhysicsComponent::RemoveSpeedboost(float value) { void ControllablePhysicsComponent::ActivateBubbleBuff(eBubbleType bubbleType, bool specialAnims) { if (m_IsInBubble) { - Game::logger->Log("ControllablePhysicsComponent", "Already in bubble"); + Game::logger->Log("ControllablePhysicsComponent", "%llu is already in bubble", m_ParentEntity->GetObjectID()); return; } m_BubbleType = bubbleType; diff --git a/dGame/dComponents/ControllablePhysicsComponent.h b/dGame/dComponents/ControllablePhysicsComponent.h index 4919a5a7..f77c7369 100644 --- a/dGame/dComponents/ControllablePhysicsComponent.h +++ b/dGame/dComponents/ControllablePhysicsComponent.h @@ -19,7 +19,7 @@ enum class eStateChangeType : uint32_t; /** * Handles the movement of controllable Entities, e.g. enemies and players */ -class ControllablePhysicsComponent : public Component { +class ControllablePhysicsComponent final : public Component { public: inline static const eReplicaComponentType ComponentType = eReplicaComponentType::CONTROLLABLE_PHYSICS; @@ -31,8 +31,6 @@ public: void ResetFlags(); void UpdateXml(tinyxml2::XMLDocument* doc) override; void Startup() override; - void LoadConfigData() override; - void LoadTemplateData() override; /** * Sets the position of this entity, also ensures this update is serialized next tick. @@ -117,19 +115,19 @@ public: * Mark the position as dirty, forcing a serialization update next tick * @param val whether or not the position is dirty */ - void SetDirtyPosition(bool val); + void SetDirtyPosition(bool val) { m_DirtyPosition = val; } /** * Mark the velocity as dirty, forcing a serializtion update next tick * @param val whether or not the velocity is dirty */ - void SetDirtyVelocity(bool val); + void SetDirtyVelocity(bool val) { m_DirtyVelocity = val; } /** * Mark the angular velocity as dirty, forcing a serialization update next tick * @param val whether or not the angular velocity is dirty */ - void SetDirtyAngularVelocity(bool val); + void SetDirtyAngularVelocity(bool val) { m_DirtyAngularVelocity = val; } /** * Sets whether or not the entity is currently wearing a jetpack