This repository has been archived on 2024-06-13. You can view files and clone it, but cannot push or open issues or pull requests.
2020-08-04 13:13:01 -04:00

154 lines
4.6 KiB
C++

//========= 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