//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // // $NoKeywords: $ // //=============================================================================// // nav_entities.h // Navigation entities // Author: Michael S. Booth (mike@turtlerockstudios.com), January 2003 #ifndef NAV_ENTITIES_H #define NAV_ENTITIES_H //----------------------------------------------------------------------------------------------------- /** * An entity that modifies pathfinding cost to all areas it overlaps, to allow map designers * to tell bots to avoid/prefer certain regions. */ class CFuncNavCost : public CBaseEntity { public: DECLARE_DATADESC(); DECLARE_CLASS( CFuncNavCost, CBaseEntity ); virtual void Spawn( void ); virtual void UpdateOnRemove( void ); void InputEnable( inputdata_t &inputdata ); void InputDisable( inputdata_t &inputdata ); bool IsEnabled( void ) const { return !m_isDisabled; } void CostThink( void ); bool IsApplicableTo( CBaseCombatCharacter *who ) const; // Return true if this cost applies to the given actor virtual float GetCostMultiplier( CBaseCombatCharacter *who ) const { return 1.0f; } protected: int m_team; bool m_isDisabled; string_t m_iszTags; static CUtlVector< CHandle< CFuncNavCost > > gm_masterCostVector; static CountdownTimer gm_dirtyTimer; void UpdateAllNavCostDecoration( void ); CUtlVector< CFmtStr > m_tags; bool HasTag( const char *groupname ) const; }; //----------------------------------------------------------------------------------------------------- class CFuncNavAvoid : public CFuncNavCost { public: DECLARE_CLASS( CFuncNavAvoid, CFuncNavCost ); virtual float GetCostMultiplier( CBaseCombatCharacter *who ) const; // return pathfind cost multiplier for the given actor }; //----------------------------------------------------------------------------------------------------- class CFuncNavPrefer : public CFuncNavCost { public: DECLARE_CLASS( CFuncNavPrefer, CFuncNavCost ); virtual float GetCostMultiplier( CBaseCombatCharacter *who ) const; // return pathfind cost multiplier for the given actor }; //----------------------------------------------------------------------------------------------------- /** * An entity that can block/unblock nav areas. This is meant for semi-transient areas that block * pathfinding but can be ignored for longer-term queries like computing L4D flow distances and * escape routes. */ class CFuncNavBlocker : public CBaseEntity { DECLARE_DATADESC(); DECLARE_CLASS( CFuncNavBlocker, CBaseEntity ); public: void Spawn(); virtual void UpdateOnRemove( void ); void InputBlockNav( inputdata_t &inputdata ); void InputUnblockNav( inputdata_t &inputdata ); inline bool IsBlockingNav( int teamNumber ) const { if ( teamNumber == TEAM_ANY ) { bool isBlocked = false; for ( int i=0; i gm_NavBlockers; void BlockNav( void ); void UnblockNav( void ); bool m_isBlockingNav[MAX_NAV_TEAMS]; int m_blockedTeamNumber; bool m_bDisabled; Vector m_CachedMins, m_CachedMaxs; }; #endif // NAV_ENTITIES_H