diff options
Diffstat (limited to 'game/server/tf/bot/tf_bot_manager.h')
| -rw-r--r-- | game/server/tf/bot/tf_bot_manager.h | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/game/server/tf/bot/tf_bot_manager.h b/game/server/tf/bot/tf_bot_manager.h new file mode 100644 index 0000000..4f5ec5f --- /dev/null +++ b/game/server/tf/bot/tf_bot_manager.h @@ -0,0 +1,147 @@ +//========= 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 |