//----------------------------------------------------------------------------- //----------------------------------------------------------------------------- void CAI_OperatorBehavior::GatherConditions( void ) { if( GetGoalEntity() ) { if( GetGoalEntity()->GetState() == OPERATOR_STATE_FINISHED ) { if( IsCurSchedule(SCHED_OPERATOR_OPERATE) ) { // Break us out of the operator schedule if the operation completes. SetCondition(COND_PROVOKED); } m_hGoalEntity.Set(NULL); m_hPositionEnt.Set(NULL); } else { if( CanSeePositionEntity() ) { ClearCondition( COND_OPERATOR_LOST_SIGHT_OF_POSITION ); } else { SetCondition( COND_OPERATOR_LOST_SIGHT_OF_POSITION ); } } } BaseClass::GatherConditions(); // Ignore player pushing. ClearCondition( COND_PLAYER_PUSHING ); }
//----------------------------------------------------------------------------- // Purpose: // Output : Returns true on success, false on failure. //----------------------------------------------------------------------------- bool CAI_OperatorBehavior::CanSelectSchedule() { if ( m_hGoalEntity.Get() == NULL ) return false; if ( m_hPositionEnt.Get() == NULL ) return false; if( GetGoalEntity()->GetState() == OPERATOR_STATE_FINISHED ) { m_hGoalEntity.Set(NULL); m_hPositionEnt.Set(NULL); return false; } if ( !GetOuter()->IsInterruptable() ) return false; if ( GetOuter()->m_NPCState == NPC_STATE_COMBAT || GetOuter()->m_NPCState == NPC_STATE_SCRIPT ) return false; // Don't grab NPCs who have been in combat recently if ( GetOuter()->GetLastEnemyTime() && (gpGlobals->curtime - GetOuter()->GetLastEnemyTime()) < 3.0 ) return false; if( !CanSeePositionEntity() ) return false; return true; }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- bool CAI_OperatorBehavior::IsGoalReady() { if( GetGoalEntity()->GetState() == OPERATOR_STATE_READY ) { return true; } return false; }
void CAI_InjuredFollowGoal::EnableGoal( CAI_BaseNPC *pAI ) { CAI_BehaviorAlyxInjured *pBehavior; if ( !pAI->GetBehavior( &pBehavior ) ) return; if ( GetGoalEntity() == NULL ) return; pBehavior->SetFollowGoal( this ); }
//----------------------------------------------------------------------------- // Purpose: // Output : int //----------------------------------------------------------------------------- int CAI_OperatorBehavior::SelectSchedule() { if( !IsAtPositionEntity() ) { GetGoalEntity()->m_OnBeginApproach.FireOutput( GetOuter(), GetOuter(), 0 ); return SCHED_OPERATOR_APPROACH_POSITION; } if( GetGoalEntity() && GetGoalEntity()->GetState() != OPERATOR_STATE_FINISHED) { if( GetOuter()->GetActiveWeapon() && !GetOuter()->IsWeaponHolstered() ) { GetOuter()->SetDesiredWeaponState( DESIREDWEAPONSTATE_HOLSTERED ); return SCHED_OPERATOR_WAIT_FOR_HOLSTER; } return SCHED_OPERATOR_OPERATE; } return BaseClass::SelectSchedule(); }
//----------------------------------------------------------------------------- // Purpose: // Input : *pTask - //----------------------------------------------------------------------------- void CAI_OperatorBehavior::StartTask( const Task_t *pTask ) { switch( pTask->iTask ) { case TASK_OPERATOR_OPERATE: { // Fire the appropriate output! switch( GetGoalEntity()->GetState() ) { case OPERATOR_STATE_NOT_READY: GetGoalEntity()->m_OnMakeReady.FireOutput(NULL, NULL, 0); break; case OPERATOR_STATE_READY: GetGoalEntity()->m_OnBeginOperating.FireOutput(NULL, NULL, 0); break; default: //!!!HACKHACK Assert(0); break; } } TaskComplete(); break; case TASK_OPERATOR_START_PATH: { ChainStartTask(TASK_WALK_PATH); } break; case TASK_OPERATOR_GET_PATH_TO_POSITION: { CBaseEntity *pGoal = m_hPositionEnt; if( !pGoal ) { TaskFail("ai_goal_operator has no location entity\n"); break; } AI_NavGoal_t goal( pGoal->GetAbsOrigin() ); goal.pTarget = pGoal; if ( GetNavigator()->SetGoal( goal ) == false ) { TaskFail( "Can't build path\n" ); /* // Try and get as close as possible otherwise AI_NavGoal_t nearGoal( GOALTYPE_LOCATION_NEAREST_NODE, m_hTargetObject->GetAbsOrigin(), AIN_DEF_ACTIVITY, 256 ); if ( GetNavigator()->SetGoal( nearGoal, AIN_CLEAR_PREVIOUS_STATE ) ) { //FIXME: HACK! The internal pathfinding is setting this without our consent, so override it! ClearCondition( COND_TASK_FAILED ); GetNavigator()->SetArrivalDirection( m_hTargetObject->GetAbsAngles() ); TaskComplete(); return; } */ } GetNavigator()->SetArrivalDirection( pGoal->GetAbsAngles() ); } break; default: BaseClass::StartTask( pTask ); break; } }