diff --git a/dGame/dComponents/ModelComponent.cpp b/dGame/dComponents/ModelComponent.cpp index 91680987..7d1a0c0e 100644 --- a/dGame/dComponents/ModelComponent.cpp +++ b/dGame/dComponents/ModelComponent.cpp @@ -66,6 +66,10 @@ void ModelComponent::Serialize(RakNet::BitStream& outBitStream, bool bIsInitialU if (bIsInitialUpdate) outBitStream.Write0(); // We are not writing model editing info } +void ModelComponent::Update(float deltaTime) { + for (auto& behavior : m_Behaviors) behavior.Update(deltaTime); +} + void ModelComponent::UpdatePendingBehaviorId(const int32_t newId) { for (auto& behavior : m_Behaviors) if (behavior.GetBehaviorId() == -1) behavior.SetBehaviorId(newId); } diff --git a/dGame/dComponents/ModelComponent.h b/dGame/dComponents/ModelComponent.h index 9e23eafb..bf4a15cf 100644 --- a/dGame/dComponents/ModelComponent.h +++ b/dGame/dComponents/ModelComponent.h @@ -29,6 +29,8 @@ public: ModelComponent(Entity* parent); + void Update(float deltaTime) override; + void LoadBehaviors(); void Serialize(RakNet::BitStream& outBitStream, bool bIsInitialUpdate) override; diff --git a/dGame/dPropertyBehaviors/ControlBehaviorMessages/Action.cpp b/dGame/dPropertyBehaviors/ControlBehaviorMessages/Action.cpp index 6a21be9b..2fb98e41 100644 --- a/dGame/dPropertyBehaviors/ControlBehaviorMessages/Action.cpp +++ b/dGame/dPropertyBehaviors/ControlBehaviorMessages/Action.cpp @@ -22,6 +22,14 @@ Action::Action(const AMFArrayValue& arguments) { } } +void Action::Update(float deltaTime) { + // Do nothing +} + +bool Action::Done() const noexcept { + return true; +} + void Action::SendBehaviorBlocksToClient(AMFArrayValue& args) const { auto* const actionArgs = args.PushArray(); actionArgs->Insert("Type", m_Type); diff --git a/dGame/dPropertyBehaviors/ControlBehaviorMessages/Action.h b/dGame/dPropertyBehaviors/ControlBehaviorMessages/Action.h index 8146e08d..ee333d12 100644 --- a/dGame/dPropertyBehaviors/ControlBehaviorMessages/Action.h +++ b/dGame/dPropertyBehaviors/ControlBehaviorMessages/Action.h @@ -17,6 +17,11 @@ class Action { public: Action() = default; Action(const AMFArrayValue& arguments); + + void Update(float deltaTime); + + bool Done() const noexcept; + [[nodiscard]] const std::string& GetType() const { return m_Type; }; [[nodiscard]] const std::string& GetValueParameterName() const { return m_ValueParameterName; }; [[nodiscard]] const std::string& GetValueParameterString() const { return m_ValueParameterString; }; diff --git a/dGame/dPropertyBehaviors/PropertyBehavior.cpp b/dGame/dPropertyBehaviors/PropertyBehavior.cpp index 5bdb5827..08c0aa88 100644 --- a/dGame/dPropertyBehaviors/PropertyBehavior.cpp +++ b/dGame/dPropertyBehaviors/PropertyBehavior.cpp @@ -9,6 +9,12 @@ PropertyBehavior::PropertyBehavior() { m_LastEditedState = BehaviorState::HOME_STATE; } +void PropertyBehavior::Update(float deltaTime) { + for (auto& [stateId, state] : m_States) { + state.Update(deltaTime); + } +} + template<> void PropertyBehavior::HandleMsg(AddStripMessage& msg) { m_States[msg.GetActionContext().GetStateId()].HandleMsg(msg); diff --git a/dGame/dPropertyBehaviors/PropertyBehavior.h b/dGame/dPropertyBehaviors/PropertyBehavior.h index 01eb1968..63ef548f 100644 --- a/dGame/dPropertyBehaviors/PropertyBehavior.h +++ b/dGame/dPropertyBehaviors/PropertyBehavior.h @@ -18,6 +18,8 @@ class PropertyBehavior { public: PropertyBehavior(); + void Update(float deltaTime); + template void HandleMsg(Msg& msg); diff --git a/dGame/dPropertyBehaviors/State.cpp b/dGame/dPropertyBehaviors/State.cpp index 1fb072c1..561e9eef 100644 --- a/dGame/dPropertyBehaviors/State.cpp +++ b/dGame/dPropertyBehaviors/State.cpp @@ -4,6 +4,12 @@ #include "ControlBehaviorMsgs.h" #include "tinyxml2.h" +void State::Update(float deltaTime) { + for (auto& strip : m_Strips) { + strip.Update(deltaTime); + } +} + template <> void State::HandleMsg(AddStripMessage& msg) { if (m_Strips.size() <= msg.GetActionContext().GetStripId()) { diff --git a/dGame/dPropertyBehaviors/State.h b/dGame/dPropertyBehaviors/State.h index 3e8c827f..9c49bae1 100644 --- a/dGame/dPropertyBehaviors/State.h +++ b/dGame/dPropertyBehaviors/State.h @@ -11,6 +11,8 @@ class AMFArrayValue; class State { public: + void Update(float deltaTime); + template void HandleMsg(Msg& msg); diff --git a/dGame/dPropertyBehaviors/Strip.cpp b/dGame/dPropertyBehaviors/Strip.cpp index d6dc050b..1af21f9d 100644 --- a/dGame/dPropertyBehaviors/Strip.cpp +++ b/dGame/dPropertyBehaviors/Strip.cpp @@ -4,6 +4,15 @@ #include "ControlBehaviorMsgs.h" #include "tinyxml2.h" +void Strip::Update(float deltaTime) { + if (m_Actions.empty() || m_ActionIndex >= m_Actions.size()) return; + + auto& action = m_Actions[m_ActionIndex]; + action.Update(deltaTime); + LOG("Running action %s", action.GetType().c_str()); + if (action.Done()) m_ActionIndex++; +} + template <> void Strip::HandleMsg(AddStripMessage& msg) { m_Actions = msg.GetActionsToAdd(); diff --git a/dGame/dPropertyBehaviors/Strip.h b/dGame/dPropertyBehaviors/Strip.h index 8fd7d0fe..591f28ce 100644 --- a/dGame/dPropertyBehaviors/Strip.h +++ b/dGame/dPropertyBehaviors/Strip.h @@ -14,6 +14,8 @@ class AMFArrayValue; class Strip { public: + void Update(float deltaTime); + template void HandleMsg(Msg& msg); @@ -23,6 +25,8 @@ public: void Serialize(tinyxml2::XMLElement& strip) const; void Deserialize(const tinyxml2::XMLElement& strip); private: + uint32_t m_ActionIndex{ 0 }; + std::vector m_Actions; StripUiPosition m_Position; };