diff options
Diffstat (limited to 'game/server/pathtrack.h')
| -rw-r--r-- | game/server/pathtrack.h | 158 |
1 files changed, 158 insertions, 0 deletions
diff --git a/game/server/pathtrack.h b/game/server/pathtrack.h new file mode 100644 index 0000000..b88e44c --- /dev/null +++ b/game/server/pathtrack.h @@ -0,0 +1,158 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//=============================================================================// + +#ifndef PATHTRACK_H +#define PATHTRACK_H +#ifdef _WIN32 +#pragma once +#endif + + +#include "entityoutput.h" +#include "shareddefs.h" + + +//----------------------------------------------------------------------------- +// Spawnflag for CPathTrack +//----------------------------------------------------------------------------- +#define SF_PATH_DISABLED 0x00000001 +//#define SF_PATH_FIREONCE 0x00000002 +#define SF_PATH_ALTREVERSE 0x00000004 +#define SF_PATH_DISABLE_TRAIN 0x00000008 +#define SF_PATH_TELEPORT 0x00000010 +#define SF_PATH_UPHILL 0x00000020 +#define SF_PATH_DOWNHILL 0x00000040 +#define SF_PATH_ALTERNATE 0x00008000 + + +enum TrackOrientationType_t +{ + TrackOrientation_Fixed = 0, + TrackOrientation_FacePath, + TrackOrientation_FacePathAngles, +}; + + +//----------------------------------------------------------------------------- +// Paths! +//----------------------------------------------------------------------------- +class CPathTrack : public CPointEntity +{ + DECLARE_CLASS( CPathTrack, CPointEntity ); + +public: + CPathTrack(); + + void Spawn( void ); + void Activate( void ); + void DrawDebugGeometryOverlays(); + + void ToggleAlternatePath( void ); + void EnableAlternatePath( void ); + void DisableAlternatePath( void ); + bool HasAlternathPath() const; + + void TogglePath( void ); + void EnablePath( void ); + void DisablePath( void ); + + static CPathTrack *ValidPath( CPathTrack *ppath, int testFlag = true ); // Returns ppath if enabled, NULL otherwise + + CPathTrack *GetNextInDir( bool bForward ); + CPathTrack *GetNext( void ); + CPathTrack *GetPrevious( void ); + + CPathTrack *Nearest( const Vector &origin ); + //CPathTrack *LookAhead( Vector &origin, float dist, int move ); + CPathTrack *LookAhead( Vector &origin, float dist, int move, CPathTrack **pNextNext = NULL ); + + TrackOrientationType_t GetOrientationType(); + QAngle GetOrientation( bool bForwardDir ); + + CHandle<CPathTrack> m_pnext; + CHandle<CPathTrack> m_pprevious; + CHandle<CPathTrack> m_paltpath; + + float GetRadius() const { return m_flRadius; } + + // These four methods help for circular path checking. Call BeginIteration + // before iterating, EndInteration afterwards. Call Visit on each path in the + // list. Then you can use HasBeenVisited to see if you've visited the node + // already, which means you've got a circular or lasso path. You can use the + // macro BEGIN_PATH_TRACK_ITERATION below to simplify the calls to + // BeginInteration + EndIteration. + static void BeginIteration(); + static void EndIteration(); + void Visit(); + bool HasBeenVisited() const; + + bool IsUpHill(){ return ( FBitSet( m_spawnflags, SF_PATH_UPHILL ) ) ? true : false; } + bool IsDownHill(){ return ( FBitSet( m_spawnflags, SF_PATH_DOWNHILL ) ) ? true : false; } + int GetHillType() + { + int iRetVal = HILL_TYPE_NONE; + if ( IsUpHill() ) + { + iRetVal = HILL_TYPE_UPHILL; + } + else if ( IsDownHill() ) + { + iRetVal = HILL_TYPE_DOWNHILL; + } + + return iRetVal; + } + + bool IsDisabled( void ){ return FBitSet( m_spawnflags, SF_PATH_DISABLED ); } + + void InputPass( inputdata_t &inputdata ); + void InputTeleport( inputdata_t &inputdata ); + + void InputToggleAlternatePath( inputdata_t &inputdata ); + void InputEnableAlternatePath( inputdata_t &inputdata ); + void InputDisableAlternatePath( inputdata_t &inputdata ); + + void InputTogglePath( inputdata_t &inputdata ); + void InputEnablePath( inputdata_t &inputdata ); + void InputDisablePath( inputdata_t &inputdata ); + +private: + void Project( CPathTrack *pstart, CPathTrack *pend, Vector &origin, float dist ); + void SetPrevious( CPathTrack *pprevious ); + void Link( void ); + + static CPathTrack *Instance( edict_t *pent ); + + DECLARE_DATADESC(); + + float m_flRadius; + float m_length; + string_t m_altName; + int m_nIterVal; + TrackOrientationType_t m_eOrientationType; + + COutputEvent m_OnPass; + COutputEvent m_OnTeleport; + + static int s_nCurrIterVal; + static bool s_bIsIterating; +}; + +//----------------------------------------------------------------------------- +// Used to make sure circular iteration works all nice +//----------------------------------------------------------------------------- +#define BEGIN_PATH_TRACK_ITERATION() CPathTrackVisitor _visit + +class CPathTrackVisitor +{ +public: + CPathTrackVisitor() { CPathTrack::BeginIteration(); } + ~CPathTrackVisitor() { CPathTrack::EndIteration(); } +}; + + + +#endif // PATHTRACK_H |