From 739eae52447811c7eddd26b82dc09a858f571c29 Mon Sep 17 00:00:00 2001 From: Aaron Kimbrell Date: Sat, 13 May 2023 09:30:59 -0500 Subject: [PATCH] feature: Implement FallSpeedBehavior (#1084) * Hacky FallSpeedBehavior * Fixup * Make it more robust like speedboost add check for default Fix error in GetActiveSpeedboosts * simplify and address feedback --- dGame/dBehaviors/Behavior.cpp | 5 +- dGame/dBehaviors/CMakeLists.txt | 1 + dGame/dBehaviors/FallSpeedBehavior.cpp | 50 +++++++++++++++++++ dGame/dBehaviors/FallSpeedBehavior.h | 18 +++++++ .../ControllablePhysicsComponent.cpp | 2 +- .../ControllablePhysicsComponent.h | 2 +- 6 files changed, 75 insertions(+), 3 deletions(-) create mode 100644 dGame/dBehaviors/FallSpeedBehavior.cpp create mode 100644 dGame/dBehaviors/FallSpeedBehavior.h diff --git a/dGame/dBehaviors/Behavior.cpp b/dGame/dBehaviors/Behavior.cpp index 2a269dd..8b34507 100644 --- a/dGame/dBehaviors/Behavior.cpp +++ b/dGame/dBehaviors/Behavior.cpp @@ -61,6 +61,7 @@ #include "SpeedBehavior.h" #include "DamageReductionBehavior.h" #include "JetPackBehavior.h" +#include "FallSpeedBehavior.h" #include "ChangeIdleFlagsBehavior.h" #include "DarkInspirationBehavior.h" @@ -164,7 +165,9 @@ Behavior* Behavior::CreateBehavior(const uint32_t behaviorId) { case BehaviorTemplates::BEHAVIOR_CAR_BOOST: behavior = new CarBoostBehavior(behaviorId); break; - case BehaviorTemplates::BEHAVIOR_FALL_SPEED: break; + case BehaviorTemplates::BEHAVIOR_FALL_SPEED: + behavior = new FallSpeedBehavior(behaviorId); + break; case BehaviorTemplates::BEHAVIOR_SHIELD: break; case BehaviorTemplates::BEHAVIOR_REPAIR_ARMOR: behavior = new RepairBehavior(behaviorId); diff --git a/dGame/dBehaviors/CMakeLists.txt b/dGame/dBehaviors/CMakeLists.txt index 7b331fe..8a9368b 100644 --- a/dGame/dBehaviors/CMakeLists.txt +++ b/dGame/dBehaviors/CMakeLists.txt @@ -22,6 +22,7 @@ set(DGAME_DBEHAVIORS_SOURCES "AirMovementBehavior.cpp" "DurationBehavior.cpp" "EmptyBehavior.cpp" "EndBehavior.cpp" + "FallSpeedBehavior.cpp" "ForceMovementBehavior.cpp" "HealBehavior.cpp" "ImaginationBehavior.cpp" diff --git a/dGame/dBehaviors/FallSpeedBehavior.cpp b/dGame/dBehaviors/FallSpeedBehavior.cpp new file mode 100644 index 0000000..158c87f --- /dev/null +++ b/dGame/dBehaviors/FallSpeedBehavior.cpp @@ -0,0 +1,50 @@ +#include "FallSpeedBehavior.h" + +#include "ControllablePhysicsComponent.h" +#include "BehaviorContext.h" +#include "BehaviorBranchContext.h" + + +void FallSpeedBehavior::Handle(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) { + // make sure required parameter has non-default value + if (m_PercentSlowed == 0.0f) return; + auto* target = EntityManager::Instance()->GetEntity(branch.target); + if (!target) return; + + auto* controllablePhysicsComponent = target->GetComponent(); + if (!controllablePhysicsComponent) return; + controllablePhysicsComponent->SetGravityScale(m_PercentSlowed); + EntityManager::Instance()->SerializeEntity(target); + + if (branch.duration > 0.0f) { + context->RegisterTimerBehavior(this, branch); + } else if (branch.start > 0) { + context->RegisterEndBehavior(this, branch); + } +} + +void FallSpeedBehavior::Calculate(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) { + Handle(context, bitStream, branch); +} + +void FallSpeedBehavior::Timer(BehaviorContext* context, BehaviorBranchContext branch, LWOOBJID second) { + End(context, branch, second); +} + +void FallSpeedBehavior::UnCast(BehaviorContext* context, BehaviorBranchContext branch) { + End(context, branch, LWOOBJID_EMPTY); +} + +void FallSpeedBehavior::End(BehaviorContext* context, BehaviorBranchContext branch, LWOOBJID second) { + auto* target = EntityManager::Instance()->GetEntity(branch.target); + if (!target) return; + + auto* controllablePhysicsComponent = target->GetComponent(); + if (!controllablePhysicsComponent) return; + controllablePhysicsComponent->SetGravityScale(1); + EntityManager::Instance()->SerializeEntity(target); +} + +void FallSpeedBehavior::Load(){ + m_PercentSlowed = GetFloat("percent_slowed"); +} diff --git a/dGame/dBehaviors/FallSpeedBehavior.h b/dGame/dBehaviors/FallSpeedBehavior.h new file mode 100644 index 0000000..01f0143 --- /dev/null +++ b/dGame/dBehaviors/FallSpeedBehavior.h @@ -0,0 +1,18 @@ +#pragma once +#include "Behavior.h" + +class FallSpeedBehavior final : public Behavior +{ +public: + explicit FallSpeedBehavior(const uint32_t behaviorId) : Behavior(behaviorId) {} + + void Handle(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) override; + void Calculate(BehaviorContext* context, RakNet::BitStream* bitStream, BehaviorBranchContext branch) override; + void Timer(BehaviorContext* context, BehaviorBranchContext branch, LWOOBJID second) override; + void End(BehaviorContext* context, BehaviorBranchContext branch, LWOOBJID second) override; + void UnCast(BehaviorContext* context, BehaviorBranchContext branch) override; + void Load() override; + +private: + float m_PercentSlowed; +}; diff --git a/dGame/dComponents/ControllablePhysicsComponent.cpp b/dGame/dComponents/ControllablePhysicsComponent.cpp index 1b8627a..d1b4420 100644 --- a/dGame/dComponents/ControllablePhysicsComponent.cpp +++ b/dGame/dComponents/ControllablePhysicsComponent.cpp @@ -320,7 +320,7 @@ void ControllablePhysicsComponent::RemoveSpeedboost(float value) { // Recalculate speedboost since we removed one m_SpeedBoost = 0.0f; - if (m_ActiveSpeedBoosts.size() == 0) { // 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_Parent->GetComponent(); if (levelProgressionComponent) m_SpeedBoost = levelProgressionComponent->GetSpeedBase(); } else { // Used the last applied speedboost diff --git a/dGame/dComponents/ControllablePhysicsComponent.h b/dGame/dComponents/ControllablePhysicsComponent.h index d608871..470a7af 100644 --- a/dGame/dComponents/ControllablePhysicsComponent.h +++ b/dGame/dComponents/ControllablePhysicsComponent.h @@ -276,7 +276,7 @@ public: * The speed boosts of this component. * @return All active Speed boosts for this component. */ - std::vector GetActiveSpeedboosts() { return m_ActivePickupRadiusScales; }; + std::vector GetActiveSpeedboosts() { return m_ActiveSpeedBoosts; }; /** * Activates the Bubble Buff