diff --git a/dGame/dComponents/PossessableComponent.cpp b/dGame/dComponents/PossessableComponent.cpp index 6b94189f..32651534 100644 --- a/dGame/dComponents/PossessableComponent.cpp +++ b/dGame/dComponents/PossessableComponent.cpp @@ -6,13 +6,17 @@ PossessableComponent::PossessableComponent(Entity* parent, uint32_t componentId) : Component(parent) { m_Possessor = LWOOBJID_EMPTY; - CDItemComponent item = Inventory::FindItemComponent(m_ParentEntity->GetLOT()); + m_ComponentId = componentId; +} + +void PossessableComponent::LoadTemplateData() { + auto item = Inventory::FindItemComponent(m_ParentEntity->GetLOT()); m_AnimationFlag = static_cast(item.animationFlag); // Get the possession Type from the CDClient auto query = CDClientDatabase::CreatePreppedStmt("SELECT possessionType, depossessOnHit FROM PossessableComponent WHERE id = ?;"); - query.bind(1, static_cast(componentId)); + query.bind(1, static_cast(m_ComponentId)); auto result = query.execQuery(); @@ -24,13 +28,11 @@ PossessableComponent::PossessableComponent(Entity* parent, uint32_t componentId) m_PossessionType = ePossessionType::ATTACHED_VISIBLE; m_DepossessOnHit = false; } - result.finalize(); } void PossessableComponent::Serialize(RakNet::BitStream* outBitStream, bool bIsInitialUpdate, unsigned int& flags) { outBitStream->Write(m_DirtyPossessable || bIsInitialUpdate); if (m_DirtyPossessable || bIsInitialUpdate) { - m_DirtyPossessable = false; // reset flag outBitStream->Write(m_Possessor != LWOOBJID_EMPTY); if (m_Possessor != LWOOBJID_EMPTY) outBitStream->Write(m_Possessor); @@ -38,7 +40,10 @@ void PossessableComponent::Serialize(RakNet::BitStream* outBitStream, bool bIsIn if (m_AnimationFlag != eAnimationFlags::IDLE_NONE) outBitStream->Write(m_AnimationFlag); outBitStream->Write(m_ImmediatelyDepossess); - m_ImmediatelyDepossess = false; // reset flag + if (!bIsInitialUpdate) { + m_DirtyPossessable = false; + m_ImmediatelyDepossess = false; + } } } diff --git a/dGame/dComponents/PossessableComponent.h b/dGame/dComponents/PossessableComponent.h index 824117f1..39e12f45 100644 --- a/dGame/dComponents/PossessableComponent.h +++ b/dGame/dComponents/PossessableComponent.h @@ -18,12 +18,9 @@ public: PossessableComponent(Entity* parentEntity, uint32_t componentId); - void Serialize(RakNet::BitStream* outBitStream, bool bIsInitialUpdate, unsigned int& flags); + void LoadTemplateData() override; - /** - * @brief mounts the Entity - */ - void Mount(); + void Serialize(RakNet::BitStream* outBitStream, bool bIsInitialUpdate, unsigned int& flags); /** * @brief dismounts the Entity @@ -34,7 +31,11 @@ public: * Sets the possessor of this Entity * @param value the ID of the possessor to set */ - void SetPossessor(LWOOBJID value) { m_Possessor = value; m_DirtyPossessable = true; }; + void SetPossessor(const LWOOBJID& value) { + if (m_Possessor == value) return; + m_Possessor = value; + m_DirtyPossessable = true; + } /** * Returns the possessor of this Entity @@ -46,7 +47,11 @@ public: * Sets the animation Flag of the possessable * @param value the animation flag to set to */ - void SetAnimationFlag(eAnimationFlags value) { m_AnimationFlag = value; m_DirtyPossessable = true; }; + void SetAnimationFlag(eAnimationFlags value) { + if (m_AnimationFlag == value) return; + m_AnimationFlag = value; + m_DirtyPossessable = true; + } /** * Returns the possession type of this Entity @@ -63,7 +68,10 @@ public: /** * Forcibly depossess the Entity */ - void ForceDepossess() { m_ImmediatelyDepossess = true; m_DirtyPossessable = true; }; + void ForceDepossess() { + m_ImmediatelyDepossess = true; + m_DirtyPossessable = true; + } /** * Set if the parent entity was spawned from an item @@ -123,4 +131,6 @@ private: * */ bool m_ItemSpawned = false; + + int32_t m_ComponentId = -1; };