DarkflameServer/dGame/dComponents/RocketLaunchpadControlComponent.h

134 lines
3.4 KiB
C
Raw Normal View History

/*
* Darkflame Universe
* Copyright 2018
*/
#ifndef ROCKETLAUNCHPADCONTROLCOMPONENT_H
#define ROCKETLAUNCHPADCONTROLCOMPONENT_H
#include "BitStream.h"
#include "Entity.h"
#include "Component.h"
#include "eReplicaComponentType.h"
class PreconditionExpression;
/**
* Component that handles rocket launchpads that can be interacted with to travel to other worlds.
*/
class RocketLaunchpadControlComponent : 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::ROCKET_LAUNCH;
2022-07-28 13:39:57 +00:00
RocketLaunchpadControlComponent(Entity* parent, int rocketId);
~RocketLaunchpadControlComponent() override;
2022-07-28 13:39:57 +00:00
/**
* Launches some entity to another world
* @param originator the entity to launch
* @param mapId the world to go to
* @param cloneId the clone ID (for properties)
*/
void Launch(Entity* originator, LWOMAPID mapId = LWOMAPID_INVALID, LWOCLONEID cloneId = LWOCLONEID_INVALID);
2022-07-28 13:39:57 +00:00
/**
* Handles an OnUse event from some entity, preparing it for launch to some other world
* @param originator the entity that triggered the event
*/
void OnUse(Entity* originator) override;
2022-07-28 13:39:57 +00:00
/**
* Currently unused
*/
void OnProximityUpdate(Entity* entering, std::string name, std::string status);
2022-07-28 13:39:57 +00:00
/**
* Sets the map ID that a player will go to
* @param player the entity to set the map ID for
* @param cloneId the map ID of the property to set
*/
void SetSelectedMapId(LWOOBJID player, LWOMAPID cloneId);
2022-07-28 13:39:57 +00:00
/**
* Returns the map ID that a player will go to
* @param player the player to find the map ID for
* @return the map ID that a player will go to
*/
LWOMAPID GetSelectedMapId(LWOOBJID player) const;
2022-07-28 13:39:57 +00:00
/**
* Sets the clone ID that a player will go to (for properties)
* @param player the entity to set the clone ID for
* @param cloneId the clone ID of the property to set
*/
void SetSelectedCloneId(LWOOBJID player, LWOCLONEID cloneId);
2022-07-28 13:39:57 +00:00
/**
* Returns the clone ID that a player will go to (for properties)
* @param player the player to find the clone ID for
* @return the clone ID that a player will go to
*/
LWOCLONEID GetSelectedCloneId(LWOOBJID player) const;
2022-07-28 13:39:57 +00:00
/**
* Returns the zone that this rocket launchpad points to by default
* @return the zone that this rocket launchpad points to by default
*/
LWOMAPID GetTargetZone() const;
2022-07-28 13:39:57 +00:00
/**
* Currently unused
*/
LWOMAPID GetDefaultZone() const;
private:
2022-07-28 13:39:57 +00:00
/**
* All the players that are in the proximity of the rocket launchpad
*/
std::map<LWOOBJID, Entity*> m_PlayersInRadius = {};
2022-07-28 13:39:57 +00:00
/**
* The map that the launchpad goes to
*/
LWOMAPID m_TargetZone;
2022-07-28 13:39:57 +00:00
/**
* Currently unused
*/
LWOMAPID m_DefaultZone;
2022-07-28 13:39:57 +00:00
/**
* The clone IDs selected for each player to go to (for properies)
*/
std::map<LWOOBJID, LWOCLONEID> m_SelectedCloneIds = {};
2022-07-28 13:39:57 +00:00
/**
* The map IDs selected for each player to go to
*/
std::map<LWOOBJID, LWOMAPID> m_SelectedMapIds = {};
2022-07-28 13:39:57 +00:00
/**
* The scene that plays when the player lands
*/
std::string m_TargetScene;
2022-07-28 13:39:57 +00:00
/**
* Alternative landing scene that plays if the alternative precondition is met
*/
std::string m_AltLandingScene;
2022-07-28 13:39:57 +00:00
/**
* Some precondition that needs to be met to trigger the alternative landing scene
*/
PreconditionExpression* m_AltPrecondition;
2022-07-28 13:39:57 +00:00
/**
* Notifies the master server to prepare some world for a player to be able to travel to it
* @param zoneID the ID of the zone to prepare
*/
void TellMasterToPrepZone(int zoneID);
};
#endif // ROCKETLAUNCHPADCONTROLCOMPONENT_H