DarkflameServer/dGame/dComponents/ModuleAssemblyComponent.h
David Markowitz ae349d6b15
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-22 20:08:49 -05:00

78 lines
1.9 KiB
C++

#pragma once
#include "BitStream.h"
#include "Entity.h"
#include "Component.h"
#include "eReplicaComponentType.h"
/**
* Component that belongs to an object that may be modularly built, like cars and rockets. Note that this is not the
* same as having said items in your inventory (the subkey for this component) this component is the one that
* renders the entity into the world.
*/
class ModuleAssemblyComponent : public Component {
public:
inline static const eReplicaComponentType ComponentType = eReplicaComponentType::MODULE_ASSEMBLY;
ModuleAssemblyComponent(Entity* parent);
~ModuleAssemblyComponent() override;
void Serialize(RakNet::BitStream* outBitStream, bool bIsInitialUpdate) override;
void Update(float deltaTime) override;
/**
* Sets the subkey of this entity
* @param value the subkey to set
*/
void SetSubKey(LWOOBJID value);
/**
* Returns the subkey for this entity
* @return the subkey for this entity
*/
LWOOBJID GetSubKey() const;
/**
* Sets the optional parts value
* @param value the value to set
*/
void SetUseOptionalParts(bool value);
/**
* Returns the optional parts value
* @return the value to set
*/
bool GetUseOptionalParts() const;
/**
* Sets the assembly part lots (the subsections of this modular build)
* @param value the assembly part lots to set
*/
void SetAssemblyPartsLOTs(const std::u16string& value);
/**
* Returns the assembly part lots (the subsections of this modular build)
* @return
*/
const std::u16string& GetAssemblyPartsLOTs() const;
private:
/**
* The sub key is the entity that this entity is an instance of. E.g. the item in the inventory. If a car for
* example is to be rendered, this sub key refers to the car item that was used to build this entity.
*/
LWOOBJID m_SubKey;
/**
* Whether to use optional parts, currently unused
*/
bool m_UseOptionalParts;
/**
* The sub items that this entity is made of
*/
std::u16string m_AssemblyPartsLOTs;
};