Modified source engine (2017) developed by valve and leaked in 2020. Not for commercial purporses
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

212 lines
5.6 KiB

5 years ago
// NextBotManager.h
// Author: Michael Booth, May 2006
//========= Copyright Valve Corporation, All rights reserved. ============//
#ifndef _NEXT_BOT_MANAGER_H_
#define _NEXT_BOT_MANAGER_H_
#include "NextBotInterface.h"
class CTerrorPlayer;
//----------------------------------------------------------------------------------------------------------------
/**
* The NextBotManager manager
*/
class NextBotManager
{
public:
NextBotManager( void );
virtual ~NextBotManager();
void Reset( void ); // reset to initial state
virtual void Update( void );
bool ShouldUpdate( INextBot *bot );
void NotifyBeginUpdate( INextBot *bot );
void NotifyEndUpdate( INextBot *bot );
int GetNextBotCount( void ) const; // How many nextbots are alive right now?
/**
* Populate given vector with all bots in the system
*/
void CollectAllBots( CUtlVector< INextBot * > *botVector );
/**
* DEPRECATED: Use CollectAllBots().
* Execute functor for each NextBot in the system.
* If a functor returns false, stop iteration early
* and return false.
*/
template < typename Functor >
bool ForEachBot( Functor &func )
{
for( int i=m_botList.Head(); i != m_botList.InvalidIndex(); i = m_botList.Next( i ) )
{
if ( !func( m_botList[i] ) )
{
return false;
}
}
return true;
}
/**
* DEPRECATED: Use CollectAllBots().
* Execute functor for each NextBot in the system as
* a CBaseCombatCharacter.
* If a functor returns false, stop iteration early
* and return false.
*/
template < typename Functor >
bool ForEachCombatCharacter( Functor &func )
{
for( int i=m_botList.Head(); i != m_botList.InvalidIndex(); i = m_botList.Next( i ) )
{
if ( !func( m_botList[i]->GetEntity() ) )
{
return false;
}
}
return true;
}
/**
* Return closest bot to given point that passes the given filter
*/
template < typename Filter >
INextBot *GetClosestBot( const Vector &pos, Filter &filter )
{
INextBot *close = NULL;
float closeRangeSq = FLT_MAX;
for( int i=m_botList.Head(); i != m_botList.InvalidIndex(); i = m_botList.Next( i ) )
{
float rangeSq = ( m_botList[i]->GetEntity()->GetAbsOrigin() - pos ).LengthSqr();
if ( rangeSq < closeRangeSq && filter( m_botList[i] ) )
{
closeRangeSq = rangeSq;
close = m_botList[i];
}
}
return close;
}
/**
* Event propagators
*/
virtual void OnMapLoaded( void ); // when the server has changed maps
virtual void OnRoundRestart( void ); // when the scenario restarts
virtual void OnBeginChangeLevel( void ); // when the server is about to change maps
virtual void OnKilled( CBaseCombatCharacter *victim, const CTakeDamageInfo &info ); // when an actor is killed
virtual void OnSound( CBaseEntity *source, const Vector &pos, KeyValues *keys ); // when an entity emits a sound
virtual void OnSpokeConcept( CBaseCombatCharacter *who, AIConcept_t concept, AI_Response *response ); // when an Actor speaks a concept
virtual void OnWeaponFired( CBaseCombatCharacter *whoFired, CBaseCombatWeapon *weapon ); // when someone fires a weapon
/**
* Debugging
*/
bool IsDebugging( unsigned int type ) const; // return true if debugging system is on for the given type(s)
void SetDebugTypes( NextBotDebugType type ); // start displaying debug info of the given type(s)
void DebugFilterAdd( int index ); // add given entindex to the debug filter
void DebugFilterAdd( const char *name ); // add given name to the debug filter
void DebugFilterRemove( int index ); // remove given entindex from the debug filter
void DebugFilterRemove( const char *name ); // remove given name from the debug filter
void DebugFilterClear( void ); // clear the debug filter (remove all entries)
bool IsDebugFilterMatch( const INextBot *bot ) const; // return true if the given bot matches the debug filter
void Select( INextBot *bot ); // mark bot as selected for further operations
void DeselectAll( void );
INextBot *GetSelected( void ) const;
INextBot *GetBotUnderCrosshair( CBasePlayer *picker ); // Get the bot under the given player's crosshair
//
// Put these in a derived class
//
void OnSurvivorVomitedUpon( CTerrorPlayer *victim ); // when a Survivor has been hit by Boomer Vomit
static void SetInstance( NextBotManager *pInstance ) { sInstance = pInstance; };
static NextBotManager* GetInstance() { return sInstance; }
protected:
static NextBotManager* sInstance;
friend class INextBot;
int Register( INextBot *bot );
void UnRegister( INextBot *bot );
CUtlLinkedList< INextBot * > m_botList; // list of all active NextBots
int m_iUpdateTickrate;
double m_CurUpdateStartTime;
double m_SumFrameTime;
unsigned int m_debugType; // debug flags
struct DebugFilter
{
int index; // entindex
enum { MAX_DEBUG_NAME_SIZE = 128 };
char name[ MAX_DEBUG_NAME_SIZE ];
};
CUtlVector< DebugFilter > m_debugFilterList;
INextBot *m_selectedBot; // selected bot for further debug operations
};
inline int NextBotManager::GetNextBotCount( void ) const
{
return m_botList.Count();
}
inline bool NextBotManager::IsDebugging( unsigned int type ) const
{
if ( type & m_debugType )
{
return true;
}
return false;
}
inline void NextBotManager::SetDebugTypes( NextBotDebugType type )
{
m_debugType = (unsigned int)type;
}
inline void NextBotManager::Select( INextBot *bot )
{
m_selectedBot = bot;
}
inline void NextBotManager::DeselectAll( void )
{
m_selectedBot = NULL;
}
inline INextBot *NextBotManager::GetSelected( void ) const
{
return m_selectedBot;
}
// singleton accessor
extern NextBotManager &TheNextBots( void );
#endif // _NEXT_BOT_MANAGER_H_