From 51e4273a533c794102a8319e32b7dcd86ca3f269 Mon Sep 17 00:00:00 2001 From: David Markowitz Date: Wed, 2 Apr 2025 23:37:06 -0700 Subject: [PATCH] add resetting --- dGame/dComponents/ModelComponent.cpp | 11 +++++++++++ dGame/dComponents/ModelComponent.h | 1 + dGame/dComponents/PropertyManagementComponent.cpp | 6 ++++++ dGame/dGameMessages/GameMessages.h | 4 ++++ dGame/dPropertyBehaviors/PropertyBehavior.cpp | 6 ++++++ dGame/dPropertyBehaviors/State.cpp | 5 +++++ dGame/dPropertyBehaviors/Strip.cpp | 7 +++++++ 7 files changed, 40 insertions(+) diff --git a/dGame/dComponents/ModelComponent.cpp b/dGame/dComponents/ModelComponent.cpp index 0a5e6cd4..28223f10 100644 --- a/dGame/dComponents/ModelComponent.cpp +++ b/dGame/dComponents/ModelComponent.cpp @@ -20,6 +20,17 @@ ModelComponent::ModelComponent(Entity* parent) : Component(parent) { m_userModelID = m_Parent->GetVarAs(u"userModelID"); RegisterMsg(MessageType::Game::REQUEST_USE, this, &ModelComponent::OnRequestUse); + RegisterMsg(MessageType::Game::RESET_MODEL_TO_DEFAULTS, this, &ModelComponent::OnResetModelToDefaults); +} + +bool ModelComponent::OnResetModelToDefaults(GameMessages::GameMsg& msg) { + auto& reset = static_cast(msg); + for (auto& behavior : m_Behaviors) behavior.HandleMsg(reset); + GameMessages::UnSmash unsmash; + unsmash.target = GetParent()->GetObjectID(); + unsmash.duration = 0.0f; + unsmash.Send(UNASSIGNED_SYSTEM_ADDRESS); + return true; } bool ModelComponent::OnRequestUse(GameMessages::GameMsg& msg) { diff --git a/dGame/dComponents/ModelComponent.h b/dGame/dComponents/ModelComponent.h index f4d0ffbb..636a73df 100644 --- a/dGame/dComponents/ModelComponent.h +++ b/dGame/dComponents/ModelComponent.h @@ -33,6 +33,7 @@ public: void Update(float deltaTime) override; bool OnRequestUse(GameMessages::GameMsg& msg); + bool OnResetModelToDefaults(GameMessages::GameMsg& msg); void Serialize(RakNet::BitStream& outBitStream, bool bIsInitialUpdate) override; diff --git a/dGame/dComponents/PropertyManagementComponent.cpp b/dGame/dComponents/PropertyManagementComponent.cpp index 33998716..60c5cc80 100644 --- a/dGame/dComponents/PropertyManagementComponent.cpp +++ b/dGame/dComponents/PropertyManagementComponent.cpp @@ -262,6 +262,9 @@ void PropertyManagementComponent::OnStartBuilding() { auto* modelComponent = model->GetComponent(); if (modelComponent) modelComponent->Pause(); Game::entityManager->SerializeEntity(model); + GameMessages::ResetModelToDefaults reset; + reset.target = modelID; + model->HandleMsg(reset); } } } @@ -285,6 +288,9 @@ void PropertyManagementComponent::OnFinishBuilding() { auto* modelComponent = model->GetComponent(); if (modelComponent) modelComponent->Resume(); Game::entityManager->SerializeEntity(model); + GameMessages::ResetModelToDefaults reset; + reset.target = modelID; + model->HandleMsg(reset); } } } diff --git a/dGame/dGameMessages/GameMessages.h b/dGame/dGameMessages/GameMessages.h index 4cb3950e..a53fa647 100644 --- a/dGame/dGameMessages/GameMessages.h +++ b/dGame/dGameMessages/GameMessages.h @@ -829,6 +829,10 @@ namespace GameMessages { int32_t soundID{ -1 }; }; + + struct ResetModelToDefaults : public GameMsg { + ResetModelToDefaults() : GameMsg(MessageType::Game::RESET_MODEL_TO_DEFAULTS) {} + }; }; #endif // GAMEMESSAGES_H diff --git a/dGame/dPropertyBehaviors/PropertyBehavior.cpp b/dGame/dPropertyBehaviors/PropertyBehavior.cpp index 4ab5f607..ad6af59a 100644 --- a/dGame/dPropertyBehaviors/PropertyBehavior.cpp +++ b/dGame/dPropertyBehaviors/PropertyBehavior.cpp @@ -93,6 +93,12 @@ void PropertyBehavior::HandleMsg(GameMessages::RequestUse& msg) { m_States[m_ActiveState].HandleMsg(msg); } +template<> +void PropertyBehavior::HandleMsg(GameMessages::ResetModelToDefaults& msg) { + m_ActiveState = BehaviorState::HOME_STATE; + for (auto& state : m_States | std::views::values) state.HandleMsg(msg); +} + void PropertyBehavior::SendBehaviorListToClient(AMFArrayValue& args) const { args.Insert("id", std::to_string(m_BehaviorId)); args.Insert("name", m_Name); diff --git a/dGame/dPropertyBehaviors/State.cpp b/dGame/dPropertyBehaviors/State.cpp index a18a5716..0655c78c 100644 --- a/dGame/dPropertyBehaviors/State.cpp +++ b/dGame/dPropertyBehaviors/State.cpp @@ -122,6 +122,11 @@ void State::HandleMsg(GameMessages::RequestUse& msg) { for (auto& strip : m_Strips) strip.HandleMsg(msg); } +template<> +void State::HandleMsg(GameMessages::ResetModelToDefaults& msg) { + for (auto& strip : m_Strips) strip.HandleMsg(msg); +} + bool State::IsEmpty() const { for (const auto& strip : m_Strips) { if (!strip.IsEmpty()) return false; diff --git a/dGame/dPropertyBehaviors/Strip.cpp b/dGame/dPropertyBehaviors/Strip.cpp index d6fef642..7e9f7149 100644 --- a/dGame/dPropertyBehaviors/Strip.cpp +++ b/dGame/dPropertyBehaviors/Strip.cpp @@ -88,6 +88,13 @@ void Strip::HandleMsg(GameMessages::RequestUse& msg) { } } +template<> +void Strip::HandleMsg(GameMessages::ResetModelToDefaults& msg) { + m_WaitingForAction = false; + m_PausedTime = 0.0f; + m_NextActionIndex = 0; +} + void Strip::IncrementAction() { if (m_Actions.empty()) return; m_NextActionIndex++;