Component serialization updates

- Fix serialization in multiple components so they don't get dirty flags reset when it was not intentional
This commit is contained in:
David Markowitz 2023-06-26 22:58:35 -07:00
parent 2abcb142ad
commit c6063aac66
4 changed files with 33 additions and 63 deletions

View File

@ -506,11 +506,11 @@ std::vector<LWOOBJID> BaseCombatAIComponent::GetTargetWithinAggroRange() const {
} }
void BaseCombatAIComponent::Serialize(RakNet::BitStream* outBitStream, bool bIsInitialUpdate, unsigned int& flags) { void BaseCombatAIComponent::Serialize(RakNet::BitStream* outBitStream, bool bIsInitialUpdate, unsigned int& flags) {
outBitStream->Write(m_DirtyStateOrTarget || bIsInitialUpdate); outBitStream->Write(m_DirtyStateOrTarget);
if (m_DirtyStateOrTarget || bIsInitialUpdate) { if (bIsInitialUpdate || m_DirtyStateOrTarget) {
outBitStream->Write(m_State); outBitStream->Write(m_State);
outBitStream->Write(m_Target); outBitStream->Write(m_Target);
m_DirtyStateOrTarget = false; if (!bIsInitialUpdate) m_DirtyStateOrTarget = false;
} }
} }

View File

@ -22,7 +22,7 @@ void BouncerComponent::Serialize(RakNet::BitStream* outBitStream, bool bIsInitia
outBitStream->Write(bIsInitialUpdate || m_DirtyBounceInfo); outBitStream->Write(bIsInitialUpdate || m_DirtyBounceInfo);
if (bIsInitialUpdate || m_DirtyBounceInfo) { if (bIsInitialUpdate || m_DirtyBounceInfo) {
outBitStream->Write(m_BounceOnCollision); outBitStream->Write(m_BounceOnCollision);
m_DirtyBounceInfo = false; if (!bIsInitialUpdate) m_DirtyBounceInfo = false;
} }
} }

View File

