sqwarmed/sdk_src/game/server/pathtrack.h

135 lines
3.9 KiB
C++

//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
//=============================================================================//
#ifndef PATHTRACK_H
#define PATHTRACK_H
#ifdef _WIN32
#pragma once
#endif
#include "entityoutput.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_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 );
CPathTrack *m_pnext;
CPathTrack *m_pprevious;
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;
private:
void Project( CPathTrack *pstart, CPathTrack *pend, Vector &origin, float dist );
void SetPrevious( CPathTrack *pprevious );
void Link( void );
static CPathTrack *Instance( edict_t *pent );
void InputPass( 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 );
DECLARE_DATADESC();
float m_flRadius;
float m_length;
string_t m_altName;
int m_nIterVal;
TrackOrientationType_t m_eOrientationType;
COutputEvent m_OnPass;
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