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

156 lines
5.4 KiB
C++

//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//===========================================================================//
// Navigation ladders
// Author: Michael S. Booth (mike@turtlerockstudios.com), January 2003
#ifndef _NAV_LADDER_H_
#define _NAV_LADDER_H_
#include "nav.h"
class CNavArea;
//--------------------------------------------------------------------------------------------------------------
/**
* The NavLadder represents ladders in the Navigation Mesh, and their
* connections to adjacent NavAreas
* @todo Deal with ladders that allow jumping off to areas in the middle
*/
class CNavLadder {
public:
CNavLadder(void) {
m_topForwardArea = NULL;
m_topRightArea = NULL;
m_topLeftArea = NULL;
m_topBehindArea = NULL;
m_bottomArea = NULL;
// set an ID for interactive editing - loads will overwrite this
m_id = m_nextID++;
}
~CNavLadder();
void OnRoundRestart(void); ///< invoked when a game round restarts
void Save(CUtlBuffer &fileBuffer, unsigned int version) const;
void Load(CUtlBuffer &fileBuffer, unsigned int version);
unsigned int GetID(void) const {
return m_id;
} ///< return this ladder's unique ID
static void CompressIDs(
void); ///< re-orders ladder ID's so they are continuous
enum LadderDirectionType {
LADDER_UP = 0,
LADDER_DOWN,
NUM_LADDER_DIRECTIONS
};
Vector m_top; ///< world coords of the top of the ladder
Vector m_bottom; ///< world coords of the top of the ladder
float m_length; ///< the length of the ladder
float m_width;
Vector GetPosAtHeight(float height)
const; ///< Compute x,y coordinate of the ladder at a given height
CNavArea *m_topForwardArea; ///< the area at the top of the ladder
CNavArea *m_topLeftArea;
CNavArea *m_topRightArea;
CNavArea *m_topBehindArea; ///< area at top of ladder "behind" it - only
///< useful for descending
CNavArea *m_bottomArea; ///< the area at the bottom of the ladder
bool IsConnected(const CNavArea *area, LadderDirectionType dir)
const; ///< returns true if given area is connected in given direction
void ConnectGeneratedLadder(
float maxHeightAboveTopArea); ///< Connect a generated ladder to nav
///< areas at the end of nav generation
void ConnectTo(CNavArea *area); ///< connect this ladder to given area
void Disconnect(
CNavArea *area); ///< disconnect this ladder from given area
void OnSplit(CNavArea *original, CNavArea *alpha,
CNavArea *beta); ///< when original is split into alpha and
///< beta, update our connections
void OnDestroyNotify(
CNavArea *dead); ///< invoked when given area is going away
void DrawLadder(void) const; ///< Draws ladder and connections
void DrawConnectedAreas(void); ///< Draws connected areas
void UpdateDangling(
void); ///< Checks if the ladder is dangling (bots cannot go up)
bool IsInUse(const CBasePlayer *ignore =
NULL) const; ///< return true if someone is on this ladder
///< (other than 'ignore')
void SetDir(NavDirType dir);
NavDirType GetDir(void) const;
const Vector &GetNormal(void) const;
void Shift(const Vector &shift); ///< shift the nav ladder
bool IsUsableByTeam(int teamNumber) const;
CBaseEntity *GetLadderEntity(void) const;
private:
void FindLadderEntity(void);
EHANDLE m_ladderEntity;
NavDirType m_dir; ///< which way the ladder faces (ie: surface normal of
///< climbable side)
Vector m_normal; ///< surface normal of the ladder surface (or Vector-ized
///< m_dir, if the traceline fails)
enum LadderConnectionType ///< Ladder connection directions, to facilitate
///< iterating over connections
{ LADDER_TOP_FORWARD = 0,
LADDER_TOP_LEFT,
LADDER_TOP_RIGHT,
LADDER_TOP_BEHIND,
LADDER_BOTTOM,
NUM_LADDER_CONNECTIONS };
CNavArea **GetConnection(LadderConnectionType dir);
static unsigned int m_nextID; ///< used to allocate unique IDs
unsigned int m_id; ///< unique area ID
};
typedef CUtlVector<CNavLadder *> NavLadderVector;
//--------------------------------------------------------------------------------------------------------------
inline bool CNavLadder::IsUsableByTeam(int teamNumber) const {
if (m_ladderEntity.Get() == NULL) return true;
int ladderTeamNumber = m_ladderEntity->GetTeamNumber();
return (teamNumber == ladderTeamNumber ||
ladderTeamNumber == TEAM_UNASSIGNED);
}
//--------------------------------------------------------------------------------------------------------------
inline CBaseEntity *CNavLadder::GetLadderEntity(void) const {
return m_ladderEntity.Get();
}
//--------------------------------------------------------------------------------------------------------------
inline NavDirType CNavLadder::GetDir(void) const { return m_dir; }
//--------------------------------------------------------------------------------------------------------------
inline const Vector &CNavLadder::GetNormal(void) const { return m_normal; }
#endif // _NAV_LADDER_H_