You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
158 lines
4.4 KiB
158 lines
4.4 KiB
//========= 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
|
|
|