diff options
Diffstat (limited to 'game/server/nav_ladder.h')
| -rw-r--r-- | game/server/nav_ladder.h | 154 |
1 files changed, 154 insertions, 0 deletions
diff --git a/game/server/nav_ladder.h b/game/server/nav_ladder.h new file mode 100644 index 0000000..f5a02b0 --- /dev/null +++ b/game/server/nav_ladder.h @@ -0,0 +1,154 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//===========================================================================// + +// Navigation ladders +// Author: Michael S. Booth ([email protected]), 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_ |