Ejemplo n.º 1
0
//-----------------------------------------------------------------------------
// Purpose: Static debug function to make all selected npcs run around
// Input  :
// Output :
//-----------------------------------------------------------------------------
void CAI_BaseNPC::ForceSelectedGoRandom(void) 
{
	CAI_BaseNPC *npc = gEntList.NextEntByClass( (CAI_BaseNPC *)NULL );

	while (npc)
	{
		if (npc->m_debugOverlays & OVERLAY_NPC_SELECTED_BIT) 
		{
			// If a behavior is active, we need to stop running it
			npc->SetPrimaryBehavior( NULL );
			npc->SetSchedule( SCHED_RUN_RANDOM );
			npc->GetNavigator()->SetMovementActivity(ACT_RUN);
		}
		npc = gEntList.NextEntByClass(npc);
	}
}
Ejemplo n.º 2
0
void CAI_MoveAndShootOverlay::RunShootWhileMove()
{
	if ( m_flNextMoveShootTime == FLT_MAX )
		return;

	CAI_BaseNPC *pOuter = GetOuter();

	// keep enemy if dead but try to look for a new one
	if (!pOuter->GetEnemy() || !pOuter->GetEnemy()->IsAlive())
	{
		CBaseEntity *pNewEnemy = pOuter->BestEnemy();

		if( pNewEnemy != NULL )
		{
			//New enemy! Clear the timers and set conditions.
			pOuter->SetCondition( COND_NEW_ENEMY );
			pOuter->SetEnemy( pNewEnemy );
			pOuter->SetState( NPC_STATE_COMBAT );
		}
		else
		{
			pOuter->ClearAttackConditions();
		}
		// SetEnemy( NULL );
	}

	if ( GetEnemy() == NULL || !pOuter->GetNavigator()->IsGoalActive() )
		return;

	bool bMoveAimAtEnemy = CanAimAtEnemy();

	UpdateMoveShootActivity( bMoveAimAtEnemy );

	if (bMoveAimAtEnemy)
	{
		Assert( pOuter->GetActiveWeapon() ); // This should have been caught at task start

		// time to fire?
		if ( pOuter->HasCondition( COND_CAN_RANGE_ATTACK1 ) && gpGlobals->curtime >= m_flNextMoveShootTime )
		{
			if ( m_bMovingAndShooting || GetOuter()->OnBeginMoveAndShoot() )
			{
				m_bMovingAndShooting = true;
				Activity activity = pOuter->TranslateActivity( ACT_GESTURE_RANGE_ATTACK1 );

				Assert( activity != ACT_INVALID );

				if (--m_nMoveShots > 0)
				{
					pOuter->SetLastAttackTime( gpGlobals->curtime );
					pOuter->AddGesture( activity );
					// FIXME: this seems a bit wacked
					pOuter->Weapon_SetActivity( pOuter->Weapon_TranslateActivity( ACT_RANGE_ATTACK1 ), 0 );
					m_flNextMoveShootTime = gpGlobals->curtime + pOuter->GetActiveWeapon()->GetFireRate() - 0.1;
				}
				else
				{
					m_nMoveShots = random->RandomInt( m_minBurst, m_maxBurst );
					m_flNextMoveShootTime = gpGlobals->curtime + random->RandomFloat( m_minPause, m_maxPause );
					m_bMovingAndShooting = false;
					GetOuter()->OnEndMoveAndShoot();
				}
			}
		}

		// try to keep facing towards the last known position of the enemy
		Vector vecEnemyLKP = pOuter->GetEnemyLKP();
		pOuter->AddFacingTarget( pOuter->GetEnemy(), vecEnemyLKP, 1.0, 0.8 );
	}
	else
	{
		if ( m_bMovingAndShooting )
		{
			m_bMovingAndShooting = false;
			GetOuter()->OnEndMoveAndShoot();
		}
	}
}
Ejemplo n.º 3
0
void CAI_MoveAndShootOverlay::RunShootWhileMove()
{
	if ( m_bNoShootWhileMove )
		return;

	if ( gpGlobals->curtime < m_flSuspendUntilTime )
		return;

	m_flSuspendUntilTime = MOVESHOOT_DO_NOT_SUSPEND;

	CAI_BaseNPC *pOuter = GetOuter();

	// keep enemy if dead but try to look for a new one
	if (!pOuter->GetEnemy() || !pOuter->GetEnemy()->IsAlive())
	{
		CBaseEntity *pNewEnemy = pOuter->BestEnemy();

		if( pNewEnemy != NULL )
		{
			//New enemy! Clear the timers and set conditions.
			pOuter->SetEnemy( pNewEnemy );
			pOuter->SetState( NPC_STATE_COMBAT );
		}
		else
		{
			pOuter->ClearAttackConditions();
		}
		// SetEnemy( NULL );
	}

	if( !pOuter->GetNavigator()->IsGoalActive() )
		return;

	if ( GetEnemy() == NULL )
	{
		if ( pOuter->GetAlternateMoveShootTarget() )
		{
			// Aim at this other thing if I can't aim at my enemy.
			pOuter->AddFacingTarget( pOuter->GetAlternateMoveShootTarget(), pOuter->GetAlternateMoveShootTarget()->GetAbsOrigin(), 1.0, 0.2 );
		}

		return;
	}

	bool bMoveAimAtEnemy = CanAimAtEnemy();
	UpdateMoveShootActivity( bMoveAimAtEnemy );
	if ( !bMoveAimAtEnemy )
	{
		EndShootWhileMove();
		return;
	}

	Assert( HasAvailableRangeAttack() ); // This should have been caught at task start

	Activity activity;
	bool bIsReloading = false;

	if ( ( activity = pOuter->TranslateActivity( ACT_GESTURE_RELOAD ) ) != ACT_INVALID )
	{
		bIsReloading = pOuter->IsPlayingGesture( activity );
	}

	if ( !bIsReloading && HasAvailableRangeAttack() )
	{
		// time to fire?
		if ( pOuter->HasCondition( COND_CAN_RANGE_ATTACK1, false ) )
		{
			if ( pOuter->GetShotRegulator()->IsInRestInterval() )
			{
				EndShootWhileMove();
			}
			else if ( pOuter->GetShotRegulator()->ShouldShoot() )
			{
				if ( m_bMovingAndShooting || pOuter->OnBeginMoveAndShoot() )
				{
					m_bMovingAndShooting = true;
					pOuter->OnRangeAttack1();

					activity = pOuter->TranslateActivity( ACT_GESTURE_RANGE_ATTACK1 );
					Assert( activity != ACT_INVALID );

					pOuter->AddGesture( activity );

					// FIXME: this seems a bit wacked
					pOuter->Weapon_SetActivity( pOuter->Weapon_TranslateActivity( ACT_RANGE_ATTACK1 ), 0 );
				}
			}
		}
		else if ( pOuter->HasCondition( COND_NO_PRIMARY_AMMO, false ) )
		{
			if ( pOuter->GetNavigator()->GetPathTimeToGoal() > 1.0 )
			{
				activity = pOuter->TranslateActivity( ACT_GESTURE_RELOAD );
				if ( activity != ACT_INVALID && GetOuter()->HaveSequenceForActivity( activity ) )
					pOuter->AddGesture( activity );
			}
		}
	}

	// try to keep facing towards the last known position of the enemy
	Vector vecEnemyLKP = pOuter->GetEnemyLKP();
	pOuter->AddFacingTarget( pOuter->GetEnemy(), vecEnemyLKP, 1.0, 0.8 );
}