224 lines
7.2 KiB
C++
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
|