@ -64,9 +64,8 @@ ControllablePhysicsComponent::ControllablePhysicsComponent(Entity* entity) : Com
} }
ControllablePhysicsComponent::~ControllablePhysicsComponent() { ControllablePhysicsComponent::~ControllablePhysicsComponent() {
if (m_dpEntity) { if (!m_dpEntity) return;
dpWorld::Instance().RemoveEntity(m_dpEntity); dpWorld::Instance().RemoveEntity(m_dpEntity);
}
} }
void ControllablePhysicsComponent::Startup() { void ControllablePhysicsComponent::Startup() {
@ -76,19 +75,7 @@ void ControllablePhysicsComponent::Startup() {
SetRotation(rot); SetRotation(rot);
} }
void ControllablePhysicsComponent::LoadConfigData() {
}
void ControllablePhysicsComponent::LoadTemplateData() {
}
void ControllablePhysicsComponent::Serialize(RakNet::BitStream* outBitStream, bool bIsInitialUpdate, unsigned int& flags) { 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) { if (bIsInitialUpdate) {
outBitStream->Write(m_InJetpackMode); outBitStream->Write(m_InJetpackMode);
if (m_InJetpackMode) { if (m_InJetpackMode) {
@ -109,33 +96,32 @@ void ControllablePhysicsComponent::Serialize(RakNet::BitStream* outBitStream, bo
if (m_IgnoreMultipliers) m_DirtyCheats = false; if (m_IgnoreMultipliers) m_DirtyCheats = false;
outBitStream->Write(m_DirtyCheats); outBitStream->Write(bIsInitialUpdate || m_DirtyCheats);
if (m_DirtyCheats) { if (bIsInitialUpdate || m_DirtyCheats) {
outBitStream->Write(m_GravityScale); outBitStream->Write(m_GravityScale);
outBitStream->Write(m_SpeedMultiplier); outBitStream->Write(m_SpeedMultiplier);
if (!bIsInitialUpdate) m_DirtyCheats = false;
m_DirtyCheats = false;
} }
outBitStream->Write(m_DirtyEquippedItemInfo); outBitStream->Write(bIsInitialUpdate || m_DirtyEquippedItemInfo);
if (m_DirtyEquippedItemInfo) { if (bIsInitialUpdate || m_DirtyEquippedItemInfo) {
outBitStream->Write(m_PickupRadius); outBitStream->Write(m_PickupRadius);
outBitStream->Write(m_InJetpackMode); outBitStream->Write(m_InJetpackMode);
m_DirtyEquippedItemInfo = false; if (!bIsInitialUpdate) m_DirtyEquippedItemInfo = false;
} }
outBitStream->Write(m_DirtyBubble); outBitStream->Write(bIsInitialUpdate || m_DirtyBubble);
if (m_DirtyBubble) { if (bIsInitialUpdate || m_DirtyBubble) {
outBitStream->Write(m_IsInBubble); outBitStream->Write(m_IsInBubble);
if (m_IsInBubble) { if (m_IsInBubble) {
outBitStream->Write(m_BubbleType); outBitStream->Write(m_BubbleType);
outBitStream->Write(m_SpecialAnims); outBitStream->Write(m_SpecialAnims);
} }
m_DirtyBubble = false; if (!bIsInitialUpdate) m_DirtyBubble = false;
} }
outBitStream->Write(m_DirtyPosition || bIsInitialUpdate); outBitStream->Write(bIsInitialUpdate || m_DirtyPosition);
if (m_DirtyPosition || bIsInitialUpdate) { if (bIsInitialUpdate || m_DirtyPosition) {
outBitStream->Write(m_Position.x); outBitStream->Write(m_Position.x);
outBitStream->Write(m_Position.y); outBitStream->Write(m_Position.y);
outBitStream->Write(m_Position.z); outBitStream->Write(m_Position.z);
@ -148,20 +134,22 @@ void ControllablePhysicsComponent::Serialize(RakNet::BitStream* outBitStream, bo
outBitStream->Write(m_IsOnGround); outBitStream->Write(m_IsOnGround);
outBitStream->Write(m_IsOnRail); outBitStream->Write(m_IsOnRail);
outBitStream->Write(m_DirtyVelocity); outBitStream->Write(bIsInitialUpdate || m_DirtyVelocity);
if (m_DirtyVelocity) { if (bIsInitialUpdate || m_DirtyVelocity) {
outBitStream->Write(m_Velocity.x); outBitStream->Write(m_Velocity.x);
outBitStream->Write(m_Velocity.y); outBitStream->Write(m_Velocity.y);
outBitStream->Write(m_Velocity.z); outBitStream->Write(m_Velocity.z);
if (!bIsInitialUpdate) m_DirtyVelocity = false;
} }
outBitStream->Write(m_DirtyAngularVelocity); outBitStream->Write(bIsInitialUpdate || m_DirtyAngularVelocity);
if (m_DirtyAngularVelocity) { if (bIsInitialUpdate || m_DirtyAngularVelocity) {
outBitStream->Write(m_AngularVelocity.x); outBitStream->Write(m_AngularVelocity.x);
outBitStream->Write(m_AngularVelocity.y); outBitStream->Write(m_AngularVelocity.y);
outBitStream->Write(m_AngularVelocity.z); outBitStream->Write(m_AngularVelocity.z);
if (!bIsInitialUpdate) m_DirtyAngularVelocity = false;
} }
if (!bIsInitialUpdate) m_DirtyPosition = false;
outBitStream->Write0(); outBitStream->Write0();
} }
@ -261,9 +249,7 @@ void ControllablePhysicsComponent::SetRotation(const NiQuaternion& rot) {
} }
void ControllablePhysicsComponent::SetVelocity(const NiPoint3& vel) { void ControllablePhysicsComponent::SetVelocity(const NiPoint3& vel) {
if (m_Static) { if (m_Static || m_Velocity == vel) return;
return;
}
m_Velocity = vel; m_Velocity = vel;
m_DirtyPosition = true; m_DirtyPosition = true;
@ -273,9 +259,7 @@ void ControllablePhysicsComponent::SetVelocity(const NiPoint3& vel) {
} }
void ControllablePhysicsComponent::SetAngularVelocity(const NiPoint3& vel) { void ControllablePhysicsComponent::SetAngularVelocity(const NiPoint3& vel) {
if (m_Static || vel == m_AngularVelocity) { if (m_Static || vel == m_AngularVelocity) return;
return;
}
m_AngularVelocity = vel; m_AngularVelocity = vel;
m_DirtyPosition = true; m_DirtyPosition = true;
@ -294,18 +278,6 @@ void ControllablePhysicsComponent::SetIsOnRail(bool val) {
m_DirtyPosition = true; 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) { void ControllablePhysicsComponent::AddPickupRadiusScale(float value) {
m_ActivePickupRadiusScales.push_back(value); m_ActivePickupRadiusScales.push_back(value);
if (value > m_PickupRadius) { if (value > m_PickupRadius) {
@ -328,7 +300,7 @@ void ControllablePhysicsComponent::RemovePickupRadiusScale(float value) {
m_PickupRadius = 0.0f; m_PickupRadius = 0.0f;
m_DirtyEquippedItemInfo = true; m_DirtyEquippedItemInfo = true;
for (uint32_t i = 0; i < m_ActivePickupRadiusScales.size(); i++) { 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; if (m_PickupRadius < candidateRadius) m_PickupRadius = candidateRadius;
} }
EntityManager::Instance()->SerializeEntity(m_ParentEntity); EntityManager::Instance()->SerializeEntity(m_ParentEntity);
@ -350,7 +322,7 @@ void ControllablePhysicsComponent::RemoveSpeedboost(float value) {
} }
// Recalculate speedboost since we removed one // 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 if (m_ActiveSpeedBoosts.empty()) { // no active speed boosts left, so return to base speed
auto* levelProgressionComponent = m_ParentEntity->GetComponent<LevelProgressionComponent>(); auto* levelProgressionComponent = m_ParentEntity->GetComponent<LevelProgressionComponent>();
if (levelProgressionComponent) m_SpeedBoost = levelProgressionComponent->GetSpeedBase(); if (levelProgressionComponent) m_SpeedBoost = levelProgressionComponent->GetSpeedBase();
@ -363,7 +335,7 @@ void ControllablePhysicsComponent::RemoveSpeedboost(float value) {
void ControllablePhysicsComponent::ActivateBubbleBuff(eBubbleType bubbleType, bool specialAnims) { void ControllablePhysicsComponent::ActivateBubbleBuff(eBubbleType bubbleType, bool specialAnims) {
if (m_IsInBubble) { if (m_IsInBubble) {
Game::logger->Log("ControllablePhysicsComponent", "Already in bubble"); Game::logger->Log("ControllablePhysicsComponent", "%llu is already in bubble", m_ParentEntity->GetObjectID());
return; return;
} }
m_BubbleType = bubbleType; m_BubbleType = bubbleType;

View File

@ -19,7 +19,7 @@ enum class eStateChangeType : uint32_t;
/** /**
* Handles the movement of controllable Entities, e.g. enemies and players * Handles the movement of controllable Entities, e.g. enemies and players
*/ */
class ControllablePhysicsComponent : public Component { class ControllablePhysicsComponent final : public Component {
public: public:
inline static const eReplicaComponentType ComponentType = eReplicaComponentType::CONTROLLABLE_PHYSICS; inline static const eReplicaComponentType ComponentType = eReplicaComponentType::CONTROLLABLE_PHYSICS;
@ -31,8 +31,6 @@ public:
void ResetFlags(); void ResetFlags();
void UpdateXml(tinyxml2::XMLDocument* doc) override; void UpdateXml(tinyxml2::XMLDocument* doc) override;
void Startup() override; void Startup() override;
void LoadConfigData() override;
void LoadTemplateData() override;
/** /**
* Sets the position of this entity, also ensures this update is serialized next tick. * 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 * Mark the position as dirty, forcing a serialization update next tick
* @param val whether or not the position is dirty * @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 * Mark the velocity as dirty, forcing a serializtion update next tick
* @param val whether or not the velocity is dirty * @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 * Mark the angular velocity as dirty, forcing a serialization update next tick
* @param val whether or not the angular velocity is dirty * @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 * Sets whether or not the entity is currently wearing a jetpack