This repository has been archived on 2024-06-13. You can view files and clone it, but cannot push or open issues or pull requests.
2020-08-04 13:13:01 -04:00

224 lines
7.2 KiB
C++

//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
//=============================================================================//
#ifndef TRAINS_H
#define TRAINS_H
#ifdef _WIN32
#pragma once
#endif
#include "entityoutput.h"
#include "pathtrack.h"
// Spawnflags of CPathCorner
#define SF_CORNER_WAITFORTRIG 0x001
#define SF_CORNER_TELEPORT 0x002
// Tracktrain spawn flags
#define SF_TRACKTRAIN_NOPITCH 0x0001
#define SF_TRACKTRAIN_NOCONTROL 0x0002
#define SF_TRACKTRAIN_FORWARDONLY 0x0004
#define SF_TRACKTRAIN_PASSABLE 0x0008
#define SF_TRACKTRAIN_FIXED_ORIENTATION 0x0010
#define SF_TRACKTRAIN_HL1TRAIN 0x0080
#define SF_TRACKTRAIN_USE_MAXSPEED_FOR_PITCH 0x0100
#define SF_TRACKTRAIN_UNBLOCKABLE_BY_PLAYER 0x0200
#define TRAIN_ACTIVE 0x80
#define TRAIN_NEW 0xc0
#define TRAIN_OFF 0x00
#define TRAIN_NEUTRAL 0x01
#define TRAIN_SLOW 0x02
#define TRAIN_MEDIUM 0x03
#define TRAIN_FAST 0x04
#define TRAIN_BACK 0x05
enum TrainVelocityType_t {
TrainVelocity_Instantaneous = 0,
TrainVelocity_LinearBlend,
TrainVelocity_EaseInEaseOut,
};
enum TrainOrientationType_t {
TrainOrientation_Fixed = 0,
TrainOrientation_AtPathTracks,
TrainOrientation_LinearBlend,
TrainOrientation_EaseInEaseOut,
};
class CFuncTrackTrain : public CBaseEntity {
DECLARE_CLASS(CFuncTrackTrain, CBaseEntity);
DECLARE_SERVERCLASS();
public:
CFuncTrackTrain();
void Spawn(void);
bool CreateVPhysics(void);
void Precache(void);
void UpdateOnRemove();
void MoveDone();
virtual int OnTakeDamage(const CTakeDamageInfo &info);
void Blocked(CBaseEntity *pOther);
bool KeyValue(const char *szKeyName, const char *szValue);
virtual int DrawDebugTextOverlays();
void DrawDebugGeometryOverlays();
void Next(void);
void Find(void);
void NearestPath(void);
void DeadEnd(void);
void SetTrack(CPathTrack *track) {
m_ppath = track->Nearest(GetLocalOrigin());
}
void SetControls(CBaseEntity *pControls);
bool OnControls(CBaseEntity *pControls);
void SoundStop(void);
void SoundUpdate(void);
void Start(void);
void Stop(void);
bool IsDirForward();
void SetDirForward(bool bForward);
void SetSpeed(float flSpeed, bool bAccel = false);
void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType,
float value);
void SetSpeedDirAccel(float flNewSpeed);
// Input handlers
void InputSetSpeed(inputdata_t &inputdata);
void InputSetSpeedDir(inputdata_t &inputdata);
void InputSetSpeedReal(inputdata_t &inputdata);
void InputStop(inputdata_t &inputdata);
void InputResume(inputdata_t &inputdata);
void InputReverse(inputdata_t &inputdata);
void InputStartForward(inputdata_t &inputdata);
void InputStartBackward(inputdata_t &inputdata);
void InputToggle(inputdata_t &inputdata);
void InputSetSpeedDirAccel(inputdata_t &inputdata);
void InputTeleportToPathTrack(inputdata_t &inputdata);
void InputSetSpeedForwardModifier(inputdata_t &inputdata);
static CFuncTrackTrain *Instance(edict_t *pent);
#ifdef TF_DLL
int UpdateTransmitState() { return SetTransmitState(FL_EDICT_ALWAYS); }
#endif
DECLARE_DATADESC();
virtual int ObjectCaps(void) {
return BaseClass::ObjectCaps() | FCAP_DIRECTIONAL_USE |
FCAP_USE_ONGROUND;
}
virtual void OnRestore(void);
float GetMaxSpeed() const { return m_maxSpeed; }
float GetCurrentSpeed() const { return m_flSpeed; }
float GetDesiredSpeed() const { return m_flDesiredSpeed; }
virtual bool IsBaseTrain(void) const { return true; }
void SetSpeedForwardModifier(float flModifier);
void SetBlockDamage(float flDamage) { m_flBlockDamage = flDamage; }
void SetDamageChild(bool bDamageChild) { m_bDamageChild = bDamageChild; }
private:
void ArriveAtNode(CPathTrack *pNode);
void FirePassInputs(CPathTrack *pStart, CPathTrack *pEnd, bool forward);
public:
// UNDONE: Add accessors?
CPathTrack *m_ppath;
float m_length;
#ifdef HL1_DLL
bool m_bOnTrackChange; // we don't want to find a new node if we restore
// while riding on a func_trackchange
#endif
private:
TrainVelocityType_t GetTrainVelocityType();
void UpdateTrainVelocity(CPathTrack *pnext, CPathTrack *pNextNext,
const Vector &nextPos, float flInterval);
TrainOrientationType_t GetTrainOrientationType();
void UpdateTrainOrientation(CPathTrack *pnext, CPathTrack *pNextNext,
const Vector &nextPos, float flInterval);
void UpdateOrientationAtPathTracks(CPathTrack *pnext, CPathTrack *pNextNext,
const Vector &nextPos, float flInterval);
void UpdateOrientationBlend(TrainOrientationType_t eOrientationType,
CPathTrack *pPrev, CPathTrack *pNext,
const Vector &nextPos, float flInterval);
void DoUpdateOrientation(const QAngle &curAngles, const QAngle &angles,
float flInterval);
void TeleportToPathTrack(CPathTrack *pTeleport);
Vector m_controlMins;
Vector m_controlMaxs;
Vector
m_lastBlockPos; // These are used to build a heuristic decision about
// being temporarily blocked by physics objects
int m_lastBlockTick; // ^^^^^^^
float m_flVolume;
float m_flBank;
float m_oldSpeed;
float m_flBlockDamage; // Damage to inflict when blocked.
float m_height;
float m_maxSpeed;
float m_dir;
string_t m_iszSoundMove; // Looping sound to play while moving. Pitch
// shifted based on speed.
string_t m_iszSoundMovePing; // Ping sound to play while moving. Interval
// decreased based on speed.
string_t m_iszSoundStart; // Sound to play when starting to move.
string_t m_iszSoundStop; // Sound to play when stopping.
float m_flMoveSoundMinTime; // The most often to play the move 'ping' sound
// (used at max speed)
float m_flMoveSoundMaxTime; // The least often to play the move 'ping'
// sound (used approaching zero speed)
float m_flNextMoveSoundTime;
int m_nMoveSoundMinPitch; // The sound pitch to approach as we come to a
// stop
int m_nMoveSoundMaxPitch; // The sound pitch to approach as we approach our
// max speed (actually, it's hardcoded to 1000
// in/sec)
TrainOrientationType_t m_eOrientationType;
TrainVelocityType_t m_eVelocityType;
bool m_bSoundPlaying;
COutputEvent m_OnStart, m_OnNext;
bool m_bManualSpeedChanges; // set when we want to send entity IO to govern
// speed and obey our TrainVelocityType_t
float m_flDesiredSpeed; // target speed, when m_bManualSpeedChanges is set
float m_flSpeedChangeTime;
float m_flAccelSpeed;
float m_flDecelSpeed;
bool m_bAccelToSpeed;
float m_flNextMPSoundTime;
float m_flSpeedForwardModifier;
float m_flUnmodifiedDesiredSpeed;
bool m_bDamageChild;
};
#endif // TRAINS_H