mirror of
https://github.com/nillerusr/source-engine.git
synced 2026-08-11 03:09:36 +00:00
1
This commit is contained in:
@@ -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
|
||||
Reference in New Issue
Block a user