DarkflameServer/dGame/dComponents/PossessorComponent.h

116 lines
2.8 KiB
C
Raw Normal View History

#pragma once
#include "BitStream.h"
#include "Entity.h"
#include "Component.h"
#include "eReplicaComponentType.h"
// possession types
enum class ePossessionType : uint8_t {
NO_POSSESSION = 0,
ATTACHED_VISIBLE,
NOT_ATTACHED_VISIBLE,
NOT_ATTACHED_NOT_VISIBLE,
};
/**
* Represents an entity that can posess other entities. Generally used by players to drive a car.
*/
class PossessorComponent : public Component {
2022-07-28 13:39:57 +00:00
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::POSSESSOR;
2022-07-28 13:39:57 +00:00
PossessorComponent(Entity* parent);
~PossessorComponent() override;
void Serialize(RakNet::BitStream* outBitStream, bool bIsInitialUpdate) override;
2022-07-28 13:39:57 +00:00
/**
* @brief Mounts the entity
*
* @param mount Entity to be mounted
*/
void Mount(Entity* mount);
/**
* @brief Dismounts the entity
*
* @param mount Entity to be dismounted
* @param forceDismount Should we forcibly dismount the entity
*/
void Dismount(Entity* mount, bool forceDismount = false);
/**
* Sets the ID that this entity is possessing
* @param value The ID that this entity is possessing
2022-07-28 13:39:57 +00:00
*/
void SetPossessable(LWOOBJID value) { m_Possessable = value; m_DirtyPossesor = true; }
2022-07-28 13:39:57 +00:00
/**
* Returns the entity that this entity is currently posessing
* @return The entity that this entity is currently posessing
2022-07-28 13:39:57 +00:00
*/
LWOOBJID GetPossessable() const { return m_Possessable; }
2022-07-28 13:39:57 +00:00
/**
* Sets if we are busy dismounting
* @param value If we are busy dismounting
2022-07-28 13:39:57 +00:00
*/
void SetIsDismounting(bool value) { m_IsDismounting = value; }
2022-07-28 13:39:57 +00:00
/**
* Returns if we are busy dismounting
* @return If we are busy dismounting
2022-07-28 13:39:57 +00:00
*/
bool GetIsDismounting() const { return m_IsDismounting; }
2022-07-28 13:39:57 +00:00
/**
* Sets the possesible type that's currently used, merely used by the shooting gallery if it's 0
* @param value The possesible type to set
2022-07-28 13:39:57 +00:00
*/
void SetPossessableType(ePossessionType value) { m_PossessableType = value; m_DirtyPossesor = true; }
/**
* Gets the object ID of the mount item that is being used
* @return The object ID of the mount item that is being used
*/
LWOOBJID GetMountItemID() const { return m_MountItemID; }
/**
* Sets the object ID of the mount item that is being used
* @param m_MountItemID The object ID of the mount item that is being used
*/
void SetMountItemID(LWOOBJID mountItemID) { m_MountItemID = mountItemID; }
2022-07-28 13:39:57 +00:00
private:
2022-07-28 13:39:57 +00:00
/**
* The ID of the entity this entity is possessing (e.g. the ID of a car)
*/
LWOOBJID m_Possessable = LWOOBJID_EMPTY;
2022-07-28 13:39:57 +00:00
/**
* @brief possessable type
*
*/
ePossessionType m_PossessableType = ePossessionType::NO_POSSESSION;
2022-07-28 13:39:57 +00:00
/**
* @brief If the possessor is dirty
2022-07-28 13:39:57 +00:00
*
*/
bool m_DirtyPossesor = false;
2022-07-28 13:39:57 +00:00
/**
* @brief If the possessor is busy dismounting
2022-07-28 13:39:57 +00:00
*
*/
bool m_IsDismounting = false;
/**
* Mount Item ID
*/
LWOOBJID m_MountItemID = LWOOBJID_EMPTY;
};