DarkflameServer/dGame/dComponents/QuickBuildComponent.h

366 lines
9.4 KiB
C
Raw Permalink Normal View History

#ifndef QUICKBUILDCOMPONENT_H
#define QUICKBUILDCOMPONENT_H
#include "BitStream.h"
#include <vector>
#include <string>
#include "dCommonVars.h"
#include "NiPoint3.h"
#include "ScriptedActivityComponent.h"
#include "Preconditions.h"
#include "Component.h"
#include "eReplicaComponentType.h"
#include "eQuickBuildState.h"
class Entity;
enum class eQuickBuildFailReason : uint32_t;
/**
* Component that handles entities that can be built into other entities using the quick build mechanic. Generally
* consists of an activator that shows a popup and then the actual entity that the bricks are built into. Note
* that quick builds are also scripted activities so this shared some logic with the ScriptedActivityComponent.
*/
class QuickBuildComponent : 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::QUICK_BUILD;
2022-07-28 13:39:57 +00:00
QuickBuildComponent(Entity* entity);
~QuickBuildComponent() override;
void Serialize(RakNet::BitStream* outBitStream, bool bIsInitialUpdate) override;
void Update(float deltaTime) override;
2022-07-28 13:39:57 +00:00
/**
* Handles a OnUse event from some entity, initiating the quick build
* @param originator the entity that triggered the event
*/
void OnUse(Entity* originator) override;
2022-07-28 13:39:57 +00:00
/**
* Spawns the activator that can be used to initiate the quickbuild
2022-07-28 13:39:57 +00:00
*/
void SpawnActivator();
2022-07-28 13:39:57 +00:00
/**
* Despawns the activiator that can be used to initiate the quickbuild
2022-07-28 13:39:57 +00:00
*/
void DespawnActivator();
2022-07-28 13:39:57 +00:00
/**
* Returns the entity that acts as the activator for this quickbuild
* @return the entity that acts as the activator for this quickbuild
2022-07-28 13:39:57 +00:00
*/
Entity* GetActivator();
2022-07-28 13:39:57 +00:00
/**
* Returns the spawn position of the activator for this quickbuild, if any
* @return the spawn position of the activator for this quickbuild, if any
2022-07-28 13:39:57 +00:00
*/
NiPoint3 GetActivatorPosition();
2022-07-28 13:39:57 +00:00
/**
* Sets the spawn position for the activator of this quickbuild
2022-07-28 13:39:57 +00:00
* @param value the spawn position to set for the activator
*/
void SetActivatorPosition(NiPoint3 value);
2022-07-28 13:39:57 +00:00
/**
* Returns the time it takes for the quickbuild to reset after being built
* @return the time it takes for the quickbuild to reset after being built
2022-07-28 13:39:57 +00:00
*/
float GetResetTime();
2022-07-28 13:39:57 +00:00
/**
* Sets the time it takes for the quickbuild to reset after being built
2022-07-28 13:39:57 +00:00
* @param value the reset time to set
*/
void SetResetTime(float value);
2022-07-28 13:39:57 +00:00
/**
* Returns the time it takes to complete the quickbuild
* @return the time it takes to complete the quickbuild
2022-07-28 13:39:57 +00:00
*/
float GetCompleteTime();
2022-07-28 13:39:57 +00:00
/**
* Sets the time it takes to complete the quickbuild
2022-07-28 13:39:57 +00:00
* @param value the completion time to set
*/
void SetCompleteTime(float value);
2022-07-28 13:39:57 +00:00
/**
* Returns the imagination that's taken when completing the quickbuild
* @return the imagination that's taken when completing the quickbuild
2022-07-28 13:39:57 +00:00
*/
int GetTakeImagination();
2022-07-28 13:39:57 +00:00
/**
* Sets the imagination that's taken when completing the quickbuild
2022-07-28 13:39:57 +00:00
* @param value the imagination deduction to set
*/
void SetTakeImagination(int value);
2022-07-28 13:39:57 +00:00
/**
* Returns if the quickbuild can be interrupted, currently unused
* @return if the quickbuild can be interrupted
2022-07-28 13:39:57 +00:00
*/
bool GetInterruptible();
2022-07-28 13:39:57 +00:00
/**
* Sets whether or not the quickbuild can be interrupted, currently unused
* @param value true if the quickbuild may be interrupted, false otherwise
2022-07-28 13:39:57 +00:00
*/
void SetInterruptible(bool value);
2022-07-28 13:39:57 +00:00
/**
* Returns whether or not this entity contains a built-in activator
* @return whether or not this entity contains a built-in activator
*/
bool GetSelfActivator();
2022-07-28 13:39:57 +00:00
/**
* Sets whether or not this entity contains a built-in activator. If set to false this will spawn activators on
* each new quickbuild.
2022-07-28 13:39:57 +00:00
* @param value whether or not this entity contains a built-in activator
*/
void SetSelfActivator(bool value);
2022-07-28 13:39:57 +00:00
/**
* Currently unused
*/
std::vector<int> GetCustomModules();
2022-07-28 13:39:57 +00:00
/**
* Currently unused
*/
void SetCustomModules(std::vector<int> value);
2022-07-28 13:39:57 +00:00
/**
* Returns the activity ID for participating in this quickbuild
* @return the activity ID for participating in this quickbuild
2022-07-28 13:39:57 +00:00
*/
int GetActivityId();
2022-07-28 13:39:57 +00:00
/**
* Sets the activity ID for participating in this quickbuild
2022-07-28 13:39:57 +00:00
* @param value the activity ID to set
*/
void SetActivityId(int value);
2022-07-28 13:39:57 +00:00
/**
* Currently unused
*/
int GetPostImaginationCost();
2022-07-28 13:39:57 +00:00
/**
* Currently unused
*/
void SetPostImaginationCost(int value);
2022-07-28 13:39:57 +00:00
/**
* Returns the time it takes for an incomplete quickbuild to be smashed automatically
* @return the time it takes for an incomplete quickbuild to be smashed automatically
2022-07-28 13:39:57 +00:00
*/
float GetTimeBeforeSmash();
2022-07-28 13:39:57 +00:00
/**
* Sets the time it takes for an incomplete quickbuild to be smashed automatically
2022-07-28 13:39:57 +00:00
* @param value the time to set
*/
void SetTimeBeforeSmash(float value);
2022-07-28 13:39:57 +00:00
/**
* Returns the current quickbuild state
* @return the current quickbuild state
2022-07-28 13:39:57 +00:00
*/
eQuickBuildState GetState();
2022-07-28 13:39:57 +00:00
/**
* Returns the player that is currently building this quickbuild
* @return the player that is currently building this quickbuild
2022-07-28 13:39:57 +00:00
*/
Entity* GetBuilder() const;
2022-07-28 13:39:57 +00:00
/**
* Returns whether or not the player is repositioned when initiating the quickbuild
* @return whether or not the player is repositioned when initiating the quickbuild
2022-07-28 13:39:57 +00:00
*/
bool GetRepositionPlayer() const;
2022-07-28 13:39:57 +00:00
/**
* Sets whether or not the player is repositioned when initiating the quickbuild
* @param value whether or not the player is repositioned when initiating the quickbuild
2022-07-28 13:39:57 +00:00
*/
void SetRepositionPlayer(bool value);
2022-07-28 13:39:57 +00:00
/**
* Adds a callback that is called when the quickbuild is completed
2022-07-28 13:39:57 +00:00
* @param callback the callback to add
*/
void AddQuickBuildCompleteCallback(const std::function<void(Entity* user)>& callback);
2022-07-28 13:39:57 +00:00
/**
* Adds a callback when the quickbuild state is updated
2022-07-28 13:39:57 +00:00
* @param callback the callback to add
*/
void AddQuickBuildStateCallback(const std::function<void(eQuickBuildState state)>& callback);
2022-07-28 13:39:57 +00:00
/**
* Resets the quickbuild
* @param failed whether or not the player failed to complete the quickbuild, triggers an extra animation
2022-07-28 13:39:57 +00:00
*/
void ResetQuickBuild(bool failed);
2022-07-28 13:39:57 +00:00
/**
* Cancels the quickbuild if it wasn't completed
2022-07-28 13:39:57 +00:00
* @param builder the player that's currently building
* @param failReason the reason the quickbuild was cancelled
* @param skipChecks whether or not to skip the check for the quickbuild not being completed
2022-07-28 13:39:57 +00:00
*/
void CancelQuickBuild(Entity* builder, eQuickBuildFailReason failReason, bool skipChecks = false);
private:
2022-07-28 13:39:57 +00:00
/**
* Whether or not the quickbuild state has been changed since we last serialized it.
*/
bool m_StateDirty = true;
/**
* The state the quickbuild is currently in
2022-07-28 13:39:57 +00:00
*/
eQuickBuildState m_State = eQuickBuildState::OPEN;
2022-07-28 13:39:57 +00:00
/**
* The time that has passed since initiating the quickbuild
2022-07-28 13:39:57 +00:00
*/
float m_Timer = 0;
2022-07-28 13:39:57 +00:00
/**
* The time that has passed before completing the quickbuild
2022-07-28 13:39:57 +00:00
*/
float m_TimerIncomplete = 0;
2022-07-28 13:39:57 +00:00
/**
* The position that the quickbuild activator is spawned at
2022-07-28 13:39:57 +00:00
*/
NiPoint3 m_ActivatorPosition = NiPoint3::ZERO;
2022-07-28 13:39:57 +00:00
/**
* The entity that represents the quickbuild activator
2022-07-28 13:39:57 +00:00
*/
Entity* m_Activator = nullptr;
2022-07-28 13:39:57 +00:00
/**
* The ID of the entity that represents the quickbuild activator
2022-07-28 13:39:57 +00:00
*/
LWOOBJID m_ActivatorId = LWOOBJID_EMPTY;
2022-07-28 13:39:57 +00:00
/**
* Triggers the blinking that indicates that the quickbuild is resetting
2022-07-28 13:39:57 +00:00
*/
bool m_ShowResetEffect = false;
2022-07-28 13:39:57 +00:00
/**
* Currently unused
*/
float m_Taken = 0;
2022-07-28 13:39:57 +00:00
/**
* The callbacks that are called when the quickbuild is completed
2022-07-28 13:39:57 +00:00
*/
std::vector<std::function<void(Entity* user)>> m_QuickBuildCompleteCallbacks{};
2022-07-28 13:39:57 +00:00
/**
* The callbacks that are called when the quickbuild state is updated
2022-07-28 13:39:57 +00:00
*/
std::vector<std::function<void(eQuickBuildState state)>> m_QuickBuildStateCallbacks{};
2022-07-28 13:39:57 +00:00
/**
* The time it takes for the quickbuild to reset after being completed
2022-07-28 13:39:57 +00:00
*/
float m_ResetTime = 0;
2022-07-28 13:39:57 +00:00
/**
* The time it takes to complete the quickbuild
2022-07-28 13:39:57 +00:00
*/
float m_CompleteTime = 0;
2022-07-28 13:39:57 +00:00
/**
* The imagination that's deducted when completing the quickbuild
2022-07-28 13:39:57 +00:00
*/
int m_TakeImagination = 0;
2022-07-28 13:39:57 +00:00
/**
* Currently unused
*/
bool m_Interruptible = false;
2022-07-28 13:39:57 +00:00
/**
* Whether or not this quickbuild entity also has an activator attached. If not a new one will be spawned
2022-07-28 13:39:57 +00:00
*/
bool m_SelfActivator = false;
2022-07-28 13:39:57 +00:00
/**
* Currently unused
*/
std::vector<int> m_CustomModules{};
2022-07-28 13:39:57 +00:00
/**
* The activity ID that players partake in when doing this quickbuild
2022-07-28 13:39:57 +00:00
*/
int m_ActivityId = 0;
2022-07-28 13:39:57 +00:00
/**
* Currently unused
*/
int m_PostImaginationCost = 0;
2022-07-28 13:39:57 +00:00
/**
* The time it takes for the quickbuild to reset when it's not completed yet
2022-07-28 13:39:57 +00:00
*/
float m_TimeBeforeSmash = 0;
2022-07-28 13:39:57 +00:00
/**
* The time it takes to drain imagination
*/
float m_TimeBeforeDrain = 0;
2022-07-28 13:39:57 +00:00
/**
* The amount of imagination that was drained when building this quickbuild
2022-07-28 13:39:57 +00:00
*/
int m_DrainedImagination = 0;
2022-07-28 13:39:57 +00:00
/**
* Whether to reposition the player or not when building
*/
bool m_RepositionPlayer = true;
2022-07-28 13:39:57 +00:00
/**
* Currently unused
*/
float m_SoftTimer = 0;
2022-07-28 13:39:57 +00:00
/**
* The ID of the entity that's currently building the quickbuild
2022-07-28 13:39:57 +00:00
*/
LWOOBJID m_Builder = LWOOBJID_EMPTY;
2022-07-28 13:39:57 +00:00
/**
* Preconditions to be met before being able to start the quickbuild
2022-07-28 13:39:57 +00:00
*/
PreconditionExpression* m_Precondition = nullptr;
2022-07-28 13:39:57 +00:00
/**
* Starts the quickbuild for a certain entity
* @param user the entity to start the quickbuild
2022-07-28 13:39:57 +00:00
*/
void StartQuickBuild(Entity* user);
2022-07-28 13:39:57 +00:00
/**
* Completes the quickbuild for an entity, dropping loot and despawning the activator
* @param user the entity that completed the quickbuild
2022-07-28 13:39:57 +00:00
*/
void CompleteQuickBuild(Entity* user);
};
#endif // QUICKBUILDCOMPONENT_H