//========= 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 > gm_masterCostVector; static CountdownTimer gm_dirtyTimer; void UpdateAllNavCostDecoration(void); CUtlVector 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 < MAX_NAV_TEAMS; ++i) { isBlocked |= m_isBlockingNav[i]; } return isBlocked; } teamNumber = teamNumber % MAX_NAV_TEAMS; return m_isBlockingNav[teamNumber]; } int DrawDebugTextOverlays(void); bool operator()(CNavArea *area); // functor that blocks areas in our extent static bool CalculateBlocked(bool *pResultByTeam, const Vector &vecMins, const Vector &vecMaxs); private: void UpdateBlocked(); static CUtlLinkedList 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