source-engine/game/server/trains.h

218 lines
6.5 KiB
C
Raw Permalink Normal View History

2020-04-22 16:56:21 +00:00
//========= 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