From af8bc2c4581635ffb9b521d0017d697fa181720f Mon Sep 17 00:00:00 2001 From: David Markowitz Date: Sat, 5 Aug 2023 01:21:59 -0700 Subject: [PATCH] refactor to class style and not c style --- .../Tables/CDMovingPlatformComponentTable.cpp | 4 +- dGame/EntityManager.cpp | 2 +- dGame/dComponents/MovingPlatformComponent.cpp | 281 +++------- dGame/dComponents/MovingPlatformComponent.h | 110 ++-- dGame/dGameMessages/GameMessages.cpp | 62 +-- .../02_server/Map/njhub/CavePrisonCage.cpp | 5 +- dZoneManager/Zone.h | 1 + tests/dGameTests/GameDependencies.cpp | 25 + tests/dGameTests/GameDependencies.h | 25 +- .../MovingPlatformComponentTests.cpp | 497 ++++++++---------- 10 files changed, 406 insertions(+), 606 deletions(-) diff --git a/dDatabase/Tables/CDMovingPlatformComponentTable.cpp b/dDatabase/Tables/CDMovingPlatformComponentTable.cpp index af1aaa7a..f4331eb2 100644 --- a/dDatabase/Tables/CDMovingPlatformComponentTable.cpp +++ b/dDatabase/Tables/CDMovingPlatformComponentTable.cpp @@ -1,7 +1,7 @@ #include "CDMovingPlatformComponentTable.h" CDMovingPlatformComponentTable::CDMovingPlatformComponentTable() { - auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM MovementAIComponent"); + auto tableData = CDClientDatabase::ExecuteQuery("SELECT * FROM MovingPlatforms"); while (!tableData.eof()) { CDMovingPlatformTableEntry entry; entry.platformIsSimpleMover = tableData.getIntField("platformIsSimpleMover", 0) == 1; @@ -17,7 +17,7 @@ CDMovingPlatformComponentTable::CDMovingPlatformComponentTable() { } void CDMovingPlatformComponentTable::CachePlatformEntry(ComponentID id) { - auto query = CDClientDatabase::CreatePreppedStmt("SELECT * FROM MovementAIComponent WHERE id = ?;"); + auto query = CDClientDatabase::CreatePreppedStmt("SELECT * FROM MovingPlatforms WHERE id = ?;"); query.bind(1, static_cast(id)); auto tableData = query.execQuery(); diff --git a/dGame/EntityManager.cpp b/dGame/EntityManager.cpp index 28b5f526..4f1b7373 100644 --- a/dGame/EntityManager.cpp +++ b/dGame/EntityManager.cpp @@ -313,7 +313,7 @@ Entity* EntityManager::GetSpawnPointEntity(const std::string& spawnName) const { // Check if the spawn point entity is valid just in case return GetEntity(spawnPoint->second); } - +#include const std::unordered_map& EntityManager::GetSpawnPointEntities() const { return m_SpawnPoints; } diff --git a/dGame/dComponents/MovingPlatformComponent.cpp b/dGame/dComponents/MovingPlatformComponent.cpp index 1ef7d935..01680bef 100644 --- a/dGame/dComponents/MovingPlatformComponent.cpp +++ b/dGame/dComponents/MovingPlatformComponent.cpp @@ -19,24 +19,31 @@ //------------- PlatformSubComponent begin -------------- PlatformSubComponent::PlatformSubComponent(MovingPlatformComponent* parentComponent) { - m_Position = NiPoint3::ZERO; + DluAssert(parentComponent != nullptr); m_ParentComponent = parentComponent; + m_Position = parentComponent->GetParent()->GetPosition(); + m_Rotation = parentComponent->GetParent()->GetRotation(); m_State = eMovementPlatformState::Stopped | eMovementPlatformState::ReachedDesiredWaypoint; - m_DesiredWaypointIndex = 0; + m_DesiredWaypointIndex = -1; + m_PercentUntilNextWaypoint = 0.0f; + m_CurrentWaypointIndex = 0; + m_NextWaypointIndex = -1; + m_IdleTimeElapsed = 0.0f; + m_Speed = 0.0f; + m_WaitTime = 0.0f; + m_MoveTimeElapsed = 0.0f; + m_IsDirty = false; m_InReverse = false; m_ShouldStopAtDesiredWaypoint = false; - - m_PercentUntilNextWaypoint = 0.0f; - - m_CurrentWaypointIndex = 0; - m_NextWaypointIndex = 0; - - m_IdleTimeElapsed = 0.0f; + m_LinearVelocity = NiPoint3::ZERO; + m_AngularVelocity = NiPoint3::ZERO; + m_TimeBasedMovement = false; + m_Path = nullptr; } void PlatformSubComponent::Update(float deltaTime) { - if (m_State == 0) return; + if (m_State == 0 || !m_Path) return; if (m_State & eMovementPlatformState::Travelling) { m_MoveTimeElapsed += deltaTime; @@ -44,13 +51,34 @@ void PlatformSubComponent::Update(float deltaTime) { // Unfortunately for the poor client, they chose to, instead of change the speed once at the start of the waypoint, // the speed is changed over the course of the waypoint. This means we have to recalculate the linear velocity every frame. // yay. - if (GetCurrentWaypoint().movingPlatform.speed != GetNextWaypoint().movingPlatform.speed) { + if (m_Speed == 0.0f || (GetCurrentWaypoint().movingPlatform.speed != GetNextWaypoint().movingPlatform.speed)) { UpdateLinearVelocity(); + m_IsDirty = true; } m_Position += m_LinearVelocity * deltaTime; + if (CalculatePercentToNextWaypoint() > 0.99) { + m_MoveTimeElapsed = 0; + m_ParentComponent->GetParent()->SetPosition(m_Position); + m_InReverse ? AdvanceToNextReverseWaypoint() : AdvanceToNextWaypoint(); + m_IsDirty = true; + Game::entityManager->SerializeEntity(m_ParentComponent->GetParent()); + } } } +float PlatformSubComponent::CalculatePercentToNextWaypoint() { + if (m_TimeBasedMovement) return 0; + float distanceToNextWaypoint = (GetNextWaypoint().position - GetCurrentWaypoint().position).Length(); + if (distanceToNextWaypoint == 0.0f) return 0; + float distanceToCurrentWaypoint = (m_Position - GetCurrentWaypoint().position).Length(); + return distanceToCurrentWaypoint / distanceToNextWaypoint; +} + +void PlatformSubComponent::UpdateAngularVelocity() { + // Update the angular velocity + // This one is sure to be fun... +} + void PlatformSubComponent::UpdateLinearVelocity() { m_LinearVelocity = CalculateLinearVelocity(); } @@ -58,6 +86,8 @@ void PlatformSubComponent::UpdateLinearVelocity() { void PlatformSubComponent::AdvanceToNextWaypoint() { uint32_t numWaypoints = m_Path->pathWaypoints.size(); m_CurrentWaypointIndex = m_NextWaypointIndex; + m_ParentComponent->GetParent()->SetPosition(GetCurrentWaypoint().position); + m_ParentComponent->GetParent()->SetRotation(GetCurrentWaypoint().rotation); uint32_t nextWaypointIndex = m_CurrentWaypointIndex + 1; if (numWaypoints <= nextWaypointIndex) { PathBehavior behavior = m_Path->pathBehavior; @@ -71,11 +101,16 @@ void PlatformSubComponent::AdvanceToNextWaypoint() { } } m_NextWaypointIndex = nextWaypointIndex; + m_DesiredWaypointIndex = nextWaypointIndex; UpdateLinearVelocity(); + UpdateAngularVelocity(); + m_IsDirty = true; } void PlatformSubComponent::AdvanceToNextReverseWaypoint() { uint32_t numWaypoints = m_Path->pathWaypoints.size(); + m_ParentComponent->GetParent()->SetPosition(GetCurrentWaypoint().position); + m_ParentComponent->GetParent()->SetRotation(GetCurrentWaypoint().rotation); m_CurrentWaypointIndex = m_NextWaypointIndex; int32_t nextWaypointIndex = m_CurrentWaypointIndex - 1; if (nextWaypointIndex < 0) { @@ -90,11 +125,15 @@ void PlatformSubComponent::AdvanceToNextReverseWaypoint() { } } m_NextWaypointIndex = nextWaypointIndex; + m_DesiredWaypointIndex = nextWaypointIndex; UpdateLinearVelocity(); + UpdateAngularVelocity(); + m_IsDirty = true; } void PlatformSubComponent::SetupPath(const std::string& pathName, uint32_t startingWaypointIndex, bool startsInReverse) { m_Path = Game::zoneManager->GetZone()->GetPath(pathName); + Game::logger->Log("MovingPlatformComponent", "setting up path %s", pathName.c_str()); if (!m_Path) { Game::logger->Log("MovingPlatformComponent", "Failed to find path (%s)", pathName.c_str()); return; @@ -104,15 +143,13 @@ void PlatformSubComponent::SetupPath(const std::string& pathName, uint32_t start m_TimeBasedMovement = m_Path->movingPlatform.timeBasedMovement; } -const PathWaypoint PlatformSubComponent::GetNextWaypoint() const { +const PathWaypoint& PlatformSubComponent::GetNextWaypoint() const { DluAssert(m_Path != nullptr); - if (m_NextWaypointIndex >= m_Path->pathWaypoints.size()) return PathWaypoint(); return m_Path->pathWaypoints.at(m_NextWaypointIndex); } -const PathWaypoint PlatformSubComponent::GetCurrentWaypoint() const { +const PathWaypoint& PlatformSubComponent::GetCurrentWaypoint() const { DluAssert(m_Path != nullptr); - if (m_CurrentWaypointIndex >= m_Path->pathWaypoints.size()) return PathWaypoint(); return m_Path->pathWaypoints.at(m_CurrentWaypointIndex); } @@ -146,6 +183,7 @@ void PlatformSubComponent::Serialize(RakNet::BitStream* outBitStream, bool bIsIn outBitStream->Write(m_NextWaypointIndex); outBitStream->Write(m_IdleTimeElapsed); outBitStream->Write(m_MoveTimeElapsed); + if (!bIsInitialUpdate) m_IsDirty = false; } @@ -153,6 +191,11 @@ void PlatformSubComponent::StartPathing() { m_State |= eMovementPlatformState::Travelling; m_State &= ~eMovementPlatformState::Stopped; m_State &= ~eMovementPlatformState::Waiting; + m_IsDirty = true; + m_CurrentWaypointIndex = m_ParentComponent->GetStartingWaypointIndex(); + m_InReverse = m_ParentComponent->GetStartsIsInReverse(); + m_NextWaypointIndex = m_InReverse ? m_CurrentWaypointIndex - 1 : m_CurrentWaypointIndex + 1; + Game::entityManager->SerializeEntity(m_ParentComponent->GetParent()); } void PlatformSubComponent::ResumePathing() { @@ -163,11 +206,14 @@ void PlatformSubComponent::ResumePathing() { m_State |= eMovementPlatformState::Waiting; m_State &= ~eMovementPlatformState::Stopped; m_State &= ~eMovementPlatformState::Travelling; + m_IsDirty = true; } else { m_State &= eMovementPlatformState::Waiting; m_State &= eMovementPlatformState::Travelling; m_State &= eMovementPlatformState::Stopped; - // Set the velocities + m_IsDirty = true; + UpdateLinearVelocity(); + UpdateAngularVelocity(); } } @@ -266,7 +312,7 @@ SimpleMoverPlatformSubComponent::SimpleMoverPlatformSubComponent(MovingPlatformC //------------- MovingPlatformComponent begin -------------- MovingPlatformComponent::MovingPlatformComponent(Entity* parent, const std::string& pathName) : Component(parent) { - + m_PathName = GeneralUtils::ASCIIToUTF16(pathName); } void MovingPlatformComponent::LoadDataFromTemplate() { @@ -274,18 +320,23 @@ void MovingPlatformComponent::LoadDataFromTemplate() { } void MovingPlatformComponent::LoadConfigData() { - if (m_Parent->GetVar(u"platformIsSimpleMover")) { - AddMovingPlatform(NiPoint3::ZERO, false); - } if (m_Parent->GetVar(u"platformIsMover")) { AddMovingPlatform(); } + if (m_Parent->GetVar(u"platformIsSimpleMover")) { + AddMovingPlatform(NiPoint3::ZERO, false); + } if (m_Parent->GetVar(u"platformIsRotater")) { AddMovingPlatform(); } m_StartingWaypointIndex = m_Parent->GetVar(u"attached_path_start"); m_StartsIsInReverse = false; m_DirtyPathInfo = true; + m_StartOnload = m_Parent->GetVar(u"startPathingOnLoad"); +} + +void MovingPlatformComponent::Update(float deltaTime) { + std::for_each(m_Platforms.begin(), m_Platforms.end(), [deltaTime](const std::unique_ptr& platform) { platform->Update(deltaTime); }); } void MovingPlatformComponent::Serialize(RakNet::BitStream* outBitStream, bool bIsInitialUpdate, unsigned int& flags) { @@ -326,227 +377,39 @@ void MovingPlatformComponent::OnCompleteRebuild() { } void MovingPlatformComponent::SetMovementState(eMovementPlatformState value) { - // auto* subComponent = static_cast(m_MoverSubComponent); - - // subComponent->mState = value; - - // Game::entityManager->SerializeEntity(m_Parent); } void MovingPlatformComponent::GotoWaypoint(uint32_t index, bool stopAtWaypoint) { - // auto* subComponent = static_cast(m_MoverSubComponent); - - // subComponent->mDesiredWaypointIndex = index; - // subComponent->mNextWaypointIndex = index; - // subComponent->mShouldStopAtDesiredWaypoint = stopAtWaypoint; - - // StartPathing(); } void MovingPlatformComponent::StartPathing() { std::for_each(m_Platforms.begin(), m_Platforms.end(), [](const std::unique_ptr& platform) { platform->StartPathing(); }); - // state == Travelling - // //GameMessages::SendStartPathing(m_Parent); - // m_PathingStopped = false; - - // auto* subComponent = static_cast(m_MoverSubComponent); - - // subComponent->mShouldStopAtDesiredWaypoint = true; - // subComponent->mState = eMovementPlatformState::Stationary; - - // NiPoint3 targetPosition; - - // if (m_Path != nullptr) { - // const auto& currentWaypoint = m_Path->pathWaypoints[subComponent->mCurrentWaypointIndex]; - // const auto& nextWaypoint = m_Path->pathWaypoints[subComponent->mNextWaypointIndex]; - - // subComponent->mPosition = currentWaypoint.position; - // subComponent->mSpeed = currentWaypoint.movingPlatform.speed; - // subComponent->mWaitTime = currentWaypoint.movingPlatform.wait; - - // targetPosition = nextWaypoint.position; - // } else { - // subComponent->mPosition = m_Parent->GetPosition(); - // subComponent->mSpeed = 1.0f; - // subComponent->mWaitTime = 2.0f; - - // targetPosition = m_Parent->GetPosition() + NiPoint3(0.0f, 10.0f, 0.0f); - // } - - // m_Parent->AddCallbackTimer(subComponent->mWaitTime, [this] { - // SetMovementState(eMovementPlatformState::Moving); - // }); - - // const auto travelTime = Vector3::Distance(targetPosition, subComponent->mPosition) / subComponent->mSpeed + 1.5f; - - // const auto travelNext = subComponent->mWaitTime + travelTime; - - // m_Parent->AddCallbackTimer(travelTime, [subComponent, this] { - // for (CppScripts::Script* script : CppScripts::GetEntityScripts(m_Parent)) { - // script->OnWaypointReached(m_Parent, subComponent->mNextWaypointIndex); - // } - // }); - - // m_Parent->AddCallbackTimer(travelNext, [this] { - // ContinuePathing(); - // }); - - // //GameMessages::SendPlatformResync(m_Parent, UNASSIGNED_SYSTEM_ADDRESS); - - // Game::entityManager->SerializeEntity(m_Parent); } void MovingPlatformComponent::ContinuePathing() { - // state == Travelling - // auto* subComponent = static_cast(m_MoverSubComponent); - // subComponent->mState = eMovementPlatformState::Stationary; - - // subComponent->mCurrentWaypointIndex = subComponent->mNextWaypointIndex; - - // NiPoint3 targetPosition; - // uint32_t pathSize; - // PathBehavior behavior; - - // if (m_Path != nullptr) { - // const auto& currentWaypoint = m_Path->pathWaypoints[subComponent->mCurrentWaypointIndex]; - // const auto& nextWaypoint = m_Path->pathWaypoints[subComponent->mNextWaypointIndex]; - - // subComponent->mPosition = currentWaypoint.position; - // subComponent->mSpeed = currentWaypoint.movingPlatform.speed; - // subComponent->mWaitTime = currentWaypoint.movingPlatform.wait; // + 2; - - // pathSize = m_Path->pathWaypoints.size() - 1; - - // behavior = static_cast(m_Path->pathBehavior); - - // targetPosition = nextWaypoint.position; - // } else { - // subComponent->mPosition = m_Parent->GetPosition(); - // subComponent->mSpeed = 1.0f; - // subComponent->mWaitTime = 2.0f; - - // targetPosition = m_Parent->GetPosition() + NiPoint3(0.0f, 10.0f, 0.0f); - - // pathSize = 1; - // behavior = PathBehavior::Loop; - // } - - // if (m_Parent->GetLOT() == 9483) { - // behavior = PathBehavior::Bounce; - // } else { - // return; - // } - - // if (subComponent->mCurrentWaypointIndex >= pathSize) { - // subComponent->mCurrentWaypointIndex = pathSize; - // switch (behavior) { - // case PathBehavior::Once: - // Game::entityManager->SerializeEntity(m_Parent); - // return; - - // case PathBehavior::Bounce: - // subComponent->mInReverse = true; - // break; - - // case PathBehavior::Loop: - // subComponent->mNextWaypointIndex = 0; - // break; - - // default: - // break; - // } - // } else if (subComponent->mCurrentWaypointIndex == 0) { - // subComponent->mInReverse = false; - // } - - // if (subComponent->mInReverse) { - // subComponent->mNextWaypointIndex = subComponent->mCurrentWaypointIndex - 1; - // } else { - // subComponent->mNextWaypointIndex = subComponent->mCurrentWaypointIndex + 1; - // } - - // /* - // subComponent->mNextWaypointIndex = 0; - // subComponent->mCurrentWaypointIndex = 1; - // */ - - // //GameMessages::SendPlatformResync(m_Parent, UNASSIGNED_SYSTEM_ADDRESS); - - // if (subComponent->mCurrentWaypointIndex == subComponent->mDesiredWaypointIndex) { - // // TODO: Send event? - // StopPathing(); - - // return; - // } - - // m_Parent->CancelCallbackTimers(); - - // m_Parent->AddCallbackTimer(subComponent->mWaitTime, [this] { - // SetMovementState(eMovementPlatformState::Moving); - // }); - - // auto travelTime = Vector3::Distance(targetPosition, subComponent->mPosition) / subComponent->mSpeed + 1.5; - - // if (m_Parent->GetLOT() == 9483) { - // travelTime += 20; - // } - - // const auto travelNext = subComponent->mWaitTime + travelTime; - - // m_Parent->AddCallbackTimer(travelTime, [subComponent, this] { - // for (CppScripts::Script* script : CppScripts::GetEntityScripts(m_Parent)) { - // script->OnWaypointReached(m_Parent, subComponent->mNextWaypointIndex); - // } - // }); - - // m_Parent->AddCallbackTimer(travelNext, [this] { - // ContinuePathing(); - // }); - - // Game::entityManager->SerializeEntity(m_Parent); } void MovingPlatformComponent::StopPathing() { - // state == Stopped - //m_Parent->CancelCallbackTimers(); - // auto* subComponent = static_cast(m_MoverSubComponent); - - // m_PathingStopped = true; - - // subComponent->mState = eMovementPlatformState::Stopped; - // subComponent->mDesiredWaypointIndex = -1; - // subComponent->mShouldStopAtDesiredWaypoint = false; - - // Game::entityManager->SerializeEntity(m_Parent); - - //GameMessages::SendPlatformResync(m_Parent, UNASSIGNED_SYSTEM_ADDRESS); } bool MovingPlatformComponent::GetNoAutoStart() const { return false; - // return m_NoAutoStart; } void MovingPlatformComponent::SetNoAutoStart(const bool value) { - // m_NoAutoStart = value; + } void MovingPlatformComponent::WarpToWaypoint(size_t index) { - // const auto& waypoint = m_Path->pathWaypoints[index]; - // m_Parent->SetPosition(waypoint.position); - // m_Parent->SetRotation(waypoint.rotation); - - // Game::entityManager->SerializeEntity(m_Parent); } size_t MovingPlatformComponent::GetLastWaypointIndex() const { return 0; - // return m_Path->pathWaypoints.size() - 1; } //------------- MovingPlatformComponent end -------------- diff --git a/dGame/dComponents/MovingPlatformComponent.h b/dGame/dComponents/MovingPlatformComponent.h index 02904925..fb075622 100644 --- a/dGame/dComponents/MovingPlatformComponent.h +++ b/dGame/dComponents/MovingPlatformComponent.h @@ -42,6 +42,8 @@ enum class eMoverSubComponentType : uint32_t { class MovingPlatformComponent; +// In the context of a platform that is TimeBasedMovement, +// the speed member from the Path is used as the time to go between waypoints. class PlatformSubComponent { public: PlatformSubComponent(MovingPlatformComponent* parentComponent); @@ -56,43 +58,61 @@ public: virtual void StopPathing(); virtual void Update(float deltaTime); float CalculateSpeed() const; - const PathWaypoint GetNextWaypoint() const; - const PathWaypoint GetCurrentWaypoint() const; + const PathWaypoint& GetNextWaypoint() const; + const PathWaypoint& GetCurrentWaypoint() const; void SetupPath(const std::string& pathName, uint32_t startingWaypointIndex, bool startsInReverse); void AdvanceToNextWaypoint(); void AdvanceToNextReverseWaypoint(); NiPoint3 CalculateLinearVelocity(); void UpdateLinearVelocity(); -protected: + void UpdateAngularVelocity(); + float CalculatePercentToNextWaypoint(); -#ifdef _MOVING_PLATFORM_TEST -public: - void _SetPath(const Path* path) { - m_Path = path; - } -#endif - MovingPlatformComponent* m_ParentComponent = nullptr; + // Write all the getters for the below members + bool GetTimeBasedMovement() const { return m_TimeBasedMovement; } + const Path* GetPath() const { return m_Path; } + float GetSpeed() const { return m_Speed; } + float GetWaitTime() const { return m_WaitTime; } + float GetMoveTimeElapsed() const { return m_MoveTimeElapsed; } + float GetPercentUntilNextWaypoint() const { return m_PercentUntilNextWaypoint; } + int32_t GetCurrentWaypointIndex() const { return m_CurrentWaypointIndex; } + int32_t GetNextWaypointIndex() const { return m_NextWaypointIndex; } + bool GetInReverse() const { return m_InReverse; } + bool GetShouldStopAtDesiredWaypoint() const { return m_ShouldStopAtDesiredWaypoint; } + int32_t GetDesiredWaypointIndex() const { return m_DesiredWaypointIndex; } + uint32_t GetState() const { return m_State; } + const NiPoint3& GetPosition() const { return m_Position; } + const NiQuaternion& GetRotation() const { return m_Rotation; } + const NiPoint3& GetLinearVelocity() const { return m_LinearVelocity; } + const NiPoint3& GetAngularVelocity() const { return m_AngularVelocity; } + const MovingPlatformComponent* GetParentComponent() const { return m_ParentComponent; } + const float GetIdleTimeElapsed() const { return m_IdleTimeElapsed; } + + +protected: + MovingPlatformComponent* m_ParentComponent; /** * The state the platform is currently in */ - uint32_t m_State = eMovementPlatformState::Stopped | eMovementPlatformState::ReachedDesiredWaypoint; - int32_t m_DesiredWaypointIndex = 0; - float m_PercentUntilNextWaypoint = 0; + uint32_t m_State; + int32_t m_DesiredWaypointIndex; + float m_PercentUntilNextWaypoint; NiPoint3 m_Position; int32_t m_CurrentWaypointIndex; int32_t m_NextWaypointIndex; - float m_IdleTimeElapsed = 0; - float m_Speed = 0; - float m_WaitTime = 0; - float m_MoveTimeElapsed = 0; - bool m_IsDirty = false; - bool m_InReverse = false; - bool m_ShouldStopAtDesiredWaypoint = false; + float m_IdleTimeElapsed; + float m_Speed; + float m_WaitTime; + float m_MoveTimeElapsed; + bool m_IsDirty; + bool m_InReverse; + bool m_ShouldStopAtDesiredWaypoint; NiPoint3 m_LinearVelocity; NiPoint3 m_AngularVelocity; - bool m_TimeBasedMovement = false; - const Path* m_Path = nullptr; + bool m_TimeBasedMovement; + const Path* m_Path; + NiQuaternion m_Rotation; }; class MoverPlatformSubComponent : public PlatformSubComponent { @@ -146,6 +166,7 @@ public: void LoadDataFromTemplate(); void LoadConfigData(); + void Update(float deltaTime) override; void Serialize(RakNet::BitStream* outBitStream, bool bIsInitialUpdate, unsigned int& flags); @@ -228,23 +249,32 @@ public: } } - int32_t GetComponentId() const { return componentId; } + bool HasPlatform() { return !m_Platforms.empty(); } -#ifdef _MOVING_PLATFORM_TEST - /** - * Only used for testing. Do not call in production code. Let the constructor take care of this. - * - * @param platformSubComponent - */ - void _AddPlatformSubComponent(std::unique_ptr platformSubComponent) { - m_Platforms.push_back(std::move(platformSubComponent)); + const PlatformSubComponent& GetPlatform() const { + return *m_Platforms.at(0); } - void _SetPath(const std::u16string& path) { - m_PathName = path; - m_DirtyPathInfo = true; -} -#endif + int32_t GetComponentId() const { return componentId; } + + // Make + const std::u16string& GetPathName() const { return m_PathName; } + void SetPathName(const std::u16string& pathName) { m_PathName = pathName; } + + bool GetPathingStopped() const { return m_PathingStopped; } + void SetPathingStopped(bool value) { m_PathingStopped = value; } + + uint32_t GetStartingWaypointIndex() const { return m_StartingWaypointIndex; } + void SetStartingWaypointIndex(uint32_t value) { m_StartingWaypointIndex = value; } + + bool GetStartsIsInReverse() const { return m_StartsIsInReverse; } + void SetStartsIsInReverse(bool value) { m_StartsIsInReverse = value; } + + bool GetStartOnload() const { return m_StartOnload; } + void SetStartOnload(bool value) { m_StartOnload = value; } + + bool GetDirtyPathInfo() const { return m_DirtyPathInfo; } + private: /** * The name of the path this platform is currently on @@ -260,7 +290,7 @@ private: bool m_StartsIsInReverse = false; - int32_t componentId = -1;; + int32_t componentId = -1; /** * The mover sub component that belongs to this platform @@ -272,12 +302,8 @@ private: */ bool m_NoAutoStart; - /** - * Whether to serialize the entity on the next update - */ - bool m_Serialize = false; - bool m_DirtyPathInfo = false; + bool m_StartOnload = false; }; #endif // MOVINGPLATFORMCOMPONENT_H diff --git a/dGame/dGameMessages/GameMessages.cpp b/dGame/dGameMessages/GameMessages.cpp index ee21006e..19557019 100644 --- a/dGame/dGameMessages/GameMessages.cpp +++ b/dGame/dGameMessages/GameMessages.cpp @@ -357,48 +357,35 @@ void GameMessages::SendPlatformResync(Entity* entity, const SystemAddress& sysAd const auto lot = entity->GetLOT(); - if (lot == 12341 || lot == 5027 || lot == 5028 || lot == 14335 || lot == 14447 || lot == 14449) { - iDesiredWaypointIndex = 0; - iIndex = 0; - nextIndex = 0; - bStopAtDesiredWaypoint = true; - movementState = static_cast( - eMovementPlatformState::Waiting | eMovementPlatformState::ReachedDesiredWaypoint | eMovementPlatformState::ReachedFinalWaypoint); - } - bitStream.Write(entity->GetObjectID()); bitStream.Write((uint16_t)eGameMessageType::PLATFORM_RESYNC); - bool bReverse = false; - int eCommand = 0; - int eUnexpectedCommand = 0; - float fIdleTimeElapsed = 0.0f; - float fMoveTimeElapsed = 0.0f; - float fPercentBetweenPoints = 0.0f; - NiPoint3 ptUnexpectedLocation = NiPoint3::ZERO; - NiQuaternion qUnexpectedRotation = NiQuaternion::IDENTITY; + auto* movingPlatformComponent = entity->GetComponent(); + if (!movingPlatformComponent) return; + if (!movingPlatformComponent->HasPlatform()) return; + auto& subComponent = movingPlatformComponent->GetPlatform(); - bitStream.Write(bReverse); - bitStream.Write(bStopAtDesiredWaypoint); - bitStream.Write(eCommand); - bitStream.Write(static_cast(movementState)); - bitStream.Write(eUnexpectedCommand); - bitStream.Write(fIdleTimeElapsed); - bitStream.Write(fMoveTimeElapsed); - bitStream.Write(fPercentBetweenPoints); - bitStream.Write(iDesiredWaypointIndex); - bitStream.Write(iIndex); - bitStream.Write(nextIndex); - bitStream.Write(ptUnexpectedLocation.x); - bitStream.Write(ptUnexpectedLocation.y); - bitStream.Write(ptUnexpectedLocation.z); + bitStream.Write(subComponent.GetInReverse()); + bitStream.Write(subComponent.GetShouldStopAtDesiredWaypoint()); + bitStream.Write(0); + bitStream.Write(subComponent.GetState()); + bitStream.Write(0); + bitStream.Write(subComponent.GetIdleTimeElapsed()); + bitStream.Write(subComponent.GetMoveTimeElapsed()); + bitStream.Write(subComponent.GetPercentUntilNextWaypoint()); + bitStream.Write(subComponent.GetDesiredWaypointIndex()); + bitStream.Write(subComponent.GetCurrentWaypointIndex()); + bitStream.Write(subComponent.GetNextWaypointIndex()); + bitStream.Write(subComponent.GetPosition().x); + bitStream.Write(subComponent.GetPosition().y); + bitStream.Write(subComponent.GetPosition().z); - bitStream.Write(qUnexpectedRotation != NiQuaternion::IDENTITY); - if (qUnexpectedRotation != NiQuaternion::IDENTITY) { - bitStream.Write(qUnexpectedRotation.x); - bitStream.Write(qUnexpectedRotation.y); - bitStream.Write(qUnexpectedRotation.z); - bitStream.Write(qUnexpectedRotation.w); + bitStream.Write(subComponent.GetRotation() != NiQuaternion::IDENTITY); + if (subComponent.GetRotation() != NiQuaternion::IDENTITY) { + bitStream.Write(subComponent.GetRotation().x); + bitStream.Write(subComponent.GetRotation().y); + bitStream.Write(subComponent.GetRotation().z); + bitStream.Write(subComponent.GetRotation().w); } SEND_PACKET_BROADCAST; @@ -5006,7 +4993,6 @@ void GameMessages::HandleFireEventServerSide(RakNet::BitStream* inStream, Entity } void GameMessages::HandleRequestPlatformResync(RakNet::BitStream* inStream, Entity* entity, const SystemAddress& sysAddr) { - if (entity->GetLOT() == 6267 || entity->GetLOT() == 16141) return; GameMessages::SendPlatformResync(entity, sysAddr, eMovementPlatformState::Travelling); } diff --git a/dScripts/02_server/Map/njhub/CavePrisonCage.cpp b/dScripts/02_server/Map/njhub/CavePrisonCage.cpp index 9bd89067..0f8cdd3f 100644 --- a/dScripts/02_server/Map/njhub/CavePrisonCage.cpp +++ b/dScripts/02_server/Map/njhub/CavePrisonCage.cpp @@ -5,6 +5,7 @@ #include "Character.h" #include "dZoneManager.h" #include "RenderComponent.h" +#include "MovingPlatformComponent.h" void CavePrisonCage::OnStartup(Entity* self) { const auto& myNum = self->GetVar(u"myNumber"); @@ -83,8 +84,8 @@ void CavePrisonCage::SpawnCounterweight(Entity* self, Spawner* spawner) { return; } - // Move the counterweight down 2 units - counterweight->SetPosition(counterweight->GetPosition() + NiPoint3(0, -2, 0)); + auto* mpc = counterweight->GetComponent(); + if (mpc) mpc->StartPathing(); // Serialize the counterweight Game::entityManager->SerializeEntity(counterweight); diff --git a/dZoneManager/Zone.h b/dZoneManager/Zone.h index b3e72036..798cab65 100644 --- a/dZoneManager/Zone.h +++ b/dZoneManager/Zone.h @@ -203,6 +203,7 @@ public: const void PrintAllGameObjects(); LUTriggers::Trigger* GetTrigger(uint32_t sceneID, uint32_t triggerID); const Path* GetPath(std::string name) const; + void AddPath(const Path& path) { m_Paths.push_back(path); }; uint32_t GetWorldID() const { return m_WorldID; } [[nodiscard]] std::string GetZoneName() const { return m_ZoneName; } diff --git a/tests/dGameTests/GameDependencies.cpp b/tests/dGameTests/GameDependencies.cpp index 1765bd9b..11b34198 100644 --- a/tests/dGameTests/GameDependencies.cpp +++ b/tests/dGameTests/GameDependencies.cpp @@ -12,3 +12,28 @@ namespace Game { SystemAddress chatSysAddr; EntityManager* entityManager = nullptr; } + +void GameDependenciesTest::SetUpDependencies() { + info.pos = NiPoint3::ZERO; + info.rot = NiQuaternion::IDENTITY; + info.scale = 1.0f; + info.spawner = nullptr; + info.lot = 999; + Game::logger = new dLogger("./testing.log", true, true); + Game::server = new dServerMock(); + Game::config = new dConfig("worldconfig.ini"); + Game::entityManager = new EntityManager(); + Game::zoneManager = new dZoneManager(); + Game::zoneManager->LoadZone(LWOZONEID(0, 0, 0)); +} + +void GameDependenciesTest::TearDownDependencies() { + if (Game::server) delete Game::server; + if (Game::entityManager) delete Game::entityManager; + if (Game::config) delete Game::config; + if (Game::zoneManager) delete Game::zoneManager; + if (Game::logger) { + Game::logger->Flush(); + delete Game::logger; + } +} diff --git a/tests/dGameTests/GameDependencies.h b/tests/dGameTests/GameDependencies.h index 95ef2f9f..205b8f74 100644 --- a/tests/dGameTests/GameDependencies.h +++ b/tests/dGameTests/GameDependencies.h @@ -6,6 +6,7 @@ #include "dServer.h" #include "EntityInfo.h" #include "EntityManager.h" +#include "dZoneManager.h" #include "dConfig.h" #include @@ -23,29 +24,11 @@ public: class GameDependenciesTest : public ::testing::Test { protected: - void SetUpDependencies() { - info.pos = NiPoint3::ZERO; - info.rot = NiQuaternion::IDENTITY; - info.scale = 1.0f; - info.spawner = nullptr; - info.lot = 999; - Game::logger = new dLogger("./testing.log", true, true); - Game::server = new dServerMock(); - Game::config = new dConfig("worldconfig.ini"); - Game::entityManager = new EntityManager(); - } + void SetUpDependencies(); - void TearDownDependencies() { - if (Game::server) delete Game::server; - if (Game::entityManager) delete Game::entityManager; - if (Game::logger) { - Game::logger->Flush(); - delete Game::logger; - } - if (Game::config) delete Game::config; - } + void TearDownDependencies(); - EntityInfo info{}; + EntityInfo info; }; #endif //!__GAMEDEPENDENCIES__H__ diff --git a/tests/dGameTests/dComponentsTests/MovingPlatformComponentTests.cpp b/tests/dGameTests/dComponentsTests/MovingPlatformComponentTests.cpp index 00a7608c..1ce8c687 100644 --- a/tests/dGameTests/dComponentsTests/MovingPlatformComponentTests.cpp +++ b/tests/dGameTests/dComponentsTests/MovingPlatformComponentTests.cpp @@ -21,6 +21,7 @@ protected: SetUpDependencies(); path.movingPlatform.timeBasedMovement = false; path.pathBehavior = PathBehavior::Once; + path.pathName = "ExamplePath"; PathWaypoint waypointStart; waypointStart.position = NiPoint3(1, 2, 3); waypointStart.rotation = NiQuaternion(4, 5, 6, 7); @@ -37,219 +38,38 @@ protected: path.pathWaypoints.push_back(waypointMiddle); path.pathWaypoints.push_back(waypointEnd); + Game::zoneManager->GetZone()->AddPath(path); + + // Set our starting position + info.pos = NiPoint3(25, 26, 27); + info.rot = NiQuaternion(28, 29, 30, 31); + + // Simple mover data + info.settings.push_back(new LDFData(u"platformMoveX", 23)); + info.settings.push_back(new LDFData(u"platformMoveY", 453)); + info.settings.push_back(new LDFData(u"platformMoveZ", 523)); + info.settings.push_back(new LDFData(u"platformMoveTime", 5724)); + info.settings.push_back(new LDFData(u"platformStartAtEnd", true)); + info.settings.push_back(new LDFData(u"dbonly", false)); + info.settings.push_back(new LDFData(u"platformIsMover", true)); + info.settings.push_back(new LDFData(u"platformIsSimpleMover", true)); + info.settings.push_back(new LDFData(u"platformIsRotater", true)); + baseEntity = std::make_unique(15, GameDependenciesTest::info); - baseEntity->SetVar(u"dbonly", false); - baseEntity->SetVar(u"platformMoveX", 23); - baseEntity->SetVar(u"platformMoveY", 453); - baseEntity->SetVar(u"platformMoveZ", 523); - baseEntity->SetVar(u"platformMoveTime", 5724); - baseEntity->SetVar(u"platformStartAtEnd", true); - auto* movingPlatformComponent = new MovingPlatformComponent(baseEntity.get(), ""); + auto* simplePhysicsComponent = new SimplePhysicsComponent(1, baseEntity.get()); - baseEntity->AddComponent(eReplicaComponentType::MOVING_PLATFORM, movingPlatformComponent); - baseEntity->AddComponent(eReplicaComponentType::SIMPLE_PHYSICS, simplePhysicsComponent); - baseEntity->SetPosition(NiPoint3(25, 26, 27)); - baseEntity->SetRotation(NiQuaternion(28, 29, 30, 31)); - auto moverPlatformSubComponent = std::make_unique(movingPlatformComponent); - moverPlatformSubComponent->m_State = eMovementPlatformState::Stopped | eMovementPlatformState::ReachedDesiredWaypoint; - moverPlatformSubComponent->m_DesiredWaypointIndex = 1; - moverPlatformSubComponent->m_PercentUntilNextWaypoint = 2; - moverPlatformSubComponent->m_Position = NiPoint3(3, 4, 5); - moverPlatformSubComponent->m_CurrentWaypointIndex = 6; - moverPlatformSubComponent->m_NextWaypointIndex = 7; - moverPlatformSubComponent->m_IdleTimeElapsed = 8; - moverPlatformSubComponent->m_MoveTimeElapsed = 11; - moverPlatformSubComponent->m_IsDirty = true; - moverPlatformSubComponent->m_InReverse = true; - moverPlatformSubComponent->m_ShouldStopAtDesiredWaypoint = true; - - auto rotatorPlatformSubComponent = std::make_unique(movingPlatformComponent); - rotatorPlatformSubComponent->m_State = eMovementPlatformState::Travelling; - rotatorPlatformSubComponent->m_DesiredWaypointIndex = 12; - rotatorPlatformSubComponent->m_PercentUntilNextWaypoint = 13; - rotatorPlatformSubComponent->m_Position = NiPoint3(14, 15, 16); - rotatorPlatformSubComponent->m_CurrentWaypointIndex = 17; - rotatorPlatformSubComponent->m_NextWaypointIndex = 18; - rotatorPlatformSubComponent->m_IdleTimeElapsed = 19; - rotatorPlatformSubComponent->m_MoveTimeElapsed = 22; - rotatorPlatformSubComponent->m_IsDirty = true; - rotatorPlatformSubComponent->m_InReverse = true; - rotatorPlatformSubComponent->m_ShouldStopAtDesiredWaypoint = true; - - auto simpleMoverPlatformSubComponent = std::make_unique(movingPlatformComponent, NiPoint3(), true); - simpleMoverPlatformSubComponent->m_State = eMovementPlatformState::Waiting | eMovementPlatformState::ReachedDesiredWaypoint | eMovementPlatformState::ReachedFinalWaypoint; - simpleMoverPlatformSubComponent->m_DesiredWaypointIndex = 23; - simpleMoverPlatformSubComponent->m_PercentUntilNextWaypoint = 24; - simpleMoverPlatformSubComponent->m_CurrentWaypointIndex = 28; - simpleMoverPlatformSubComponent->m_NextWaypointIndex = 29; - simpleMoverPlatformSubComponent->m_IdleTimeElapsed = 30; - simpleMoverPlatformSubComponent->m_MoveTimeElapsed = 33; - simpleMoverPlatformSubComponent->m_IsDirty = true; - simpleMoverPlatformSubComponent->m_InReverse = true; - simpleMoverPlatformSubComponent->m_DirtyStartingPoint = true; - simpleMoverPlatformSubComponent->m_HasStartingPoint = true; - simpleMoverPlatformSubComponent->m_ShouldStopAtDesiredWaypoint = true; - simpleMoverPlatformSubComponent->LoadConfigData(); - - movingPlatformComponent->_AddPlatformSubComponent(std::move(moverPlatformSubComponent)); - movingPlatformComponent->_AddPlatformSubComponent(std::move(rotatorPlatformSubComponent)); - movingPlatformComponent->_AddPlatformSubComponent(std::move(simpleMoverPlatformSubComponent)); - movingPlatformComponent->_SetPath(u"ExamplePath"); + baseEntity->AddComponent(SimplePhysicsComponent::ComponentType, simplePhysicsComponent); + auto* movingPlatformComponent = new MovingPlatformComponent(baseEntity.get(), path.pathName); + movingPlatformComponent->LoadConfigData(); + movingPlatformComponent->LoadDataFromTemplate(); + baseEntity->AddComponent(MovingPlatformComponent::ComponentType, movingPlatformComponent); } void TearDown() override { TearDownDependencies(); } - void TestSerialization() { - auto* movingPlatformComponent = baseEntity->GetComponent(); - ASSERT_NE(movingPlatformComponent, nullptr); - uint32_t flags = 0; - movingPlatformComponent->Serialize(&bitStream, true, flags); - // read in the full BitStream and check the values match what they were set to above - bool hasPlatformSubComponents = false; - bitStream.Read(hasPlatformSubComponents); - ASSERT_TRUE(hasPlatformSubComponents); - - bool dirtyPathInfo; - bitStream.Read(dirtyPathInfo); - ASSERT_TRUE(dirtyPathInfo); - - bool hasPath; - bitStream.Read(hasPath); - ASSERT_TRUE(hasPath); - - std::u16string pathName; - uint16_t pathNameLength; - bitStream.Read(pathNameLength); - pathName.resize(pathNameLength); - bitStream.ReadBits(reinterpret_cast(pathName.data()), BYTES_TO_BITS(pathNameLength) * 2); - ASSERT_EQ(pathName, u"ExamplePath"); - - uint32_t pathStartIndex; - bitStream.Read(pathStartIndex); - ASSERT_EQ(pathStartIndex, 0); - - bool isInReverse; - bitStream.Read(isInReverse); - ASSERT_FALSE(isInReverse); - - bool hasPlatformData; - bitStream.Read(hasPlatformData); - ASSERT_TRUE(hasPlatformData); - - eMoverSubComponentType platformType; - bitStream.Read(platformType); - ASSERT_EQ(platformType, eMoverSubComponentType::Mover); - - bool isDirty; - bitStream.Read(isDirty); - ASSERT_TRUE(isDirty); - - eMovementPlatformState state; - bitStream.Read(state); - ASSERT_EQ(state, eMovementPlatformState::Stopped | eMovementPlatformState::ReachedDesiredWaypoint); - - int32_t desiredWaypointIndex; - bitStream.Read(desiredWaypointIndex); - ASSERT_EQ(desiredWaypointIndex, 1); - - bool shouldStopAtDesiredWaypoint; - bitStream.Read(shouldStopAtDesiredWaypoint); - ASSERT_TRUE(shouldStopAtDesiredWaypoint); - - bool isInReverse2; - bitStream.Read(isInReverse2); - ASSERT_TRUE(isInReverse2); - - float percentBetweenPoints; - bitStream.Read(percentBetweenPoints); - ASSERT_EQ(percentBetweenPoints, 2); - - NiPoint3 position; - bitStream.Read(position.x); - bitStream.Read(position.y); - bitStream.Read(position.z); - ASSERT_EQ(position, NiPoint3(3, 4, 5)); - - uint32_t currentWaypointIndex; - bitStream.Read(currentWaypointIndex); - ASSERT_EQ(currentWaypointIndex, 6); - - uint32_t nextWaypointIndex; - bitStream.Read(nextWaypointIndex); - ASSERT_EQ(nextWaypointIndex, 7); - - float idleTimeElapsed; - bitStream.Read(idleTimeElapsed); - ASSERT_EQ(idleTimeElapsed, 8); - - float moveTimeElapsed; - bitStream.Read(moveTimeElapsed); - ASSERT_EQ(moveTimeElapsed, 11); - - bool hasPlatformData2; - bitStream.Read(hasPlatformData2); - ASSERT_TRUE(hasPlatformData2); - - eMoverSubComponentType platformType2; - bitStream.Read(platformType2); - ASSERT_EQ(platformType2, eMoverSubComponentType::Rotator); - - bool isDirty2; - bitStream.Read(isDirty2); - ASSERT_TRUE(isDirty2); - - eMovementPlatformState state2; - bitStream.Read(state2); - ASSERT_EQ(state2, eMovementPlatformState::Travelling); - - int32_t desiredWaypointIndex2; - bitStream.Read(desiredWaypointIndex2); - ASSERT_EQ(desiredWaypointIndex2, 12); - - bool shouldStopAtDesiredWaypoint2; - bitStream.Read(shouldStopAtDesiredWaypoint2); - ASSERT_TRUE(shouldStopAtDesiredWaypoint2); - - bool isInReverse3; - bitStream.Read(isInReverse3); - ASSERT_TRUE(isInReverse3); - - float percentBetweenPoints2; - bitStream.Read(percentBetweenPoints2); - ASSERT_EQ(percentBetweenPoints2, 13); - - NiPoint3 position2; - bitStream.Read(position2.x); - bitStream.Read(position2.y); - bitStream.Read(position2.z); - ASSERT_EQ(position2, NiPoint3(14, 15, 16)); - - uint32_t currentWaypointIndex2; - bitStream.Read(currentWaypointIndex2); - ASSERT_EQ(currentWaypointIndex2, 17); - - uint32_t nextWaypointIndex2; - bitStream.Read(nextWaypointIndex2); - ASSERT_EQ(nextWaypointIndex2, 18); - - float idleTimeElapsed2; - bitStream.Read(idleTimeElapsed2); - ASSERT_EQ(idleTimeElapsed2, 19); - - float moveTimeElapsed2; - bitStream.Read(moveTimeElapsed2); - ASSERT_EQ(moveTimeElapsed2, 22); - - bool hasPlatformData3; - bitStream.Read(hasPlatformData3); - ASSERT_TRUE(hasPlatformData3); - - eMoverSubComponentType platformType3; - bitStream.Read(platformType3); - ASSERT_EQ(platformType3, eMoverSubComponentType::SimpleMover); - + void DeserializeSimpleMoverPlatformSubComponent() { bool dirtyStartingPoint; bitStream.Read(dirtyStartingPoint); ASSERT_TRUE(dirtyStartingPoint); @@ -271,25 +91,133 @@ protected: bitStream.Read(startingRotation.z); ASSERT_EQ(startingRotation, NiQuaternion(28, 29, 30, 31)); - bool isDirty4; - bitStream.Read(isDirty4); - ASSERT_TRUE(isDirty4); + bool isDirty; + bitStream.Read(isDirty); + ASSERT_TRUE(isDirty); - eMovementPlatformState state3; - bitStream.Read(state3); - ASSERT_EQ(state3, eMovementPlatformState::Waiting | eMovementPlatformState::ReachedDesiredWaypoint | eMovementPlatformState::ReachedFinalWaypoint); + eMovementPlatformState state; + bitStream.Read(state); + ASSERT_EQ(state, eMovementPlatformState::Stopped | eMovementPlatformState::ReachedDesiredWaypoint); + + int32_t currentWaypointIndex; + bitStream.Read(currentWaypointIndex); + ASSERT_EQ(currentWaypointIndex, 0); - int32_t currentWaypointIndex3; - bitStream.Read(currentWaypointIndex3); - ASSERT_EQ(currentWaypointIndex3, 28); + bool isInReverse; + bitStream.Read(isInReverse); + ASSERT_FALSE(isInReverse); + } - bool isInReverse4; - bitStream.Read(isInReverse4); - ASSERT_TRUE(isInReverse4); + void DeserializeMovingPlatformSubComponent() { + bool isDirty; + ASSERT_TRUE(bitStream.Read(isDirty)); + ASSERT_TRUE(isDirty); - bool hasPlatformSubComponents2; - bitStream.Read(hasPlatformSubComponents2); - ASSERT_FALSE(hasPlatformSubComponents2); + eMovementPlatformState state; + ASSERT_TRUE(bitStream.Read(state)); + ASSERT_EQ(state, eMovementPlatformState::Stopped | eMovementPlatformState::ReachedDesiredWaypoint); + + int32_t desiredWaypointIndex; + ASSERT_TRUE(bitStream.Read(desiredWaypointIndex)); + ASSERT_EQ(desiredWaypointIndex, -1); + + bool shouldStopAtDesiredWaypoint; + ASSERT_TRUE(bitStream.Read(shouldStopAtDesiredWaypoint)); + ASSERT_FALSE(shouldStopAtDesiredWaypoint); + + bool isInReverse2; + ASSERT_TRUE(bitStream.Read(isInReverse2)); + ASSERT_FALSE(isInReverse2); + + float percentBetweenPoints; + ASSERT_TRUE(bitStream.Read(percentBetweenPoints)); + ASSERT_EQ(percentBetweenPoints, 0); + + NiPoint3 position; + ASSERT_TRUE(bitStream.Read(position.x)); + ASSERT_TRUE(bitStream.Read(position.y)); + ASSERT_TRUE(bitStream.Read(position.z)); + ASSERT_EQ(position, NiPoint3(25, 26, 27)); + + uint32_t currentWaypointIndex; + ASSERT_TRUE(bitStream.Read(currentWaypointIndex)); + ASSERT_EQ(currentWaypointIndex, 0); + + uint32_t nextWaypointIndex; + ASSERT_TRUE(bitStream.Read(nextWaypointIndex)); + ASSERT_EQ(nextWaypointIndex, -1); + + float idleTimeElapsed; + ASSERT_TRUE(bitStream.Read(idleTimeElapsed)); + ASSERT_FLOAT_EQ(idleTimeElapsed, 0.0f); + + float moveTimeElapsed; + ASSERT_TRUE(bitStream.Read(moveTimeElapsed)); + ASSERT_FLOAT_EQ(moveTimeElapsed, 0.0f); + } + + void DeserializeMovingPlatformComponent() { + // read in the full BitStream and check the values match what they were set to above + bool hasPlatformSubComponents = false; + ASSERT_TRUE(bitStream.Read(hasPlatformSubComponents)); + ASSERT_TRUE(hasPlatformSubComponents); + + bool dirtyPathInfo; + ASSERT_TRUE(bitStream.Read(dirtyPathInfo)); + ASSERT_TRUE(dirtyPathInfo); + + bool hasPath; + ASSERT_TRUE(bitStream.Read(hasPath)); + ASSERT_TRUE(hasPath); + + std::u16string pathName; + uint16_t pathNameLength; + ASSERT_TRUE(bitStream.Read(pathNameLength)); + pathName.resize(pathNameLength); + ASSERT_TRUE(bitStream.ReadBits(reinterpret_cast(pathName.data()), BYTES_TO_BITS(pathNameLength) * 2)); + ASSERT_EQ(pathName, u"ExamplePath"); + + uint32_t pathStartIndex; + ASSERT_TRUE(bitStream.Read(pathStartIndex)); + ASSERT_EQ(pathStartIndex, 0); + + bool isInReverse; + ASSERT_TRUE(bitStream.Read(isInReverse)); + ASSERT_FALSE(isInReverse); + + bool hasPlatformData; + ASSERT_TRUE(bitStream.Read(hasPlatformData)); + ASSERT_TRUE(hasPlatformData); + + eMoverSubComponentType platformType; + ASSERT_TRUE(bitStream.Read(platformType)); + ASSERT_EQ(platformType, eMoverSubComponentType::Mover); + DeserializeMovingPlatformSubComponent(); + + ASSERT_TRUE(bitStream.Read(hasPlatformData)); + ASSERT_TRUE(hasPlatformData); + + ASSERT_TRUE(bitStream.Read(platformType)); + ASSERT_EQ(platformType, eMoverSubComponentType::SimpleMover); + DeserializeSimpleMoverPlatformSubComponent(); + + ASSERT_TRUE(bitStream.Read(hasPlatformData)); + ASSERT_TRUE(hasPlatformData); + + ASSERT_TRUE(bitStream.Read(platformType)); + ASSERT_EQ(platformType, eMoverSubComponentType::Rotator); + DeserializeMovingPlatformSubComponent(); + + ASSERT_TRUE(bitStream.Read(hasPlatformData)); + ASSERT_FALSE(hasPlatformData); + } + + void TestSerialization() { + auto* movingPlatformComponent = baseEntity->GetComponent(); + ASSERT_NE(movingPlatformComponent, nullptr); + uint32_t flags = 0; + movingPlatformComponent->Serialize(&bitStream, true, flags); + DeserializeMovingPlatformComponent(); } }; @@ -302,89 +230,70 @@ TEST_F(MovingPlatformComponentTests, MovingPlatformSerializationTest) { } TEST_F(MovingPlatformComponentTests, MovingPlatformSubComponentPathAdvanceForwardTest) { - MoverPlatformSubComponent moverPlatformSubComponent(nullptr); - moverPlatformSubComponent._SetPath(&path); - moverPlatformSubComponent.m_CurrentWaypointIndex = 0; - moverPlatformSubComponent.m_NextWaypointIndex = 1; - moverPlatformSubComponent.m_InReverse = false; + MoverPlatformSubComponent moverPlatformSubComponent(baseEntity->GetComponent()); moverPlatformSubComponent.AdvanceToNextWaypoint(); - ASSERT_EQ(moverPlatformSubComponent.m_CurrentWaypointIndex, 1); - ASSERT_EQ(moverPlatformSubComponent.m_NextWaypointIndex, 2); + ASSERT_EQ(moverPlatformSubComponent.GetCurrentWaypointIndex(), 1); + ASSERT_EQ(moverPlatformSubComponent.GetNextWaypointIndex(), 2); moverPlatformSubComponent.AdvanceToNextWaypoint(); - ASSERT_EQ(moverPlatformSubComponent.m_CurrentWaypointIndex, 2); - ASSERT_EQ(moverPlatformSubComponent.m_NextWaypointIndex, 2); - ASSERT_FALSE(moverPlatformSubComponent.m_InReverse); + ASSERT_EQ(moverPlatformSubComponent.GetCurrentWaypointIndex(), 2); + ASSERT_EQ(moverPlatformSubComponent.GetNextWaypointIndex(), 2); + ASSERT_FALSE(moverPlatformSubComponent.GetInReverse()); path.pathBehavior = PathBehavior::Bounce; moverPlatformSubComponent.AdvanceToNextWaypoint(); - ASSERT_EQ(moverPlatformSubComponent.m_CurrentWaypointIndex, 2); - ASSERT_EQ(moverPlatformSubComponent.m_NextWaypointIndex, 1); - ASSERT_TRUE(moverPlatformSubComponent.m_InReverse); + ASSERT_EQ(moverPlatformSubComponent.GetCurrentWaypointIndex(), 2); + ASSERT_EQ(moverPlatformSubComponent.GetNextWaypointIndex(), 1); + ASSERT_TRUE(moverPlatformSubComponent.GetInReverse()); } TEST_F(MovingPlatformComponentTests, MovingPlatformSubComponentPathAdvanceReverseTest) { - MoverPlatformSubComponent moverPlatformSubComponent(nullptr); - moverPlatformSubComponent._SetPath(&path); - moverPlatformSubComponent.m_CurrentWaypointIndex = 2; - moverPlatformSubComponent.m_NextWaypointIndex = 1; - moverPlatformSubComponent.m_InReverse = true; + MoverPlatformSubComponent moverPlatformSubComponent(baseEntity->GetComponent()); moverPlatformSubComponent.AdvanceToNextReverseWaypoint(); - ASSERT_EQ(moverPlatformSubComponent.m_CurrentWaypointIndex, 1); - ASSERT_EQ(moverPlatformSubComponent.m_NextWaypointIndex, 0); - ASSERT_TRUE(moverPlatformSubComponent.m_InReverse); + ASSERT_EQ(moverPlatformSubComponent.GetCurrentWaypointIndex(), 1); + ASSERT_EQ(moverPlatformSubComponent.GetNextWaypointIndex(), 0); + ASSERT_TRUE(moverPlatformSubComponent.GetInReverse()); moverPlatformSubComponent.AdvanceToNextReverseWaypoint(); - ASSERT_EQ(moverPlatformSubComponent.m_CurrentWaypointIndex, 0); - ASSERT_EQ(moverPlatformSubComponent.m_NextWaypointIndex, 0); - ASSERT_TRUE(moverPlatformSubComponent.m_InReverse); + ASSERT_EQ(moverPlatformSubComponent.GetCurrentWaypointIndex(), 0); + ASSERT_EQ(moverPlatformSubComponent.GetNextWaypointIndex(), 0); + ASSERT_TRUE(moverPlatformSubComponent.GetInReverse()); path.pathBehavior = PathBehavior::Bounce; moverPlatformSubComponent.AdvanceToNextWaypoint(); - ASSERT_EQ(moverPlatformSubComponent.m_CurrentWaypointIndex, 0); - ASSERT_EQ(moverPlatformSubComponent.m_NextWaypointIndex, 1); - ASSERT_TRUE(moverPlatformSubComponent.m_InReverse); + ASSERT_EQ(moverPlatformSubComponent.GetCurrentWaypointIndex(), 0); + ASSERT_EQ(moverPlatformSubComponent.GetNextWaypointIndex(), 1); + ASSERT_TRUE(moverPlatformSubComponent.GetInReverse()); } TEST_F(MovingPlatformComponentTests, MovingPlatformSubComponentPathAdvanceTest) { - MoverPlatformSubComponent moverPlatformSubComponent(nullptr); - moverPlatformSubComponent._SetPath(&path); - path.pathBehavior = PathBehavior::Bounce; - moverPlatformSubComponent.m_CurrentWaypointIndex = 0; - moverPlatformSubComponent.m_NextWaypointIndex = 1; - moverPlatformSubComponent.m_InReverse = false; + MoverPlatformSubComponent moverPlatformSubComponent(baseEntity->GetComponent()); moverPlatformSubComponent.AdvanceToNextWaypoint(); - ASSERT_EQ(moverPlatformSubComponent.m_CurrentWaypointIndex, 1); - ASSERT_EQ(moverPlatformSubComponent.m_NextWaypointIndex, 2); - ASSERT_FALSE(moverPlatformSubComponent.m_InReverse); + ASSERT_EQ(moverPlatformSubComponent.GetCurrentWaypointIndex(), 1); + ASSERT_EQ(moverPlatformSubComponent.GetNextWaypointIndex(), 2); + ASSERT_FALSE(moverPlatformSubComponent.GetInReverse()); moverPlatformSubComponent.AdvanceToNextWaypoint(); - ASSERT_EQ(moverPlatformSubComponent.m_CurrentWaypointIndex, 2); - ASSERT_EQ(moverPlatformSubComponent.m_NextWaypointIndex, 1); - ASSERT_TRUE(moverPlatformSubComponent.m_InReverse); + ASSERT_EQ(moverPlatformSubComponent.GetCurrentWaypointIndex(), 2); + ASSERT_EQ(moverPlatformSubComponent.GetNextWaypointIndex(), 1); + ASSERT_TRUE(moverPlatformSubComponent.GetInReverse()); moverPlatformSubComponent.AdvanceToNextReverseWaypoint(); - ASSERT_EQ(moverPlatformSubComponent.m_CurrentWaypointIndex, 1); - ASSERT_EQ(moverPlatformSubComponent.m_NextWaypointIndex, 0); - ASSERT_TRUE(moverPlatformSubComponent.m_InReverse); + ASSERT_EQ(moverPlatformSubComponent.GetCurrentWaypointIndex(), 1); + ASSERT_EQ(moverPlatformSubComponent.GetNextWaypointIndex(), 0); + ASSERT_TRUE(moverPlatformSubComponent.GetInReverse()); moverPlatformSubComponent.AdvanceToNextReverseWaypoint(); - ASSERT_EQ(moverPlatformSubComponent.m_CurrentWaypointIndex, 0); - ASSERT_EQ(moverPlatformSubComponent.m_NextWaypointIndex, 1); - ASSERT_FALSE(moverPlatformSubComponent.m_InReverse); + ASSERT_EQ(moverPlatformSubComponent.GetCurrentWaypointIndex(), 0); + ASSERT_EQ(moverPlatformSubComponent.GetNextWaypointIndex(), 1); + ASSERT_FALSE(moverPlatformSubComponent.GetInReverse()); moverPlatformSubComponent.AdvanceToNextWaypoint(); - ASSERT_EQ(moverPlatformSubComponent.m_CurrentWaypointIndex, 1); - ASSERT_EQ(moverPlatformSubComponent.m_NextWaypointIndex, 2); - ASSERT_FALSE(moverPlatformSubComponent.m_InReverse); + ASSERT_EQ(moverPlatformSubComponent.GetCurrentWaypointIndex(), 1); + ASSERT_EQ(moverPlatformSubComponent.GetNextWaypointIndex(), 2); + ASSERT_FALSE(moverPlatformSubComponent.GetInReverse()); } TEST_F(MovingPlatformComponentTests, MovingPlatformMoverSpeedCalculationTest) { - MoverPlatformSubComponent moverPlatformSubComponent(nullptr); + MoverPlatformSubComponent moverPlatformSubComponent(baseEntity->GetComponent()); path.pathWaypoints.at(0).position = NiPoint3(99.296440, 419.293335, 207.219498); path.pathWaypoints.at(0).movingPlatform.speed = 16.0f; path.pathWaypoints.at(1).position = NiPoint3(141.680099, 419.990051, 208.680450); path.pathWaypoints.at(1).movingPlatform.speed = 16.0f; path.pathBehavior = PathBehavior::Bounce; - moverPlatformSubComponent._SetPath(&path); - moverPlatformSubComponent.m_Speed = 16.0f; - moverPlatformSubComponent.m_TimeBasedMovement = false; - moverPlatformSubComponent.m_InReverse = false; - moverPlatformSubComponent.m_CurrentWaypointIndex = 0; - moverPlatformSubComponent.m_NextWaypointIndex = 1; ASSERT_EQ(moverPlatformSubComponent.CalculateSpeed(), 16.0f); NiPoint3 r = moverPlatformSubComponent.CalculateLinearVelocity(); ASSERT_FLOAT_EQ(r.x, 15.988346099854); @@ -394,10 +303,7 @@ TEST_F(MovingPlatformComponentTests, MovingPlatformMoverSpeedCalculationTest) { } TEST_F(MovingPlatformComponentTests, MovingPlatformNextAndCurrentWaypointAccess) { - MoverPlatformSubComponent moverPlatformSubComponent(nullptr); - moverPlatformSubComponent._SetPath(&path); - moverPlatformSubComponent.m_CurrentWaypointIndex = 0; - moverPlatformSubComponent.m_NextWaypointIndex = 1; + MoverPlatformSubComponent moverPlatformSubComponent(baseEntity->GetComponent()); ASSERT_EQ(moverPlatformSubComponent.GetCurrentWaypoint().position, NiPoint3(1, 2, 3)); ASSERT_EQ(moverPlatformSubComponent.GetNextWaypoint().position, NiPoint3(4, 5, 6)); moverPlatformSubComponent.AdvanceToNextWaypoint(); @@ -406,23 +312,32 @@ TEST_F(MovingPlatformComponentTests, MovingPlatformNextAndCurrentWaypointAccess) } TEST_F(MovingPlatformComponentTests, MovingPlatformRunTest) { - MoverPlatformSubComponent moverPlatformSubComponent(nullptr); - moverPlatformSubComponent._SetPath(&path); + MoverPlatformSubComponent moverPlatformSubComponent(baseEntity->GetComponent()); path.pathWaypoints.at(0).position = NiPoint3(99.296440f, 419.293335f, 207.219498f); path.pathWaypoints.at(0).movingPlatform.speed = 16.0f; + path.pathWaypoints.at(1).position = NiPoint3(141.680099f, 419.990051f, 208.680450f); path.pathWaypoints.at(1).movingPlatform.speed = 16.0f; - moverPlatformSubComponent.m_State = 0; - moverPlatformSubComponent.m_TimeBasedMovement = false; - moverPlatformSubComponent.m_State = eMovementPlatformState::Travelling; - moverPlatformSubComponent.m_CurrentWaypointIndex = 0; - moverPlatformSubComponent.m_NextWaypointIndex = 1; - moverPlatformSubComponent.m_Speed = 16.0f; - moverPlatformSubComponent.m_Position = path.pathWaypoints.at(0).position; + + moverPlatformSubComponent.UpdateLinearVelocity(); moverPlatformSubComponent.Update(2.65f); // just check that its close enough - EXPECT_LT(141.680099f - moverPlatformSubComponent.m_Position.x, 0.1f); - EXPECT_LT(419.990051f - moverPlatformSubComponent.m_Position.y, 0.1f); - EXPECT_LT(208.680450f - moverPlatformSubComponent.m_Position.z, 0.1f); + EXPECT_LT(141.680099f - moverPlatformSubComponent.GetPosition().x, 0.1f); + EXPECT_LT(419.990051f - moverPlatformSubComponent.GetPosition().y, 0.1f); + EXPECT_LT(208.680450f - moverPlatformSubComponent.GetPosition().z, 0.1f); +} + +TEST_F(MovingPlatformComponentTests, MovingPlatformPercentBetweenPointsTest) { + MoverPlatformSubComponent moverPlatformSubComponent(baseEntity->GetComponent()); + path.pathWaypoints.at(0).position = NiPoint3(0, 0, 1); + path.pathWaypoints.at(1).position = NiPoint3(0, 0, 3); + // moverPlatformSubComponent.m_Position = NiPoint3(0, 0, 1); + ASSERT_FLOAT_EQ(moverPlatformSubComponent.CalculatePercentToNextWaypoint(), 0.0f); + // moverPlatformSubComponent.m_Position = NiPoint3(0, 0, 2); + ASSERT_FLOAT_EQ(moverPlatformSubComponent.CalculatePercentToNextWaypoint(), 0.5f); + // moverPlatformSubComponent.m_Position = NiPoint3(0, 0, 3); + ASSERT_FLOAT_EQ(moverPlatformSubComponent.CalculatePercentToNextWaypoint(), 1.0f); + // moverPlatformSubComponent.m_TimeBasedMovement = true; + ASSERT_FLOAT_EQ(moverPlatformSubComponent.CalculatePercentToNextWaypoint(), 0.0f); }