diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /game/server/tf/player_vs_environment/tf_mann_vs_machine_logic.cpp | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'game/server/tf/player_vs_environment/tf_mann_vs_machine_logic.cpp')
| -rw-r--r-- | game/server/tf/player_vs_environment/tf_mann_vs_machine_logic.cpp | 186 |
1 files changed, 186 insertions, 0 deletions
diff --git a/game/server/tf/player_vs_environment/tf_mann_vs_machine_logic.cpp b/game/server/tf/player_vs_environment/tf_mann_vs_machine_logic.cpp new file mode 100644 index 0000000..1f5d99e --- /dev/null +++ b/game/server/tf/player_vs_environment/tf_mann_vs_machine_logic.cpp @@ -0,0 +1,186 @@ +//========= 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( "" ); +} |