//========= 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 m_pnext; CHandle m_pprevious; CHandle 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