int CAI_SquadManager::NumSquads() { int nSquads = 0; CAI_Squad* pSquad = m_pSquads; while (pSquad) { nSquads++; pSquad = pSquad->GetNext(); } return nSquads; }
CAI_Squad *CAI_SquadManager::FindSquad( string_t squadName ) { CAI_Squad* pSquad = m_pSquads; while (pSquad) { if (FStrEq(STRING(squadName),pSquad->GetName())) { return pSquad; } pSquad = pSquad->m_pNextSquad; } return NULL; }
void Save( ISave *pSave ) { pSave->StartBlock( "Squads" ); short nSquads = (short)g_AI_SquadManager.NumSquads(); pSave->WriteShort( &nSquads ); AISquadsIter_t iter; string_t squadName; CAI_Squad* pSquad = g_AI_SquadManager.GetFirstSquad( &iter ); while (pSquad) { squadName = MAKE_STRING( pSquad->GetName() ); pSave->WriteString( "", &squadName ); // Strings require a header to be read properly pSave->WriteAll( pSquad ); pSquad = g_AI_SquadManager.GetNextSquad( &iter ); } pSave->EndBlock(); //--------------------------------- pSave->StartBlock( "Enemies" ); short nMemories = 0; CAI_BaseNPC **ppAIs = g_AI_Manager.AccessAIs(); int i; for ( i = 0; i < g_AI_Manager.NumAIs(); i++ ) { if ( ppAIs[i]->GetEnemies() ) nMemories++; } pSave->WriteShort( &nMemories ); for ( i = 0; i < g_AI_Manager.NumAIs(); i++ ) { if ( ppAIs[i]->GetEnemies() ) { CBaseEntity *p = ppAIs[i]; pSave->WriteEntityPtr( &p ); pSave->WriteAll( ppAIs[i]->GetEnemies() ); } } pSave->EndBlock(); }
void CAI_StandoffBehavior::GatherConditions() { CBaseEntity *pLeader = GetPlayerLeader(); if ( pLeader && m_TimeForceCoverHint.Expired() ) { if ( m_PlayerMoveMonitor.IsMarkSet() ) { if (m_PlayerMoveMonitor.TargetMoved( pLeader ) ) { OnChangeTacticalConstraints(); m_PlayerMoveMonitor.ClearMark(); } } else { m_PlayerMoveMonitor.SetMark( pLeader, 60 ); } } if ( m_fForceNewEnemy ) { m_TimePreventForceNewEnemy.Reset(); GetOuter()->SetEnemy( NULL ); DevMsg(2, "Forcing lose enemy from standoff\n"); } BaseClass::GatherConditions(); m_fForceNewEnemy = false; ClearCondition( COND_ABANDON_TIME_EXPIRED ); bool bAbandonStandoff = false; CAI_Squad *pSquad = GetOuter()->GetSquad(); AISquadIter_t iter; if ( GetEnemy() ) { AI_EnemyInfo_t *pEnemyInfo = GetOuter()->GetEnemies()->Find( GetEnemy() ); if ( pEnemyInfo && m_params.flAbandonTimeLimit > 0 && ( ( pEnemyInfo->timeAtFirstHand != AI_INVALID_TIME && gpGlobals->curtime - pEnemyInfo->timeLastSeen > m_params.flAbandonTimeLimit ) || ( pEnemyInfo->timeAtFirstHand == AI_INVALID_TIME && gpGlobals->curtime - pEnemyInfo->timeFirstSeen > m_params.flAbandonTimeLimit * 2 ) ) ) { SetCondition( COND_ABANDON_TIME_EXPIRED ); bAbandonStandoff = true; if ( pSquad ) { for ( CAI_BaseNPC *pSquadMate = pSquad->GetFirstMember( &iter ); pSquadMate; pSquadMate = pSquad->GetNextMember( &iter ) ) { if ( pSquadMate->IsAlive() && pSquadMate != GetOuter() ) { CAI_StandoffBehavior *pSquadmateStandoff; pSquadMate->GetBehavior( &pSquadmateStandoff ); if ( pSquadmateStandoff && pSquadmateStandoff->IsActive() && pSquadmateStandoff->m_hStandoffGoal == m_hStandoffGoal && !pSquadmateStandoff->HasCondition( COND_ABANDON_TIME_EXPIRED ) ) { bAbandonStandoff = false; break; } } } } } } if ( bAbandonStandoff ) { if ( pSquad ) { for ( CAI_BaseNPC *pSquadMate = pSquad->GetFirstMember( &iter ); pSquadMate; pSquadMate = pSquad->GetNextMember( &iter ) ) { CAI_StandoffBehavior *pSquadmateStandoff; pSquadMate->GetBehavior( &pSquadmateStandoff ); if ( pSquadmateStandoff && pSquadmateStandoff->IsActive() && pSquadmateStandoff->m_hStandoffGoal == m_hStandoffGoal ) pSquadmateStandoff->SetActive( false ); } } else SetActive( false ); } else if ( GetOuter()->m_debugOverlays & OVERLAY_NPC_SELECTED_BIT ) { if( DrawBattleLines.GetInt() != 0 ) { if ( IsBehindBattleLines( GetAbsOrigin() ) ) { NDebugOverlay::Box( GetOuter()->GetAbsOrigin(), -Vector(48,48,4), Vector(48,48,4), 255,0,0,8, 0.1 ); } else { NDebugOverlay::Box( GetOuter()->GetAbsOrigin(), -Vector(48,48,4), Vector(48,48,4), 0,255,0,8, 0.1 ); } } } }