mirror of
https://github.com/nillerusr/source-engine.git
synced 2024-12-28 17:13:03 +00:00
131 lines
3.5 KiB
C++
131 lines
3.5 KiB
C++
//========= 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<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<CFuncNavBlocker *> 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
|