mirror of
https://github.com/DarkflameUniverse/DarkflameServer.git
synced 2026-11-14 15:57:13 +00:00
LWORocketLaunchComponentCommon::LoadConfigData (0x00c55150) reads the
level's targetZone, targetScene, GMLevel, propertyDefaultTargetZone,
rocketLaunchPreCondition, rocketUseLaunchPrecondition and the alternative
landing keys, and the table row replaces them only while
rocketLaunchUseDBDefaults is true, its default (0x00c12ea0). The server
used the row for every pad.
31 pads in the 1.10.64 maps turn the key off. Their zones and scenes are
their rows'; what only the level has are the launch preconditions in use
on the Venture Explorer's four pads ("237;8;127|128;6|55;107;282") and
on Avant Gardens' pads to Nimbus Station, its two properties and the
Venture Explorer. Those are now checked before a launch, as the row's are.
Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
170 lines
5.1 KiB
C++
170 lines
5.1 KiB
C++
/*
|
|
* Darkflame Universe
|
|
* Copyright 2018
|
|
*/
|
|
|
|
#ifndef ROCKETLAUNCHPADCONTROLCOMPONENT_H
|
|
#define ROCKETLAUNCHPADCONTROLCOMPONENT_H
|
|
|
|
#include "BitStream.h"
|
|
#include "Entity.h"
|
|
#include "Component.h"
|
|
#include "eReplicaComponentType.h"
|
|
|
|
namespace GameMessages {
|
|
struct FireEventClientSide;
|
|
}
|
|
|
|
class PreconditionExpression;
|
|
|
|
/**
|
|
* Component that handles rocket launchpads that can be interacted with to travel to other worlds.
|
|
*/
|
|
class RocketLaunchpadControlComponent final : public Component {
|
|
public:
|
|
static constexpr eReplicaComponentType ComponentType = eReplicaComponentType::ROCKET_LAUNCH;
|
|
|
|
RocketLaunchpadControlComponent(Entity* parent, const int32_t componentID);
|
|
~RocketLaunchpadControlComponent() override;
|
|
|
|
void LoadDataFromTemplate() override;
|
|
void LoadConfigData() override;
|
|
|
|
const std::string& GetTargetScene() const { return m_TargetScene; }
|
|
|
|
/**
|
|
* Whether the player may launch from this pad: LWORocketLaunchComponentCommon refuses a player under the pad's GM
|
|
* level (msgFireEventClientSide 0x00cb78b0) or that fails its launch precondition (msgCheckUseRequirements
|
|
* 0x00c7d0d0), so a client does not ask
|
|
*/
|
|
bool MayLaunch(Entity& player) const;
|
|
|
|
/**
|
|
* 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)
|
|
* @param worldIndex which of a LUP entrance's worlds was picked, -1 otherwise
|
|
*/
|
|
void Launch(Entity* originator, LWOMAPID mapId = LWOMAPID_INVALID, LWOCLONEID cloneId = LWOCLONEID_INVALID, int32_t worldIndex = -1);
|
|
|
|
/**
|
|
* The "RocketEquipped" event live sent from the launchpad to every client in the zone when a player launched
|
|
* (1,196 of the 1,265 captured were other players' launches): it plays the launch for that player on every
|
|
* client (LWORocketLaunchComponentCommon::msgFireEventClientSide). param1 is the property clone (0 is left out),
|
|
* param2 the picked LUP world index (-1 is left out).
|
|
*/
|
|
static GameMessages::FireEventClientSide MakeRocketEquipped(LWOOBJID launchpad, LWOOBJID rocket, LWOOBJID player, LWOCLONEID cloneId, int32_t worldIndex);
|
|
|
|
/**
|
|
* Handles a RequestUse from some entity, preparing it for launch to some other world
|
|
* @param originator the entity that triggered the event
|
|
*/
|
|
bool OnRequestUse(GameMessages::RequestUseEvent& event);
|
|
|
|
/**
|
|
* Currently unused
|
|
*/
|
|
void OnProximityUpdate(Entity* entering, std::string name, std::string status);
|
|
|
|
/**
|
|
* 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);
|
|
|
|
/**
|
|
* 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;
|
|
|
|
/**
|
|
* 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);
|
|
|
|
/**
|
|
* 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;
|
|
|
|
/**
|
|
* 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;
|
|
|
|
/**
|
|
* Currently unused
|
|
*/
|
|
LWOMAPID GetDefaultZone() const;
|
|
|
|
private:
|
|
|
|
/**
|
|
* All the players that are in the proximity of the rocket launchpad
|
|
*/
|
|
std::map<LWOOBJID, Entity*> m_PlayersInRadius = {};
|
|
|
|
/**
|
|
* The map that the launchpad goes to
|
|
*/
|
|
LWOMAPID m_TargetZone;
|
|
|
|
/**
|
|
* Currently unused
|
|
*/
|
|
LWOMAPID m_DefaultZone;
|
|
|
|
/**
|
|
* The clone IDs selected for each player to go to (for properies)
|
|
*/
|
|
std::map<LWOOBJID, LWOCLONEID> m_SelectedCloneIds = {};
|
|
|
|
/**
|
|
* The map IDs selected for each player to go to
|
|
*/
|
|
std::map<LWOOBJID, LWOMAPID> m_SelectedMapIds = {};
|
|
|
|
/**
|
|
* The scene that plays when the player lands
|
|
*/
|
|
std::string m_TargetScene;
|
|
|
|
/**
|
|
* Alternative landing scene that plays if the alternative precondition is met
|
|
*/
|
|
std::string m_AltLandingScene;
|
|
|
|
/**
|
|
* Some precondition that needs to be met to trigger the alternative landing scene
|
|
*/
|
|
PreconditionExpression* m_AltPrecondition{};
|
|
|
|
/**
|
|
* The GM level a player needs to launch from this pad (the row's gmLevel, or the level's GMLevel)
|
|
*/
|
|
int32_t m_GMLevel{};
|
|
|
|
/**
|
|
* The row's launchPrecondition, when its useLaunchPrecondition is set: what a player has to pass to launch. For a pad
|
|
* whose level turns rocketLaunchUseDBDefaults off, the level's rocketLaunchPreCondition and rocketUseLaunchPrecondition.
|
|
*/
|
|
std::string m_LaunchPrecondition;
|
|
|
|
/**
|
|
* 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, LWOCLONEID cloneID = 0);
|
|
};
|
|
|
|
#endif // ROCKETLAUNCHPADCONTROLCOMPONENT_H
|