コード例 #1
0
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
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 );
}
コード例 #2
0
//-----------------------------------------------------------------------------
// 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;
}
コード例 #3
0
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
bool CAI_OperatorBehavior::IsGoalReady()
{
    if( GetGoalEntity()->GetState() == OPERATOR_STATE_READY )
    {
        return true;
    }

    return false;
}
コード例 #4
0
void CAI_InjuredFollowGoal::EnableGoal( CAI_BaseNPC *pAI )
{
	CAI_BehaviorAlyxInjured *pBehavior;
	if ( !pAI->GetBehavior( &pBehavior ) )
		return;

	if ( GetGoalEntity() == NULL )
		return;
	
	pBehavior->SetFollowGoal( this );
}
コード例 #5
0
//-----------------------------------------------------------------------------
// 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();
}
コード例 #6
0
//-----------------------------------------------------------------------------
// 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;
    }
}