DarkflameServer/dGame/dComponents/MovingPlatformComponent.h

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

229 lines
5.4 KiB
C
Raw Permalink Normal View History

/*
* Darkflame Universe
* Copyright 2019
*/
#ifndef MOVINGPLATFORMCOMPONENT_H
#define MOVINGPLATFORMCOMPONENT_H
#include "RakNetTypes.h"
#include "NiPoint3.h"
#include <string>
#include "dCommonVars.h"
#include "EntityManager.h"
#include "Component.h"
#include "eMovementPlatformState.h"
#include "eReplicaComponentType.h"
class Path;
/**
* Different types of available platforms
*/
enum class eMoverSubComponentType : uint32_t {
mover = 4,
/**
* Used in NJ
*/
simpleMover = 5,
};
/**
* Sub component for moving platforms that determine the actual current movement state
*/
class MoverSubComponent {
public:
MoverSubComponent(const NiPoint3& startPos);
~MoverSubComponent();
2022-07-28 13:39:57 +00:00
void Serialize(RakNet::BitStream* outBitStream, bool bIsInitialUpdate);
2022-07-28 13:39:57 +00:00
/**
* The state the platform is currently in
*/
eMovementPlatformState mState = eMovementPlatformState::Stationary;
2022-07-28 13:39:57 +00:00
/**
* The waypoint this platform currently wants to traverse to
*/
int32_t mDesiredWaypointIndex = 0;
2022-07-28 13:39:57 +00:00
/**
* Whether the platform is currently reversing away from the desired waypoint
*/
bool mInReverse = false;
2022-07-28 13:39:57 +00:00
/**
* Whether the platform should stop moving when reaching the desired waypoint
*/
bool mShouldStopAtDesiredWaypoint = false;
2022-07-28 13:39:57 +00:00
/**
* The percentage of the way between the last point and the desired point
*/
float mPercentBetweenPoints = 0;
2022-07-28 13:39:57 +00:00
/**
* The current position of the platofrm
*/
NiPoint3 mPosition{};
2022-07-28 13:39:57 +00:00
/**
* The waypoint the platform is (was) at
*/
uint32_t mCurrentWaypointIndex;
2022-07-28 13:39:57 +00:00
/**
* The waypoint the platform is attempting to go to
*/
uint32_t mNextWaypointIndex;
2022-07-28 13:39:57 +00:00
/**
* The timer that handles the time before stopping idling and continue platform movement
*/
float mIdleTimeElapsed = 0;
2022-07-28 13:39:57 +00:00
/**
* The speed the platform is currently moving at
*/
float mSpeed = 0;
2022-07-28 13:39:57 +00:00
/**
* The time to wait before continuing movement
*/
float mWaitTime = 0;
};
/**
* Represents entities that may be moving platforms, indicating how they should move through the world.
* NOTE: the logic in this component hardly does anything, apparently the client can figure most of this stuff out
* if you just serialize it correctly, resulting in smoother results anyway. Don't be surprised if the exposed APIs
* don't at all do what you expect them to as we don't instruct the client of changes made here.
* ^^^ Trivia: This made the red blocks platform and property platforms a pain to implement.
*/
class MovingPlatformComponent : public Component {
public:
feat: Add isolated and simplified path to add components (#1204) * Components: Make ComponentType inline Prevents the next commits ODR violation * Components: Add new components * Entity: Add headers inline script component ComponentType * Components: Flip constructor argument order Entity comes first always * Entity: Add generic AddComponent Allows for much easier adding of components and is error proof by not allowing the user to add more than 1 of a specific component type to an Entity. * Entity: Migrate all component constructors Move all to the new variadic templates AddComponent function to reduce clutter and ways the component map is modified. The new function makes no assumptions. Component is assumed to not exist and is checked for with operator[]. This will construct a null component which will then be newed if the component didnt exist, or it will just get the current component if it does already exist. No new component will be allocated or constructed if the component already exists and the already existing pointer is returned instead. * Entity: Add placement new For the case where the component may already exist, use a placement new to construct the component again, it would be constructed again, but would not need to go through the allocator. * Entity: Add comments on likely new code * Tests: Fix tests * Update Entity.cpp * Update SGCannon.cpp * Entity: call destructor when re-constructing * Update Entity.cpp Update Entity.cpp --------- Co-authored-by: Aaron Kimbrell <aronwk.aaron@gmail.com>
2023-10-23 01:08:49 +00:00
inline static const eReplicaComponentType ComponentType = eReplicaComponentType::MOVING_PLATFORM;
2022-07-28 13:39:57 +00:00
MovingPlatformComponent(Entity* parent, const std::string& pathName);
~MovingPlatformComponent() override;
2022-07-28 13:39:57 +00:00
void Serialize(RakNet::BitStream* outBitStream, bool bIsInitialUpdate) override;
2022-07-28 13:39:57 +00:00
/**
* Stops all pathing, called when an entity starts a quick build associated with this platform
*/
void OnQuickBuildInitilized();
2022-07-28 13:39:57 +00:00
/**
* Starts the pathing, called when an entity completed a quick build associated with this platform
*/
void OnCompleteQuickBuild();
2022-07-28 13:39:57 +00:00
/**
* Updates the movement state for the moving platform
* @param value the movement state to set
*/
void SetMovementState(eMovementPlatformState value);
2022-07-28 13:39:57 +00:00
/**
* Instructs the moving platform to go to some waypoint
* @param index the index of the waypoint
* @param stopAtWaypoint determines if the platform should stop at the waypoint
*/
void GotoWaypoint(uint32_t index, bool stopAtWaypoint = true);
2022-07-28 13:39:57 +00:00
/**
* Starts the pathing of this platform, setting appropriate waypoints and speeds
*/
void StartPathing();
2022-07-28 13:39:57 +00:00
/**
* Continues the path of the platform, after it's been stopped
*/
void ContinuePathing();
2022-07-28 13:39:57 +00:00
/**
* Stops the platform from moving, waiting for it to be activated again.
*/
void StopPathing();
2022-07-28 13:39:57 +00:00
/**
* Determines if the entity should be serialized on the next update
* @param value whether to serialize the entity or not
*/
void SetSerialized(bool value);
2022-07-28 13:39:57 +00:00
/**
* Returns if this platform will start automatically after spawn
* @return if this platform will start automatically after spawn
*/
bool GetNoAutoStart() const;
2022-07-28 13:39:57 +00:00
/**
* Sets the auto start value for this platform
* @param value the auto start value to set
*/
void SetNoAutoStart(bool value);
2022-07-28 13:39:57 +00:00
/**
* Warps the platform to a waypoint index, skipping its current path
* @param index the index to go to
*/
void WarpToWaypoint(size_t index);
2022-07-28 13:39:57 +00:00
/**
* Returns the waypoint this platform was previously at
* @return the waypoint this platform was previously at
*/
size_t GetLastWaypointIndex() const;
2022-07-28 13:39:57 +00:00
/**
* Returns the sub component that actually defines how the platform moves around (speeds, etc).
* @return the sub component that actually defines how the platform moves around
*/
MoverSubComponent* GetMoverSubComponent() const;
2022-07-28 13:39:57 +00:00
private:
/**
* The path this platform is currently on
*/
const Path* m_Path = nullptr;
2022-07-28 13:39:57 +00:00
/**
* The name of the path this platform is currently on
*/
std::u16string m_PathName;
2022-07-28 13:39:57 +00:00
/**
* Whether the platform has stopped pathing
*/
bool m_PathingStopped = false;
2022-07-28 13:39:57 +00:00
/**
* The type of the subcomponent
*/
eMoverSubComponentType m_MoverSubComponentType;
2022-07-28 13:39:57 +00:00
/**
* The mover sub component that belongs to this platform
*/
void* m_MoverSubComponent;
2022-07-28 13:39:57 +00:00
/**
* Whether the platform shouldn't auto start
*/
bool m_NoAutoStart;
2022-07-28 13:39:57 +00:00
/**
* Whether to serialize the entity on the next update
*/
bool m_Serialize = false;
};
#endif // MOVINGPLATFORMCOMPONENT_H