Files
DarkflameServer/dGame/dComponents/SwitchComponent.h
Aaron Kimbrell beed2651e5 feat(scripts): L_SIMPLE_MOVER_SWITCH, the platforms of the NJ attic switches
The script (with L_BASE_SWITCH_ACTIVATED_SERVER) asks the switches in the
platform's switchGroup to tell it when they are activated and
deactivated, and sends the platform to waypoint 1 on the one and back to
waypoint 0 on the other. The NJ monastery's ice and lightning attic
platforms (LOTs 14539 and 14376) run it.

A switch can now be asked for that (SwitchComponent::
AddActivationCallback). Where live's switch tells its group that it has
loaded, the platform here looks for its switches again each second until
it has found one.

The script was on the list of scripts left out, with a note that its
platform does not exist; it is taken off the list.

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
2026-11-10 16:57:15 -06:00

128 lines
2.9 KiB
C++

#ifndef SWITCHCOMPONENT_H
#define SWITCHCOMPONENT_H
#include "RakNetTypes.h"
#include "Entity.h"
#include "GameMessages.h"
#include "EntityManager.h"
#include "QuickBuildComponent.h"
#include "BouncerComponent.h"
#include <algorithm>
#include <functional>
#include "Component.h"
#include "eReplicaComponentType.h"
/**
* A component for switches in game, including pet triggered switches.
*/
class SwitchComponent final : public Component {
public:
static constexpr eReplicaComponentType ComponentType = eReplicaComponentType::SWITCH;
SwitchComponent(Entity* parent, const int32_t componentID);
void LoadConfigData() override;
~SwitchComponent() override;
void Run(float deltaTime) override;
bool OnRequestUse(GameMessages::RequestUseEvent& event);
// Enters the switch if entity has one of the factions it responds to (a use, a touch or a pet on it)
void EnterIfResponding(Entity* entity);
Entity* GetParentEntity() const;
void Serialize(RakNet::BitStream& outBitStream, bool bIsInitialUpdate) override;
/**
* Sets whether the switch is on or off.
* @param active whether the switch is on or off.
*/
void SetActive(bool active);
/**
* Returns whether the switch is on or off.
*/
bool GetActive() const;
/**
* Sets the attached pet bouncer
* @param value the attached pet bouncer
*/
void SetPetBouncer(BouncerComponent* value);
/**
* Returns the attached pet bouncer
*/
BouncerComponent* GetPetBouncer() const;
/**
* Invoked when a entity enters the trigger area.
*/
void EntityEnter(Entity* entity);
/**
* Invoked when a entity leaves the trigger area.
*/
void EntityLeave(Entity* entity);
/**
* Returns the closest switch from a given position
* @param position the position to check
* @return the closest switch from a given position
*/
static SwitchComponent* GetClosestSwitch(NiPoint3 position);
/**
* Calls back when the switch is activated (true) and when it is deactivated (false): what an object's script asks
* a switch for with a notification request for ObjectActivated and ObjectDeactivated
*/
void AddActivationCallback(const std::function<void(bool)>& callback) { m_ActivationCallbacks.push_back(callback); }
const std::vector<int32_t>& GetFactionsToRespondTo() const {
return m_FactionsToRespondTo;
}
private:
/**
* A list of all pet switches.
*/
static std::vector<SwitchComponent*> petSwitches;
/**
* Attached rebuild component.
*/
QuickBuildComponent* m_QuickBuild;
/**
* If the switch is on or off.
*/
bool m_Active;
/**
* The amount of entities in the trigger area.
*/
int m_EntitiesOnSwitch = 0;
/**
* The switch reset time
*/
int m_ResetTime = INT_MAX;
/**
* Timer for resetting the switch
*/
float m_Timer = 0.0f;
/**
* Attached pet bouncer
*/
BouncerComponent* m_PetBouncer = nullptr;
std::vector<int32_t> m_FactionsToRespondTo{};
std::vector<std::function<void(bool)>> m_ActivationCallbacks;
};
#endif // SWITCHCOMPONENT_H