|
|
//========= Copyright Valve Corporation, All rights reserved. ============//
// tf_bot_manager.h
// Team Fortress NextBotManager
// Tom Bui, May 2010
#ifndef TF_BOT_MANAGER_H
#define TF_BOT_MANAGER_H
#include "NextBotManager.h"
#include "tf_team.h"
class CTFBot; class CTFPlayer; class CTFBotSquad; class CStuckBotEvent;
//----------------------------------------------------------------------------------------------
// For parsing and displaying stuck events from server logs.
class CStuckBot { public: CStuckBot( int id, const char *name ) { m_id = id; Q_strncpy( m_name, name, 256 ); }
bool IsMatch( int id, const char *name ) { return ( id == m_id && FStrEq( name, m_name ) ); }
char m_name[256]; int m_id;
CUtlVector< CStuckBotEvent * > m_stuckEventVector; };
//----------------------------------------------------------------------------------------------
// For parsing and displaying stuck events from server logs.
class CStuckBotEvent { public: Vector m_stuckSpot; float m_stuckDuration; Vector m_goalSpot; bool m_isGoalValid;
void Draw( float deltaT = 0.1f ) { NDebugOverlay::Cross3D( m_stuckSpot, 5.0f, 255, 255, 0, true, deltaT );
if ( m_isGoalValid ) { if ( m_stuckDuration > 6.0f ) { NDebugOverlay::HorzArrow( m_stuckSpot, m_goalSpot, 2.0f, 255, 0, 0, 255, true, deltaT ); } else if ( m_stuckDuration > 3.0f ) { NDebugOverlay::HorzArrow( m_stuckSpot, m_goalSpot, 2.0f, 255, 255, 0, 255, true, deltaT ); } else { NDebugOverlay::HorzArrow( m_stuckSpot, m_goalSpot, 2.0f, 0, 255, 0, 255, true, deltaT ); } } } };
//----------------------------------------------------------------------------------------------
class CTFBotManager : public NextBotManager { public: CTFBotManager(); virtual ~CTFBotManager();
virtual void Update(); void LevelShutdown();
virtual void OnMapLoaded( void ); // when the server has changed maps
virtual void OnRoundRestart( void ); // when the scenario restarts
bool IsAllBotTeam( int iTeam ); bool IsInOfflinePractice() const; bool IsMeleeOnly() const;
CTFBot* GetAvailableBotFromPool(); void OnForceAddedBots( int iNumAdded ); void OnForceKickedBots( int iNumKicked );
void ClearStuckBotData(); CStuckBot *FindOrCreateStuckBot( int id, const char *playerClass ); // for parsing and debugging stuck bot server logs
void DrawStuckBotData( float deltaT = 0.1f );
#ifdef TF_CREEP_MODE
void OnCreepKilled( CTFPlayer *killer ); #endif
bool RemoveBotFromTeamAndKick( int nTeam );
protected: void MaintainBotQuota(); void SetIsInOfflinePractice( bool bIsInOfflinePractice ); void RevertOfflinePracticeConvars();
float m_flNextPeriodicThink;
#ifdef TF_CREEP_MODE
void UpdateCreepWaves(); CountdownTimer m_creepWaveTimer;
void SpawnCreep( int team, CTFBotSquad *squad ); void SpawnCreepWave( int team );
int m_creepExperience[ TF_TEAM_COUNT ]; #endif
void UpdateMedievalBossScenario(); bool m_isMedeivalBossScenarioSetup; void SetupMedievalBossScenario();
CUtlVector< CBaseEntity * > m_archerSpawnVector;
struct ArcherAssignmentInfo { CHandle< CBaseCombatCharacter > m_archer; CHandle< CBaseEntity > m_mark; }; CUtlVector< ArcherAssignmentInfo > m_archerMarkVector;
CountdownTimer m_archerTimer;
CUtlVector< CStuckBot * > m_stuckBotVector; CountdownTimer m_stuckDisplayTimer; };
// singleton accessor
CTFBotManager &TheTFBots( void );
#endif // TF_BOT_MANAGER_H
|