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.
147 lines
3.4 KiB
147 lines
3.4 KiB
//========= 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
|
|
|