//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CAI_PassengerBehaviorZombie::StartTask( const Task_t *pTask ) { switch ( pTask->iTask ) { case TASK_FACE_HINTNODE: case TASK_FACE_LASTPOSITION: case TASK_FACE_SAVEPOSITION: case TASK_FACE_TARGET: case TASK_FACE_IDEAL: case TASK_FACE_SCRIPT: case TASK_FACE_PATH: TaskComplete(); break; case TASK_PASSENGER_ZOMBIE_RANGE_ATTACK1: break; case TASK_MELEE_ATTACK1: { // Only override this if we're "in" the vehicle if ( GetPassengerState() != PASSENGER_STATE_INSIDE ) { BaseClass::StartTask( pTask ); break; } // Swipe GetOuter()->SetIdealActivity( (Activity) ACT_PASSENGER_MELEE_ATTACK1 ); // Randomly attack again in the future float flWait = random->RandomFloat( 0.0f, 1.0f ); SuppressAttack( flWait ); } break; case TASK_PASSENGER_ZOMBIE_DISMOUNT: { // Start the process of dismounting from the vehicle StartDismount(); } break; case TASK_PASSENGER_ZOMBIE_ATTACH: { if ( AttachToVehicle() ) { TaskComplete(); return; } TaskFail( "Unable to attach to vehicle!" ); } break; default: BaseClass::StartTask( pTask ); break; } }
//----------------------------------------------------------------------------- // Purpose: Build our custom interrupt cases for the behavior //----------------------------------------------------------------------------- void CAI_PassengerBehaviorZombie::BuildScheduleTestBits( void ) { // Always interrupt when we need to get in or out if ( GetPassengerState() == PASSENGER_STATE_OUTSIDE ) { GetOuter()->SetCustomInterruptCondition( GetClassScheduleIdSpace()->ConditionLocalToGlobal( COND_CAN_RANGE_ATTACK1 ) ); GetOuter()->SetCustomInterruptCondition( GetClassScheduleIdSpace()->ConditionLocalToGlobal( COND_PASSENGER_ENTERING ) ); } BaseClass::BuildScheduleTestBits(); }
//----------------------------------------------------------------------------- // Purpose: Translate into vehicle passengers //----------------------------------------------------------------------------- int CAI_PassengerBehaviorZombie::TranslateSchedule( int scheduleType ) { // We do different animations when inside the vehicle if ( GetPassengerState() == PASSENGER_STATE_INSIDE ) { if ( scheduleType == SCHED_MELEE_ATTACK1 ) return SCHED_PASSENGER_ZOMBIE_MELEE_ATTACK1; if ( scheduleType == SCHED_RANGE_ATTACK1 ) return SCHED_PASSENGER_ZOMBIE_RANGE_ATTACK1; } return BaseClass::TranslateSchedule( scheduleType ); }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CAI_PassengerBehaviorZombie::GatherVehicleStateConditions( void ) { // Call to the base BaseClass::GatherVehicleStateConditions(); // Only do this if we're on the vehicle if ( GetPassengerState() != PASSENGER_STATE_INSIDE ) return; // Calculate how our body is leaning CalculateBodyLean(); // The forward delta of the vehicle float flLateralDelta = ( m_vehicleState.m_vecDeltaVelocity.x + m_vehicleState.m_vecDeltaVelocity.y ); // Detect a sudden stop if ( flLateralDelta < -350.0f ) { if ( m_hVehicle ) { Vector vecDamageForce; m_hVehicle->GetVelocity( &vecDamageForce, NULL ); VectorNormalize( vecDamageForce ); vecDamageForce *= random->RandomFloat( 50000.0f, 60000.0f ); //NDebugOverlay::HorzArrow( GetAbsOrigin(), GetAbsOrigin() + ( vecDamageForce * 256.0f ), 16.0f, 255, 0, 0, 16, true, 2.0f ); // Fake it! CTakeDamageInfo info( m_hVehicle, m_hVehicle, vecDamageForce, GetOuter()->WorldSpaceCenter(), 200, (DMG_CRUSH|DMG_VEHICLE) ); GetOuter()->TakeDamage( info ); } } else if ( flLateralDelta < -150.0f ) { // FIXME: Realistically this should interrupt and play a schedule to do it GetOuter()->SetIdealActivity( (Activity) ACT_PASSENGER_FLINCH ); } }