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.
187 lines
5.4 KiB
187 lines
5.4 KiB
4 years ago
|
//========= Copyright Valve Corporation, All rights reserved. ============//
|
||
|
// tf_mann_vs_macine_logic.h
|
||
|
// Mann Vs Machine game mode singleton manager
|
||
|
// Michael Booth, June 2011
|
||
|
|
||
|
#include "cbase.h"
|
||
|
|
||
|
#include "tf_team.h"
|
||
|
#include "tf_obj_sentrygun.h"
|
||
|
#include "tf_population_manager.h"
|
||
|
#include "bot/map_entities/tf_bot_generator.h"
|
||
|
#include "player_vs_environment/tf_mann_vs_machine_logic.h"
|
||
|
#include "tf_gamerules.h"
|
||
|
#include "tf_objective_resource.h"
|
||
|
|
||
|
CHandle<CMannVsMachineLogic> g_hMannVsMachineLogic;
|
||
|
|
||
|
//-------------------------------------------------------------------------
|
||
|
//-------------------------------------------------------------------------
|
||
|
BEGIN_DATADESC( CMannVsMachineLogic )
|
||
|
DEFINE_THINKFUNC( Update ),
|
||
|
END_DATADESC()
|
||
|
|
||
|
LINK_ENTITY_TO_CLASS( tf_logic_mann_vs_machine, CMannVsMachineLogic );
|
||
|
|
||
|
//-------------------------------------------------------------------------
|
||
|
CMannVsMachineLogic::CMannVsMachineLogic()
|
||
|
{
|
||
|
InitPopulationManager();
|
||
|
|
||
|
m_flNextAlarmCheck = 0.0f;
|
||
|
}
|
||
|
|
||
|
|
||
|
//-------------------------------------------------------------------------
|
||
|
CMannVsMachineLogic::~CMannVsMachineLogic()
|
||
|
{
|
||
|
g_hMannVsMachineLogic = NULL;
|
||
|
}
|
||
|
|
||
|
|
||
|
//-------------------------------------------------------------------------
|
||
|
void CMannVsMachineLogic::Spawn( void )
|
||
|
{
|
||
|
BaseClass::Spawn();
|
||
|
|
||
|
SetThink( &CMannVsMachineLogic::Update );
|
||
|
SetNextThink( gpGlobals->curtime );
|
||
|
|
||
|
g_hMannVsMachineLogic = this;
|
||
|
}
|
||
|
|
||
|
|
||
|
//-------------------------------------------------------------------------
|
||
|
void CMannVsMachineLogic::SetupOnRoundStart( void )
|
||
|
{
|
||
|
if ( !TFGameRules() || !TFGameRules()->IsMannVsMachineMode() )
|
||
|
return;
|
||
|
|
||
|
if ( m_populationManager )
|
||
|
{
|
||
|
m_populationManager->SetupOnRoundStart();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
//--------------------------------------------------------------------------------------------------------
|
||
|
void CMannVsMachineLogic::Update( void )
|
||
|
{
|
||
|
VPROF_BUDGET( "CMannVsMachineLogic::Update", "Game" );
|
||
|
|
||
|
SetNextThink( gpGlobals->curtime + 0.05f );
|
||
|
|
||
|
if ( !TFGameRules() || !TFGameRules()->IsMannVsMachineMode() )
|
||
|
return;
|
||
|
|
||
|
if ( m_populationManager )
|
||
|
{
|
||
|
m_populationManager->Update();
|
||
|
}
|
||
|
|
||
|
// we don't need to run this check as often as we're calling our update() function
|
||
|
if ( m_flNextAlarmCheck < gpGlobals->curtime )
|
||
|
{
|
||
|
m_flNextAlarmCheck = gpGlobals->curtime + 0.1;
|
||
|
for ( int i=0; i<ICaptureFlagAutoList::AutoList().Count(); ++i )
|
||
|
{
|
||
|
CCaptureFlag *pFlag = static_cast<CCaptureFlag *>( ICaptureFlagAutoList::AutoList()[i] );
|
||
|
if ( pFlag->IsStolen() )
|
||
|
{
|
||
|
for ( int j=0; j<IFlagDetectionZoneAutoList::AutoList().Count(); ++j )
|
||
|
{
|
||
|
CFlagDetectionZone *pZone = static_cast<CFlagDetectionZone *>( IFlagDetectionZoneAutoList::AutoList()[j] );
|
||
|
if ( !pZone->IsDisabled() && pZone->IsAlarmZone() && pZone->PointIsWithin( pFlag->GetAbsOrigin() ) )
|
||
|
{
|
||
|
// Is the alarm currently off?
|
||
|
if ( TFGameRules()->GetMannVsMachineAlarmStatus() == false )
|
||
|
{
|
||
|
IGameEvent *event = gameeventmanager->CreateEvent( "mvm_bomb_alarm_triggered" );
|
||
|
if ( event )
|
||
|
{
|
||
|
gameeventmanager->FireEvent( event );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
TFGameRules()->SetMannVsMachineAlarmStatus( true );
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
TFGameRules()->SetMannVsMachineAlarmStatus( false );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CMannVsMachineLogic::InitPopulationManager( void )
|
||
|
{
|
||
|
bool bFound = false;
|
||
|
const char *pszFormat = MVM_POP_FILE_PATH "/%s.pop";
|
||
|
char szFileName[MAX_PATH] = { 0 };
|
||
|
|
||
|
// Did they request something specific?
|
||
|
if ( Q_strlen( TFGameRules()->GetNextMvMPopfile() ) )
|
||
|
{
|
||
|
Q_snprintf( szFileName, sizeof( szFileName ), pszFormat, TFGameRules()->GetNextMvMPopfile() );
|
||
|
if ( g_pFullFileSystem->FileExists( szFileName, "GAME" ) )
|
||
|
{
|
||
|
bFound = true;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// It might need the additional map prefix to find the file
|
||
|
Q_snprintf( szFileName, sizeof( szFileName ), MVM_POP_FILE_PATH "/%s_%s.pop", STRING( gpGlobals->mapname ), TFGameRules()->GetNextMvMPopfile() );
|
||
|
if ( g_pFullFileSystem->FileExists( szFileName, "GAME" ) )
|
||
|
{
|
||
|
bFound = true;
|
||
|
}
|
||
|
if ( !bFound )
|
||
|
{
|
||
|
Warning( "Population file '%s' not found", TFGameRules()->GetNextMvMPopfile() );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// See if we have any default popfiles and use the default-iest one
|
||
|
if ( !bFound )
|
||
|
{
|
||
|
CUtlVector< CUtlString > defaultPopFileList;
|
||
|
CUtlString defaultPopFileName;
|
||
|
g_pPopulationManager->FindDefaultPopulationFileShortNames( defaultPopFileList );
|
||
|
if ( defaultPopFileList.Count() )
|
||
|
{
|
||
|
if ( g_pPopulationManager->FindPopulationFileByShortName( defaultPopFileList[0], defaultPopFileName ) )
|
||
|
{
|
||
|
V_strncpy( szFileName, defaultPopFileName, sizeof( szFileName ) );
|
||
|
bFound = true;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Use mapname.pop. This won't exist but would've been the highest priority default so you'll at least get an error
|
||
|
// about the file of last resort.
|
||
|
if ( !bFound )
|
||
|
{
|
||
|
Q_snprintf( szFileName, sizeof( szFileName ), pszFormat, STRING( gpGlobals->mapname ) );
|
||
|
}
|
||
|
|
||
|
if ( m_populationManager && V_strcmp( m_populationManager->GetPopulationFilename(), szFileName ) != 0 )
|
||
|
{
|
||
|
UTIL_RemoveImmediate( m_populationManager );
|
||
|
m_populationManager = NULL;
|
||
|
}
|
||
|
|
||
|
if ( !m_populationManager )
|
||
|
{
|
||
|
m_populationManager = (CPopulationManager *)CreateEntityByName( "info_populator" );
|
||
|
m_populationManager->SetPopulationFilename( szFileName );
|
||
|
}
|
||
|
|
||
|
// Clear the Value since its now loaded
|
||
|
TFGameRules()->SetNextMvMPopfile( "" );
|
||
|
}
|