This site is a testing version, but all data is shared with the live forum.


Raised This Month: $ Target: $400
 0% 

[ES][OFF] Todas las Boludeces Aca!!


Post New Thread Closed Thread   
 
Thread Tools Display Modes
nicolazo103
Veteran Member
Join Date: Jan 2009
Location: I have no fu*** idea
Old 12-17-2009 , 00:08   Re: [ES][OFF] Todas las Boludeces Aca!!
#91



__________________
Why do they send babies to fight me? -Heavy


Last edited by nicolazo103; 12-17-2009 at 00:13.
nicolazo103 is offline
Mauricio
Veteran Member
Join Date: Feb 2009
Location: Monterrey, Nuevo Leon, M
Old 12-17-2009 , 01:33   Re: [ES][OFF] Todas las Boludeces Aca!!
#92

si eres ultimo no fuera a Mexico u.u


pero comoquiera esta bueno jajaj
__________________
[C]apo[s]trike Zombie Levels Server
IP:
69.162.123.19:27015

Enter now, you won´t regret.
Entra ya, no te retractaras.
Mauricio is offline
Send a message via MSN to Mauricio
Alucard^
AMXX Moderator: Others
Join Date: Sep 2007
Location: Street
Old 12-17-2009 , 18:58   Re: [ES][OFF] Todas las Boludeces Aca!!
#93

Lo puse sticky, asi ya no hay tantos threads con temas estupidos, boludeces y demas.
__________________
Approved Plugins - Steam Profile

Public non-terminated projects:
All Admins Menu, HLTV parameters, Subnick,
Second Password (cool style), InfoZone,
Binary C4 plant/defuse, and more...

Private projects:
NoSpec (+menu), NV Surf Management,
PM Adanved System, KZ longjump2, and more...
Alucard^ is offline
Send a message via Skype™ to Alucard^
01101101
BANNED
Join Date: Nov 2009
Location: 9`su 09`n0n7e`r0f76a
Old 12-17-2009 , 19:01   Re: [ES][OFF] Todas las Boludeces Aca!!
#94

Chicas decir "por favor" para obtener lo que quieren ... en la espalda con espalda comerciales
Estoy mirando los Bravos de Atlanta y Cardenales de San Luis jugar en el Juego de Fox de la Semana. Tengo que hacerlo. Fox no permite los juegos de béisbol de otro tipo que se emitirá comenzar al mismo tiempo, por lo que es esto o de fútbol americano universitario. Eso es como elegir entre las manzanas y berenjenas.
Y no ha sido del todo malo. Quiero decir, Tim Hudson conectó su primer jonrón de la liga mayor, justo después de Chris Rose y Mark Grace, discutieron que había 18 jonrones en la universidad como un bateador. Me encanta esa mierda.
Más tarde, se obtiene un corte comercial, con este comercial de Anheuser Busch consumo responsable de alcohol. Luego, el mismo lugar del día, se presente de Just for Men comerciales.
No he visto nada parecido desde que Family Guy transmitió un derecho comercial de Volkswagen después de que los nazis invadieron Polonia.
01101101 is offline
01101101
BANNED
Join Date: Nov 2009
Location: 9`su 09`n0n7e`r0f76a
Old 12-17-2009 , 19:03   Re: [ES][OFF] Todas las Boludeces Aca!!
#95

Flying Boat no vuela alto, todavía está fresco

Rudy Heeman, un inventor de Nueva Zelanda, ha desarrollado un hidroavión. Es un concepto similar a esta cosa, pero no volar a alturas loco. Que es dulce, ya que no necesitará una licencia de piloto para volar. Rudy es todavía la finalización del diseño, así que no hay palabra sobre el precio todavía. Todo lo que sé es que quiero uno. Voy a usar mi chapoteadero para levantar el vuelo, y luego volar a esa perra de la tienda de licores. Estoy cansado de andar la cortadora de césped en todas partes.

Flying Boat invención Casi Listo para el despegue [therawfeed]
01101101 is offline
01101101
BANNED
Join Date: Nov 2009
Location: 9`su 09`n0n7e`r0f76a
Old 12-17-2009 , 19:04   Re: [ES][OFF] Todas las Boludeces Aca!!
#96

01101101 is offline
01101101
BANNED
Join Date: Nov 2009
Location: 9`su 09`n0n7e`r0f76a
Old 12-17-2009 , 19:06   Re: [ES][OFF] Todas las Boludeces Aca!!
#97

Hook a sus lectores con la tensión
Por Laura Backes, Write4Kids.com

Tensión. Sin ella, la vida sería - seamos sinceros - aburrido. Así que la ficción. Obras de tensión con el conflicto de elevar el nivel emocional del texto a un punto de ebullición. Se obliga al lector a ser invertidos en la historia. Pero los escritores de libros de muchos niños tienen miedo de aplicar demasiada tensión a sus parcelas. Ellos piensan que los niños no pueden manejar la situación. Piense otra vez.

"Tension" es una palabra cargada, y puede ser engañosa. Una mejor manera de pensar acerca de la tensión podría ser la de elevar constantemente el juego para tu personaje, así que tiene que trabajar para conseguir lo que quiere. En su libro "personajes dinámicos: Cómo crear personalidades que mantienen a los lectores cautivados", Nancy Kress, dice, "La ficción ... exige un patrón de creciente tensión. Así, si se están formando verdaderos hechos de la vida en la ficción, debe cambiar su disposición en el tipo de patrón ... el que pone presión cada vez mayor de su protagonista ".

La tensión es lo que los ganchos a los lectores de cualquier edad y los mantiene a pasar las páginas. Los autores emplean muchos métodos de aumentar la presión sobre sus personajes. Aquí están algunos que puede probar:

* El reloj. Un límite de tiempo presenta automático de presión. Si su personaje tiene que alcanzar su meta por un tiempo determinado, o dictamen conforme al fracaso, las apuestas son planteadas desde el comienzo de la historia. Si a continuación, colocar obstáculos imprevistos en el camino de tu personaje, mejor que mejor. El reloj puede proporcionar la tensión mental (es un objetivo personal para tu personaje para lograr algo dentro de un período de tiempo designado), la tensión emocional (el personaje sufrirá la vergüenza o la lástima que la tarea no se termine a tiempo), o de peligro inminente (el daño se venir al carácter o alguien que se preocupa cuando se acabe el tiempo).

* Diálogo. La forma en que las embarcaciones de conversaciones entre los personajes de manera eficaz puede elevar la tensión de forma sutil o abierta. Si el protagonista quiere algo del otro personaje, pero no quiere que el carácter de saber, la tensión subyace en la conversación aparentemente inocente. Otro personaje puede desear la información de su protagonista, que deja de lado la cuestión. O bien, el diálogo puede ser abierta confrontación. En cualquier caso, el intercambio empuja la historia hasta el punto de trama siguiente.

* El ritmo. Bueno ficción escrita tiene altos y bajos para el ritmo de la historia. Cada vez que su personaje da en un punto de crisis, el ritmo se acelera. Una vez que se resuelve la crisis, la historia puede tomar un ritmo más pausado, dando a su protagonista (y el lector) de un breve receso. Pero pronto se presenta otra crisis, esta vez mayor que la anterior. El "reflujos" se hacen más cortos, como la trama se acelera, finalmente culminando en el clímax. Su lector se anticipa a estos picos en la tensión, y se tira a través de la historia.

* Estructura de la oración. Frases cortas y entrecortadas por la tensión verbos activos de la señal. Piense en la creación de reflejo de texto en los latidos del corazón de su protagonista. De largo, sinuoso lleno de frases con adjetivos y adverbios implica un ritmo relajado. Variando el formato del texto se dispara la tensión en momentos clave de cada escena.

Cada historia requiere un tipo diferente de tensión. Libros ilustrados para lectores jóvenes Gentle podría simplemente poner un obstáculo en el camino del personaje que debe ser superado por el final del libro. La tensión puede provenir de errores humorístico del protagonista mientras se alcanza su objetivo. Las apuestas son mucho más altos en las novelas de adultos jóvenes, en la que la tensión puede venir de la vida-las situaciones cambiantes. Pero la tensión, en cualquier forma, deben estar presentes para un libro para vender en el mercado competitivo de hoy. Y, además, la tensión hace que la historia sea más divertido de leer ... y escribir.

Laura Backes es el autor de "Best Books for Kids Who (Think They) Hate to Read" de Prima / Random House. Ella es también el editor del libro Children's Insider, el boletín informativo para los escritores de los niños. Para obtener más información acerca de cómo escribir libros para niños, incluyendo artículos gratis, consejos de mercado, secretos de expertos y mucho más, visite Children's Book Insider's Home en la web en http://write4kids.com

Copyright 2002, Children's Book Insider, LLC
01101101 is offline
01101101
BANNED
Join Date: Nov 2009
Location: 9`su 09`n0n7e`r0f76a
Old 12-17-2009 , 19:12   Re: [ES][OFF] Todas las Boludeces Aca!!
#98

PHP Code:
void CAI_BaseActor::StudioFrameAdvance ()
{
    
// clear out head and eye latched values
    
m_fLatchedPositions &= ~(HUMANOID_LATCHED_ALL);

    
BaseClass::StudioFrameAdvance();
}


void CAI_BaseActor::Precache()
{
    
BaseClass::Precache();

    if ( 
NULL_STRING != m_iszExpressionOverride )
    {
        
PrecacheInstancedSceneSTRINGm_iszExpressionOverride ) );
    }

    if ( 
m_iszIdleExpression != NULL_STRING )
    {
        
PrecacheInstancedSceneSTRING(m_iszIdleExpression ) );
    }

    if ( 
m_iszCombatExpression != NULL_STRING )
    {
        
PrecacheInstancedSceneSTRING(m_iszCombatExpression ) );
    }

    if ( 
m_iszAlertExpression != NULL_STRING )
    {
        
PrecacheInstancedSceneSTRING(m_iszAlertExpression) );
    }

    if ( 
m_iszDeathExpression != NULL_STRING )
    {
        
PrecacheInstancedSceneSTRING(m_iszDeathExpression) );
    }
}

static 
char const *g_ServerSideFlexControllers[] = 
{
    
"body_rightleft",
    
//"body_updown",
    //"body_tilt",
    
"chest_rightleft",
    
//"chest_updown",
    //"chest_tilt",
    
"head_forwardback",
    
"head_rightleft",
    
"head_updown",
    
"head_tilt",

    
"gesture_updown",
    
"gesture_rightleft"
};

//-----------------------------------------------------------------------------
// Purpose: Static method 
// Input  : *szName - 
// Output : Returns true on success, false on failure.
//-----------------------------------------------------------------------------
bool CAI_BaseActor::IsServerSideFlexControllerchar const *szName )
{
    
int c ARRAYSIZEg_ServerSideFlexControllers );
    for ( 
int i 0c; ++)
    {
        if ( !
Q_stricmpszNameg_ServerSideFlexControllers] ) )
            return 
true;
    }
    return 
false;
}

void CAI_BaseActor::SetModel( const char *szModelName )
{
    
BaseClass::SetModelszModelName );

    
//Init( m_ParameterBodyTransY, "body_trans_Y" );
    //Init( m_ParameterBodyTransX, "body_trans_X" );
    //Init( m_ParameterBodyLift, "body_lift" );
    
Initm_ParameterBodyYaw"body_yaw" );
    
//Init( m_ParameterBodyPitch, "body_pitch" );
    //Init( m_ParameterBodyRoll, "body_roll" );
    
Initm_ParameterSpineYaw"spine_yaw" );
    
//Init( m_ParameterSpinePitch, "spine_pitch" );
    //Init( m_ParameterSpineRoll, "spine_roll" );
    
Initm_ParameterNeckTrans"neck_trans" );
    
Initm_ParameterHeadYaw"head_yaw" );
    
Initm_ParameterHeadPitch"head_pitch" );
    
Initm_ParameterHeadRoll"head_roll" );

    
//Init( m_FlexweightMoveRightLeft, "move_rightleft" );
    //Init( m_FlexweightMoveForwardBack, "move_forwardback" );
    //Init( m_FlexweightMoveUpDown, "move_updown" );
    
Initm_FlexweightBodyRightLeft"body_rightleft" );
    
//Init( m_FlexweightBodyUpDown, "body_updown" );
    //Init( m_FlexweightBodyTilt, "body_tilt" );
    
Initm_FlexweightChestRightLeft"chest_rightleft" );
    
//Init( m_FlexweightChestUpDown, "chest_updown" );
    //Init( m_FlexweightChestTilt, "chest_tilt" );
    
Initm_FlexweightHeadForwardBack"head_forwardback" );
    
Initm_FlexweightHeadRightLeft"head_rightleft" );
    
Initm_FlexweightHeadUpDown"head_updown" );
    
Initm_FlexweightHeadTilt"head_tilt" );

    
Initm_ParameterGestureHeight"gesture_height" );
    
Initm_ParameterGestureWidth"gesture_width" );
    
Initm_FlexweightGestureUpDown"gesture_updown" );
    
Initm_FlexweightGestureRightLeft"gesture_rightleft" );
}


//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------

bool CAI_BaseActor::StartSceneEventCSceneEventInfo *infoCChoreoScene *sceneCChoreoEvent *eventCChoreoActor *actorCBaseEntity *pTarget )
{
    
Assertinfo );
    
Assertinfo->m_pScene );
    
Assertinfo->m_pEvent );

    
// FIXME: this code looks duplicated
    
switch ( info->m_pEvent->GetType() )
    {
    case 
CChoreoEvent::FACE
        {
            return 
BaseClass::StartSceneEventinfosceneeventactorpTarget );
        }
        break;

    case 
CChoreoEvent::GENERIC:
        {
            if (
stricmpevent->GetParameters(), "AI_BLINK") == 0)
            {
                
info->m_nType SCENE_AI_BLINK;
                
// blink eyes
                
Blink();
                
// don't blink for duration, or next random blink time
                
float flDuration = (event->GetEndTime() - scene->GetTime());
                
m_flBlinktime gpGlobals->curtime maxflDurationrandom->RandomFloat1.54.5 ) ); 
            }
            else if (
stricmpevent->GetParameters(), "AI_HOLSTER") == 0)
            {
                
// FIXME: temp code for test
                
info->m_nType SCENE_AI_HOLSTER;
                
info->m_iLayer HolsterWeapon();
                return 
true;
            }
            else if (
stricmpevent->GetParameters(), "AI_UNHOLSTER") == 0)
            {
                
// FIXME: temp code for test
                
info->m_nType SCENE_AI_UNHOLSTER;
                
info->m_iLayer UnholsterWeapon();
                return 
true;
            }
            else if (
stricmpevent->GetParameters(), "AI_AIM") == 0)
            {
                
info->m_nType SCENE_AI_AIM;
                
info->m_hTarget pTarget;
            }
            else if (
stricmpevent->GetParameters(), "AI_RANDOMLOOK") == 0)
            {
                
info->m_nType SCENE_AI_RANDOMLOOK;
                
info->m_flNext 0.0;
            }
            else if (
stricmpevent->GetParameters(), "AI_RANDOMFACEFLEX") == 0)
            {
                
info->m_nType SCENE_AI_RANDOMFACEFLEX;
                
info->m_flNext 0.0;
                
info->InitWeightthis );
            }
            else if (
stricmpevent->GetParameters(), "AI_RANDOMHEADFLEX") == 0)
            {
                
info->m_nType SCENE_AI_RANDOMHEADFLEX;
                
info->m_flNext 0.0;
            }    
            else if (
stricmpevent->GetParameters(), "AI_IGNORECOLLISION") == 0)
            {
                
CBaseEntity *pTarget FindNamedEntityevent->GetParameters2( ) );

                if (
pTarget)
                {
                    
info->m_nType SCENE_AI_IGNORECOLLISION;
                    
info->m_hTarget pTarget;
                    
float remaining event->GetEndTime() - scene->GetTime();
                    
NPCPhysics_CreateSolverthispTargettrueremaining );
                    
info->m_flNext gpGlobals->curtime remaining;
                    return 
true;
                }
                else
                {
                    
Warning"CSceneEntity %s unable to find actor named \"%s\"\n"scene->GetFilename(), event->GetParameters2() );
                    return 
false;
                }
            }
            else if (
stricmpevent->GetParameters(), "AI_DISABLEAI") == 0)
            {
                
info->m_nType SCENE_AI_DISABLEAI;
            }
            else
            {
                return 
BaseClass::StartSceneEventinfosceneeventactorpTarget );
            }
            return 
true;
        }
        break;

    default:
        return 
BaseClass::StartSceneEventinfosceneeventactorpTarget );
    }
}


bool CAI_BaseActor::ProcessSceneEventCSceneEventInfo *infoCChoreoScene *sceneCChoreoEvent *event )
{
    
Assertinfo );
    
Assertinfo->m_pScene );
    
Assertinfo->m_pEvent );

    
// FIXME: this code looks duplicated
    
switch ( info->m_pEvent->GetType() )
    {
    case 
CChoreoEvent::FACE
        {
            
// make sure target exists
            
if (info->m_hTarget == NULL)
                return 
false;

            
bool bInScene false;
            
            
// lockbodyfacing is designed to run on top of both normal AI and on top of
            // scripted_sequences.  By allowing torso turns during post-idles, pre-idles, 
            // act-busy's, scripted_sequences, normal AI movements, etc., it increases 
            // the functionality of those AI features without breaking their assuptions 
            // that the entity won't be made to "turn" by something outside of those 
            // AI's control.
            // lockbody facing is also usefull when npcs are moving and you want them to turn
            // towards something but still walk in the direction of travel.
            
if (!event->IsLockBodyFacing())
                
bInScene EnterSceneSequencesceneeventtrue );

            
// make sure we're still able to play this command
            
if (!info->m_bStarted)
            {
                
info->m_flInitialYaw GetLocalAngles().y;
                
info->m_flTargetYaw info->m_flInitialYaw;
                
info->m_flFacingYaw info->m_flInitialYaw;
                if (
IsMoving())
                {
                    
info->m_flWeight 1.0;
                }
                else
                {
                    
info->m_flWeight 0.0;
                }
            }

            
// lock in place if aiming at self
            
if (info->m_hTarget == this)
            {
                return 
true;
            }

            if (!
bInScene || info->m_bIsMoving != IsMoving())
            {
                
info->m_flInitialYaw GetLocalAngles().y;
            }
            
info->m_bIsMoving IsMoving();

            
// Msg("%f : %f - %f\n", scene->GetTime(), event->GetStartTime(), event->GetEndTime() );
            
float flTime clampscene->GetTime(), event->GetStartTime(), event->GetEndTime() - 0.1 );
            
float intensity event->GetIntensityflTime );

            
// clamp in-ramp to 0.5 seconds
            
float flDuration scene->GetTime() - event->GetStartTime();
            
float flMaxIntensity flDuration 0.5f SimpleSplineflDuration 0.5f ) : 1.0f;
            
intensity clampintensity0.0fflMaxIntensity );

            if (
bInScene && info->m_bIsMoving)
            {
                
info->m_flInitialYaw GetLocalAngles().y;
            }

            if (!
event->IsLockBodyFacing())
            {
                if (!
info->m_bIsMoving && bInScene)
                {
                    
AccumulateIdealYawinfo->m_flFacingYawintensity );
                }
            }

            
float diff;
            
float dir;
            
float flSpineYaw;
            
float flBodyYaw;
            
            
// move upper body to account for missing body yaw
            
diff UTIL_AngleDiffinfo->m_flTargetYawGetLocalAngles().);
            if (
diff 0)
            {
                
diff = -diff;
                
dir = -1;
            }
            else
            {
                
dir 1;
            }
            
flSpineYaw mindiff30 );
            
flBodyYaw mindiff flSpineYaw30 );
            
m_goalSpineYaw m_goalSpineYaw * (1.0 intensity) + intensity flSpineYaw dir;
            
m_goalBodyYaw m_goalBodyYaw * (1.0 intensity) + intensity flBodyYaw dir;

            
/*
            NDebugOverlay::YawArrow( GetAbsOrigin(), GetLocalAngles().y, 64, 16, 255, 255, 255, 0, true, 0.1 );
            NDebugOverlay::YawArrow( GetAbsOrigin() + Vector( 0, 0, 8 ), GetLocalAngles().y + m_goalBodyYaw, 64, 16, 255, 128, 128, 0, true, 0.1 );
            NDebugOverlay::YawArrow( GetAbsOrigin() + Vector( 0, 0, 16 ), GetLocalAngles().y + m_goalSpineYaw, 64, 16, 128, 255, 128, 0, true, 0.1 );
            NDebugOverlay::YawArrow( GetAbsOrigin() + Vector( 0, 0, 24 ), info->m_flTargetYaw, 64, 16, 128, 128, 255, 0, true, 0.1 );
            */

            
CAI_BaseNPC *pGoalNpc info->m_hTarget->MyNPCPointer();

            
float goalYaw GetLocalAngles().y;
            
            if ( 
pGoalNpc )
            {
                
goalYaw CalcIdealYawpGoalNpc->FacingPosition() );
            }
            else
            {
                
goalYaw CalcIdealYawinfo->m_hTarget->EyePosition() );
            }

            if (
developer.GetInt() > && scene_showfaceto.GetBool())
            {
                
NDebugOverlay::YawArrowGetAbsOrigin() + Vector00), goalYaw32 intensity82552552550true0.12 );
            }

            
diff UTIL_AngleDiffgoalYawinfo->m_flInitialYaw ) * intensity;
            
dir 1.0;

            
// debounce delta a bit
            
info->m_flTargetYaw UTIL_AngleModinfo->m_flInitialYaw diff );

            if (
diff 0)
            {
                
diff = -diff;
                
dir = -1;
            }

            
// calc how much to use the spine for turning
            
float spineintensity = (1.0 max0.0, (intensity 0.5) / 0.5 ));
            
// force spine to full if not in scene or locked
            
if (!bInScene || event->IsLockBodyFacing() )
            {
                
spineintensity 1.0;
            }

            
flSpineYaw mindiff spineintensity30 );
            
flBodyYaw mindiff spineintensity flSpineYaw30 );
            
info->m_flFacingYaw info->m_flInitialYaw + (diff flBodyYaw flSpineYaw) * dir;

            if (!
event->IsLockBodyFacing())
            {
                
AddFacingTargetinfo->m_hTargetintensity0.2 ); // facing targets are lagged by one frame
            
}
            return 
true;
        }
    case 
CChoreoEvent::GENERIC:
        {
            switch(
info->m_nType)
            {
                case 
SCENE_AI_BLINK:
                    {
                        
// keep eyes not blinking for duration
                        
float flDuration = (event->GetEndTime() - scene->GetTime());
                        
m_flBlinktime maxm_flBlinktimegpGlobals->curtime flDuration );
                    }
                    return 
true;
                case 
SCENE_AI_HOLSTER:
                    {
                    }
                    return 
true;
                case 
SCENE_AI_UNHOLSTER:
                    {
                    }
                    return 
true;
                case 
SCENE_AI_AIM:
                    {
                        if ( 
info->m_hTarget )
                        {
                            
Vector vecAimTargetLoc info->m_hTarget->EyePosition();
                            
Vector vecAimDir vecAimTargetLoc EyePosition();

                            
VectorNormalizevecAimDir );
                            
SetAimvecAimDir);
                        }
                    }
                    return 
true;
                case 
SCENE_AI_RANDOMLOOK:
                    {
                        if (
info->m_flNext gpGlobals->curtime)
                        {
                            
info->m_flNext gpGlobals->curtime PickLookTargetm_syntheticLookQueue ) - 0.4;
                            if (
m_syntheticLookQueue.Count() > 0)
                            {
                                
float flDuration = (event->GetEndTime() - scene->GetTime());
                                
int i m_syntheticLookQueue.Count() - 1;
                                
m_syntheticLookQueue[i].m_flEndTime minm_syntheticLookQueue[i].m_flEndTimegpGlobals->curtime flDuration );
                                
m_syntheticLookQueue[i].m_flInterest 0.1;
                            }
                        }
                    }
                    return 
true;
                case 
SCENE_AI_RANDOMFACEFLEX:
                    return 
RandomFaceFlexinfosceneevent );
                case 
SCENE_AI_RANDOMHEADFLEX:
                    return 
true;
                case 
SCENE_AI_IGNORECOLLISION:
                    if (
info->m_hTarget && info->m_flNext gpGlobals->curtime)
                    {
                        
float remaining event->GetEndTime() - scene->GetTime();
                        
NPCPhysics_CreateSolverthisinfo->m_hTargettrueremaining );
                        
info->m_flNext gpGlobals->curtime remaining;
                    }

                    
// FIXME: needs to handle scene pause
                    
return true;
                case 
SCENE_AI_DISABLEAI:
                    if (!(
GetState() == NPC_STATE_SCRIPT  || IsCurScheduleSCHED_SCENE_GENERIC )) )
                    {
                        
EnterSceneSequencesceneevent );
                    }
                    return 
true;
                default:
                    return 
false;
            }
        }
        break;
    default:
        return 
BaseClass::ProcessSceneEventinfosceneevent );
    }
}


bool CAI_BaseActor::RandomFaceFlexCSceneEventInfo *infoCChoreoScene *sceneCChoreoEvent *event )
{
    if (
info->m_flNext gpGlobals->curtime)
    {
        const 
flexsettinghdr_t *pSettinghdr = ( const flexsettinghdr_t * )FindSceneFileevent->GetParameters2() );
        if (
pSettinghdr == NULL)
        {
            
pSettinghdr = ( const flexsettinghdr_t * )FindSceneFile"random" );
        }
        if ( 
pSettinghdr )
        {
            
info->m_flNext gpGlobals->curtime random->RandomFloat0.30.5 ) * (30.0 pSettinghdr->numflexsettings);

            
flexsetting_t const *pSetting NULL;
            
pSetting pSettinghdr->pSettingrandom->RandomInt0pSettinghdr->numflexsettings ) );

            
flexweight_t *pWeights NULL;
            
int truecount pSetting->psetting( (byte *)pSettinghdr0, &pWeights );
            if ( !
pWeights )
                return 
false;

            
int i;
            for (
0truecounti++, pWeights++)
            {
                
// Translate to local flex controller
                // this is translating from the settings's local index to the models local index
                
int index FlexControllerLocalToGlobalpSettinghdrpWeights->key );

                
// FIXME: this is supposed to blend based on pWeight->influence, but the order is wrong...
                // float value = GetFlexWeight( index ) * (1 - scale * pWeights->influence) + scale * pWeights->weight;

                // Add scaled weighting in to total
                
m_flextargetindex ] = pWeights->weight;
            }
        }
        else
        {
            return 
false;
        }
    }

    
// adjust intensity if this is a background scene and there's other flex animations playing
    
float intensity info->UpdateWeightthis ) * event->GetIntensityscene->GetTime() );

    
// slide it up.
    
for (LocalFlexController_t i LocalFlexController_t(0); GetNumFlexControllers(); i++)
    {
        
float weight GetFlexWeight);

        if (
weight != m_flextarget[i])
        {
            
float delta = (m_flextarget[i] - weight) / random->RandomFloat2.04.0 );
            
weight weight delta intensity;
        }
        
weight clampweight0.0f1.0f );
        
SetFlexWeightiweight );
    }

    return 
true;
}





bool CAI_BaseActor::ClearSceneEventCSceneEventInfo *infobool fastKillbool canceled )
{
    
Assertinfo );
    
Assertinfo->m_pScene );
    
Assertinfo->m_pEvent );

    
// FIXME: this code looks duplicated
    
switch ( info->m_pEvent->GetType() )
    {
    case 
CChoreoEvent::FACE
        {
            return 
BaseClass::ClearSceneEventinfofastKillcanceled );
        }
        break;
    default:
        return 
BaseClass::ClearSceneEventinfofastKillcanceled );
    }
}



bool CAI_BaseActor::CheckSceneEventCompletionCSceneEventInfo *infofloat currenttimeCChoreoScene *sceneCChoreoEvent *event )
{
    
Assertinfo );
    
Assertinfo->m_pScene );
    
Assertinfo->m_pEvent );

    switch ( 
event->GetType() )
    {
    case 
CChoreoEvent::GENERIC:
        {
            switch( 
info->m_nType)
            {
            case 
SCENE_AI_HOLSTER:
            case 
SCENE_AI_UNHOLSTER:
                {
                    if (
info->m_iLayer == -1)
                    {
                        return 
true;
                    }
                    
float preload event->GetEndTime() - currenttime;
                    if (
preload 0)
                    {
                        return 
true;
                    }
                    
float t = (1.0 GetLayerCycleinfo->m_iLayer )) * SequenceDurationGetLayerSequenceinfo->m_iLayer ) );

                    return (
<= preload);
                }
            }
        }
    }

    return 
BaseClass::CheckSceneEventCompletioninfocurrenttimesceneevent );
}



//-----------------------------------------------------------------------------
// Purpose: clear out latched state
//-----------------------------------------------------------------------------
void CAI_BaseActor::SetViewtarget( const Vector &viewtarget )
{
    
// clear out eye latch
    
m_fLatchedPositions &= ~HUMANOID_LATCHED_EYE;

    
BaseClass::SetViewtargetviewtarget );
}


//-----------------------------------------------------------------------------
// Purpose: Returns true position of the eyeballs
//-----------------------------------------------------------------------------
void CAI_BaseActor::UpdateLatchedValues( ) 

    if (!(
m_fLatchedPositions HUMANOID_LATCHED_HEAD))
    {
        
// set head latch
        
m_fLatchedPositions |= HUMANOID_LATCHED_HEAD;

        if (!
HasConditionCOND_IN_PVS ) || !GetAttachment"eyes"m_latchedEyeOrigin, &m_latchedHeadDirection ))
        {
            
m_latchedEyeOrigin BaseClass::EyePosition( );
            
AngleVectorsGetLocalAngles(), &m_latchedHeadDirection );
        }
        
// clear out eye latch
        
m_fLatchedPositions &= ~(HUMANOID_LATCHED_EYE);
        
// DevMsg( "eyeball %4f %4f %4f  : %3f %3f %3f\n", origin.x, origin.y, origin.z, angles.x, angles.y, angles.z );
    
}

    if (!(
m_fLatchedPositions HUMANOID_LATCHED_EYE))
    {
        
m_fLatchedPositions |= HUMANOID_LATCHED_EYE;

        if ( 
CapabilitiesGet() & bits_CAP_ANIMATEDFACE )
        {
            
m_latchedEyeDirection GetViewtarget() - m_latchedEyeOrigin
            
VectorNormalizem_latchedEyeDirection );
        }
        else
        {
            
m_latchedEyeDirection m_latchedHeadDirection;
        }
    }
}


//-----------------------------------------------------------------------------
// Purpose: Returns true position of the eyeballs
//-----------------------------------------------------------------------------
Vector CAI_BaseActor::EyePosition( )

    
UpdateLatchedValues();

    return 
m_latchedEyeOrigin;
}


#define MIN_LOOK_TARGET_DIST 1.0f
#define MAX_FULL_LOOK_TARGET_DIST 10.0f

//-----------------------------------------------------------------------------
// Purpose: Returns true if target is in legal range of eye movement for the current head position
//-----------------------------------------------------------------------------
bool CAI_BaseActor::ValidEyeTarget(const Vector &lookTargetPos)
{
    
Vector vHeadDir HeadDirection3D( );
    
Vector lookTargetDir    lookTargetPos EyePosition();
    
float flDist VectorNormalize(lookTargetDir);

    if (
flDist MIN_LOOK_TARGET_DIST)
    {
        return 
false;
    }

    
// Only look if it doesn't crank my eyeballs too far
    
float dotPr DotProduct(lookTargetDirvHeadDir);
    
// DevMsg( "ValidEyeTarget( %4f %4f %4f )  %3f\n", lookTargetPos.x, lookTargetPos.y, lookTargetPos.z, dotPr );

    
if (dotPr 0.259// +- 75 degrees
    // if (dotPr > 0.86) // +- 30 degrees
    
{
        return 
true;
    }
    return 
false;
}


//-----------------------------------------------------------------------------
// Purpose: Returns true if target is in legal range of possible head movements
//-----------------------------------------------------------------------------
bool CAI_BaseActor::ValidHeadTarget(const Vector &lookTargetPos)
{
    
Vector vFacing BodyDirection3D();
    
Vector lookTargetDir lookTargetPos EyePosition();
    
float flDist VectorNormalize(lookTargetDir);

    if (
flDist MIN_LOOK_TARGET_DIST)
    {
        return 
false;
    }

    
// Only look if it doesn't crank my head too far
    
float dotPr DotProduct(lookTargetDirvFacing);
    if (
dotPr && fabslookTargetDir.) < 0.7// +- 90 degrees side to side, +- 45 up/down
    
{
        return 
true;
    }
    return 
false;
}


//-----------------------------------------------------------------------------
// Purpose: Returns how much to try to look at the target
//-----------------------------------------------------------------------------
float CAI_BaseActor::HeadTargetValidity(const Vector &lookTargetPos)
{
    
Vector vFacing BodyDirection3D();

    
int iForward LookupAttachment"forward" );
    if (
iForward)
    {
        
Vector tmp1;
        
GetAttachmentiForwardtmp1, &vFacingNULLNULL );
    }

    
Vector lookTargetDir lookTargetPos EyePosition();
    
float flDist lookTargetDir.Length2D();
    
VectorNormalize(lookTargetDir);

    if (
flDist <= MIN_LOOK_TARGET_DIST)
    {
        return 
0;
    }

    
// Only look if it doesn't crank my head too far
    
float dotPr DotProduct(lookTargetDirvFacing);
    
// only look if target is within +-135 degrees
    // scale 1..-0.707 == 1..1,  -.707..-1 == 1..0
    //     X * b + b = 1 == 1 / (X + 1) = b, 3.4142
    
float flInterest clamp3.4142 3.4142 dotPr0);

    
// stop looking when point too close 
    
if (flDist MAX_FULL_LOOK_TARGET_DIST)
    {
        
flInterest flInterest * (flDist MIN_LOOK_TARGET_DIST ) / (MAX_FULL_LOOK_TARGET_DIST MIN_LOOK_TARGET_DIST);
    }

    return 
flInterest;
}

//-----------------------------------------------------------------------------
// Purpose: Integrate head turn over time
//-----------------------------------------------------------------------------
void CAI_BaseActor::SetHeadDirection( const Vector &vTargetPosfloat flInterval)
{
    
Assert(0); // Actors shouldn't be calling this, it doesn't do anything
}

float CAI_BaseActor::ClampWithBiasPoseParameter_t indexfloat valuefloat base )
{
    return 
EdgeLimitPoseParameter( (int)indexvaluebase );
}


//-----------------------------------------------------------------------------
// Purpose: Accumulate all the wanted yaw changes
//-----------------------------------------------------------------------------

void CAI_BaseActor::AccumulateIdealYawfloat flYawfloat flIntensity )
{
    
float diff AngleDiffflYawGetLocalAngles().);
    
m_flAccumYawDelta += diff flIntensity;
    
m_flAccumYawScale += flIntensity;
}


//-----------------------------------------------------------------------------
// Purpose: do any pending yaw movements
//-----------------------------------------------------------------------------

bool CAI_BaseActor::SetAccumulatedYawAndUpdatevoid )
{
    if (
m_flAccumYawScale 0.0)
    {
        
float diff m_flAccumYawDelta m_flAccumYawScale;
        
float facing GetLocalAngles().diff;

        
m_flAccumYawDelta 0.0;
        
m_flAccumYawScale 0.0;

        if (
IsCurScheduleSCHED_SCENE_GENERIC ))
        {
            if (!
IsMoving())
            {
                
GetMotor()->SetIdealYawAndUpdatefacing );
                return 
true;
            }
        }
    }
    return 
false;
}

//-----------------------------------------------------------------------------
// Purpose: match actors "forward" attachment to point in direction of vHeadTarget
//-----------------------------------------------------------------------------

void CAI_BaseActor::UpdateBodyControl( )
{
    
// FIXME: only during idle, or in response to accel/decel
    //Set( m_ParameterBodyTransY, Get( m_FlexweightMoveRightLeft ) );
    //Set( m_ParameterBodyTransX, Get( m_FlexweightMoveForwardBack ) );
    //Set( m_ParameterBodyLift, Get( m_FlexweightMoveUpDown ) );
    
Setm_ParameterBodyYawGetm_FlexweightBodyRightLeft ) + m_goalBodyYaw );
    
//Set( m_ParameterBodyPitch, Get( m_FlexweightBodyUpDown ) );
    //Set( m_ParameterBodyRoll, Get( m_FlexweightBodyTilt ) );
    
Setm_ParameterSpineYawGetm_FlexweightChestRightLeft ) + m_goalSpineYaw );
    
//Set( m_ParameterSpinePitch, Get( m_FlexweightChestUpDown ) );
    //Set( m_ParameterSpineRoll, Get( m_FlexweightChestTilt ) );
    
Setm_ParameterNeckTransGetm_FlexweightHeadForwardBack ) );
}


static 
ConVar scene_clamplookat"scene_clamplookat""1"FCVAR_NONE"Clamp head turns to a max of 20 degrees per think." );


void CAI_BaseActor::UpdateHeadControl( const Vector &vHeadTargetfloat flHeadInfluence )
{
    
float flTarget;
    
float flLimit;

    if (!(
CapabilitiesGet() & bits_CAP_TURN_HEAD))
    {
        return;
    }

    
// calc current animation head bias, movement needs to clamp accumulated with this
    
QAngle angBias;
    
QAngle vTargetAngles;

    
int iEyes LookupAttachment"eyes" );
    
int iChest LookupAttachment"chest" );
    
int iForward LookupAttachment"forward" );

    
matrix3x4_t eyesToWorld;
    
matrix3x4_t forwardToWorldworldToForward;

    if (
iEyes <= || iForward <= 0)
    {
        
// Head control on model without "eyes" or "forward" attachment
        // Most likely this is a cheaple or a generic_actor set to a model that doesn't support head/eye turning.
        // DevWarning( "%s using model \"%s\" that doesn't support head turning\n", GetClassname(), STRING( GetModelName() ) );
        
CapabilitiesRemovebits_CAP_TURN_HEAD );
        return;
    }

    
GetAttachmentiEyeseyesToWorld );

    
GetAttachmentiForwardforwardToWorld );
    
MatrixInvertforwardToWorldworldToForward );

    
// Lookup chest attachment to do compounded range limit checks
    
if (iChest 0)
    {
        
matrix3x4_t chestToWorldworldToChest;
        
GetAttachmentiChestchestToWorld );
        
MatrixInvertchestToWorldworldToChest );
        
matrix3x4_t tmpM;
        
ConcatTransformsworldToChesteyesToWorldtmpM );
        
MatrixAnglestmpMangBias );

        
angBias.-= Getm_ParameterHeadYaw );
        
angBias.-= Getm_ParameterHeadPitch );
        
angBias.-= Getm_ParameterHeadRoll );

        
/*
        if ( (m_debugOverlays & OVERLAY_NPC_SELECTED_BIT) )
        {
            // Msg("bias %f %f %f\n", angBias.x, angBias.y, angBias.z );

            Vector tmp1, tmp2;
            
            VectorTransform( Vector( 0, 0, 0), chestToWorld, tmp1 );
            VectorTransform( Vector( 100, 0, 0), chestToWorld, tmp2 );
            NDebugOverlay::Line( tmp1, tmp2, 0,0,255, false, 0.12 );

            VectorTransform( Vector( 0, 0, 0), eyesToWorld, tmp1 );
            VectorTransform( Vector( 100, 0, 0), eyesToWorld, tmp2 );
            NDebugOverlay::Line( tmp1, tmp2, 0,0,255, false, 0.12 );

            // NDebugOverlay::Line( EyePosition(), pEntity->EyePosition(), 0,0,255, false, 0.5);
        }
        */
    
}
    else
    {
        
angBias.Init00);
    }

    
matrix3x4_t targetXform;
    
targetXform forwardToWorld;
    
Vector vTargetDir vHeadTarget EyePosition();

    if (
scene_clamplookat.GetBool())
    {
        
// scale down pitch when the target is behind the head
        
Vector vTargetLocal;
        
VectorNormalizevTargetDir );
        
VectorIRotatevTargetDirforwardToWorldvTargetLocal );
        
vTargetLocal.*= clampvTargetLocal.x0.11.0 );
        
VectorNormalizevTargetLocal );
        
VectorRotatevTargetLocalforwardToWorldvTargetDir );

        
// clamp local influence when target is behind the head
        
flHeadInfluence flHeadInfluence clampvTargetLocal.2.0 2.00.01.0 );
    }

    
Studio_AlignIKMatrixtargetXformvTargetDir );

    
matrix3x4_t headXform;
    
ConcatTransformsworldToForwardtargetXformheadXform );
    
MatrixAnglesheadXformvTargetAngles );

    
// partially debounce head goal
    
float s0 1.0 flHeadInfluence GetHeadDebounce() * flHeadInfluence;
    
float s1 = (1.0 s0);
    
// limit velocity of head turns
    
m_goalHeadCorrection.UTIL_Approachm_goalHeadCorrection.s0 vTargetAngles.s1m_goalHeadCorrection.x10.0 );
    
m_goalHeadCorrection.UTIL_Approachm_goalHeadCorrection.s0 vTargetAngles.s1m_goalHeadCorrection.y30.0 );
    
m_goalHeadCorrection.UTIL_Approachm_goalHeadCorrection.s0 vTargetAngles.s1m_goalHeadCorrection.z10.0 );

    
/*
    if ( (m_debugOverlays & OVERLAY_NPC_SELECTED_BIT) )
    {
        // Msg( "yaw %.1f (%f) pitch %.1f (%.1f)\n", m_goalHeadCorrection.y, vTargetAngles.y, vTargetAngles.x, m_goalHeadCorrection.x );
        // Msg( "yaw %.2f (goal %.2f) (influence %.2f) (flex %.2f)\n", flLimit, m_goalHeadCorrection.y, flHeadInfluence, Get( m_FlexweightHeadRightLeft ) );
    }
    */

    
flTarget m_goalHeadCorrection.Getm_FlexweightHeadRightLeft );
    
flLimit ClampWithBiasm_ParameterHeadYawflTargetangBias.);
    
/*
    if ( (m_debugOverlays & OVERLAY_NPC_SELECTED_BIT) )
    {
        Msg( "yaw  %5.1f : (%5.1f : %5.1f) %5.1f (%5.1f)\n", flLimit, m_goalHeadCorrection.y, Get( m_FlexweightHeadRightLeft ), angBias.y, Get( m_ParameterHeadYaw ) );
    }
    */
    
Setm_ParameterHeadYawflLimit );

    
flTarget m_goalHeadCorrection.Getm_FlexweightHeadUpDown );
    
flLimit ClampWithBiasm_ParameterHeadPitchflTargetangBias.);
    
/*
    if ( (m_debugOverlays & OVERLAY_NPC_SELECTED_BIT) )
    {
        Msg( "pitch %5.1f : (%5.1f : %5.1f) %5.1f (%5.1f)\n", flLimit, m_goalHeadCorrection.x, Get( m_FlexweightHeadUpDown ), angBias.x, Get( m_ParameterHeadPitch ) );
    }
    */
    
Setm_ParameterHeadPitchflLimit );

    
flTarget m_goalHeadCorrection.Getm_FlexweightHeadTilt );
    
flLimit ClampWithBiasm_ParameterHeadRollflTargetangBias.);
    
/*
    if ( (m_debugOverlays & OVERLAY_NPC_SELECTED_BIT) )
    {
        Msg( "roll  %5.1f : (%5.1f : %5.1f) %5.1f (%5.1f)\n", flLimit, m_goalHeadCorrection.z, Get( m_FlexweightHeadTilt ), angBias.z, Get( m_ParameterHeadRoll ) );
    }
    */
    
Setm_ParameterHeadRollflLimit );
}



//------------------------------------------------------------------------------
// Purpose : Calculate the NPC's eye direction in 2D world space
// Input   :
// Output  :
//------------------------------------------------------------------------------
Vector CAI_BaseActor::EyeDirection2Dvoid )
{
    
Vector vEyeDirection EyeDirection3D( );
    
vEyeDirection.0;

    
vEyeDirection.AsVector2D().NormalizeInPlace();

    return 
vEyeDirection;
}

//------------------------------------------------------------------------------
// Purpose : Calculate the NPC's eye direction in 2D world space
// Input   :
// Output  :
//------------------------------------------------------------------------------
Vector CAI_BaseActor::EyeDirection3Dvoid )
{
    
UpdateLatchedValues( );

    return 
m_latchedEyeDirection;
}

//------------------------------------------------------------------------------
// Purpose : Calculate the NPC's head direction in 2D world space
// Input   :
// Output  :
//------------------------------------------------------------------------------
Vector CAI_BaseActor::HeadDirection2Dvoid )
{    
    
Vector vHeadDirection HeadDirection3D();
    
vHeadDirection.0;
    
vHeadDirection.AsVector2D().NormalizeInPlace();
    return 
vHeadDirection;
}

//------------------------------------------------------------------------------
// Purpose : Calculate the NPC's head direction in 3D world space
// Input   :
// Output  :
//------------------------------------------------------------------------------
Vector CAI_BaseActor::HeadDirection3D( )
{    
    
UpdateLatchedValues( );

    return 
m_latchedHeadDirection;
}


//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
bool CAI_BaseActor::HasActiveLookTargetsvoid )
{
    return 
m_lookQueue.Count() != 0;
}

//-----------------------------------------------------------------------------
// Purpose: Clear any active look targets for the specified entity
//-----------------------------------------------------------------------------
void CAI_BaseActor::ClearLookTargetCBaseEntity *pTarget )
{
    
int iIndex m_lookQueue.FindpTarget );
    if ( 
iIndex != m_lookQueue.InvalidIndex() )
    {
        
m_lookQueue.Remove(iIndex);
    }

    
iIndex m_randomLookQueue.FindpTarget );
    if ( 
iIndex != m_randomLookQueue.InvalidIndex() )
    {
        
m_randomLookQueue.Remove(iIndex);

        
// Figure out the new random look time
        
m_flNextRandomLookTime gpGlobals->curtime 1.0;
        for (
int i 0m_randomLookQueue.Count(); i++)
        {
            if ( 
m_randomLookQueue[i].m_flEndTime m_flNextRandomLookTime )
            {
                
m_flNextRandomLookTime m_randomLookQueue[i].m_flEndTime 0.4;
            }
        }
    }
}

//-----------------------------------------------------------------------------
// Purpose: Look at other NPCs and clients from time to time
//-----------------------------------------------------------------------------
float CAI_BaseActor::PickLookTargetbool bExcludePlayersfloat minTimefloat maxTime )
{
    return 
PickLookTargetm_randomLookQueuebExcludePlayersminTimemaxTime );
}

float CAI_BaseActor::PickLookTargetCAI_InterestTarget &queuebool bExcludePlayersfloat minTimefloat maxTime )
{
    
AILookTargetArgs_t args;
    
    
args.vTarget            vec3_invalid;
    
args.flDuration            random->RandomFloatminTimemaxTime );
    
args.flInfluence        random->RandomFloat0.30.5 );
    
args.flRamp                random->RandomFloat0.20.4 );
    
args.bExcludePlayers    bExcludePlayers;
    
args.pQueue                = &queue;
    
    
bool foundLookTarget true;
    
    if ( !
PickTacticalLookTarget( &args ) )
    {
        if ( !
PickRandomLookTarget( &args ) )
        {
            
foundLookTarget false;
        }
    }
    
    if ( !
foundLookTarget )
    {
        
// DevMsg("nothing to see\n" );
        
MakeRandomLookTarget( &argsminTimemaxTime );
    }
    
    
// See if derived NPCs want to do anything with this look target before I use it
    
OnSelectedLookTarget( &args );

    if ( 
args.hTarget != NULL )
    {
        
Assertargs.vTarget == vec3_invalid );
        
queue.Addargs.hTargetargs.flInfluenceargs.flDurationargs.flRamp );
    }
    else
    {
        
Assertargs.vTarget != vec3_invalid );
        
queue.Addargs.vTargetargs.flInfluenceargs.flDurationargs.flRamp );
    }

    return 
args.flDuration;
    
}

bool CAI_BaseActor::PickTacticalLookTargetAILookTargetArgs_t *pArgs )
{
    
CBaseEntity *pEnemy GetEnemy();

    if (
pEnemy != NULL)
    {
        if ( ( 
FVisiblepEnemy ) || random->RandomInt(03) == ) && ValidHeadTarget(pEnemy->EyePosition()))
        {
            
// look at enemy closer
            
pArgs->hTarget pEnemy;
            
pArgs->flInfluence random->RandomFloat0.71.0 );
            
pArgs->flRamp 0;
            return 
true;
        }
        else
        {
            
// look at something else for a shorter time
            
pArgs->flDuration random->RandomFloat0.50.8 );
            
// move head faster
            
pArgs->flRamp 0.2;
        }
    }
    return 
false;
}

bool CAI_BaseActor::PickRandomLookTargetAILookTargetArgs_t *pArgs )
{
    
bool bIsNavigating = ( GetNavigator()->IsGoalActive() && GetNavigator()->IsGoalSet() );
    
    if ( 
bIsNavigating && random->RandomInt(110) <= )
    {
        
Vector navLookPoint;
        
Vector delta;
        if ( 
GetNavigator()->GetPointAlongPath( &navLookPoint12 12 ) && (delta navLookPoint GetAbsOrigin()).Length() > 8.0 12.0 )
        {
            if ( 
random->RandomInt(110) <= )
            {
                
pArgs->vTarget navLookPoint;
                
pArgs->flDuration random->RandomFloat0.20.4 );
            }
            else
            {
                
pArgs->hTarget this;
                
pArgs->flDuration random->RandomFloat1.02.0 );
            }
            
pArgs->flRamp 0.2;
            return 
true;
        }
    }

    if ( 
GetState() == NPC_STATE_COMBAT && random->RandomInt(110) <= )
    {
        
// if in combat, look forward 80% of the time?
        
pArgs->hTarget this;
        return 
true;
    }

    
CBaseEntity *pBestEntity NULL;
    
CBaseEntity *pEntity NULL;
    
int iHighestImportance 0;
    
int iConsidered 0;
    for ( 
CEntitySphereQuery sphereGetAbsOrigin(), 30 12); (pEntity sphere.GetCurrentEntity()) != NULLsphere.NextEntity() )
    {
        if (
pEntity == this)
        {
            continue;
        }

        if ( 
pArgs->bExcludePlayers && pEntity->GetFlags() & FL_CLIENT )
        {
            
// Don't look at any players.
            
continue;
        }

        if (!
pEntity->IsViewable())
        {
            
// Don't look at things without a model, or aren't tagged as interesting
            
continue;
        }

        if ( 
pEntity->GetOwnerEntity() && !pEntity->GetOwnerEntity()->IsViewable() )
        {
            
// Don't look at things that are associated with non-viewable owners. 
            // Specifically, this prevents NPC's looking at beams or sprites that
            // are part of a viewmodel. (sjb)
            
continue;
        }

        
// Don't look at any object that is ultimately parented to the player.
        // These objects will almost always be at the player's origin (feet), and it
        // looks bad when an actor looks at the player's feet. (sjb)
        
CBaseEntity *pParent pEntity->GetParent();
        
bool bObjectParentedToPlayer false;
        while( 
pParent )
        {
            if( 
pParent->IsPlayer() )
            {
                
bObjectParentedToPlayer true;
                break;
            }

            
pParent pParent->GetParent();
        }

        if( 
bObjectParentedToPlayer )
            continue;
        
        
// skip entities we're already looking at
        
if ( pArgs->pQueue->FindpEntity ) != pArgs->pQueue->InvalidIndex() )
            continue;

        
// keep track of number of interesting things
        
iConsidered++;

        if ((
pEntity->GetFlags() & FL_CLIENT) && (pEntity->IsMoving() || random->RandomInt02) == 0))
        {
            if (
FVisiblepEntity ) && ValidHeadTarget(pEntity->EyePosition()))
            {
                
pArgs->flDuration random->RandomFloat1.04.0 );
                
pBestEntity pEntity;
                break;
            }
        }
    
        
Vector delta = (pEntity->EyePosition() - EyePosition());
        
VectorNormalizedelta );

        
int iImportance;
#if 0
        // consider things in front to be more important than things to the sides
        
iImportance = (DotProductdeltaHeadDirection3D() );
#else
        // No, for now, give all targets random priority (as long as they're in front)
        
iImportance random->RandomInt1100 );
        
#endif
        // make other npcs, and moving npc's far more important
        
if (pEntity->MyNPCPointer())
        {
            
iImportance *= 10;
            if (
pEntity->IsMoving())
            {
                
iImportance *= 10;
            }
        }

        if ( 
iImportance iHighestImportance )
        {
            if (
FVisiblepEntity ) && ValidHeadTarget(pEntity->EyePosition()))
            {
                
iHighestImportance iImportance;
                
pBestEntity    pEntity
                
// NDebugOverlay::Line( EyePosition(), pEntity->EyePosition(), 0,0,255, false, 0.5);
            
}
        }
    }

    
// if there were too few things to look at, don't trust the item
    
if (iConsidered random->RandomInt05))
    {
        
pBestEntity NULL;
    }

    if (
pBestEntity)
    {
        
//Msg("looking at %s\n", pBestEntity->GetClassname() );
        //NDebugOverlay::Line( EyePosition(), pBestEntity->WorldSpaceCenter(), 255, 0, 0, false, 5 );
        
pArgs->hTarget pBestEntity;
        return 
true;
    }
    
    return 
false;
}

//-----------------------------------------------------------------------------
// All attempts to find a target have failed, so just make something up.
//-----------------------------------------------------------------------------
void CAI_BaseActor::MakeRandomLookTargetAILookTargetArgs_t *pArgsfloat minTimefloat maxTime )
{
    
Vector forwardrightup;
    
GetVectors( &forward, &right, &up );

    
// DevMsg("random view\n");

    // For now, just look farther afield while driving in the vehicle.  Without this we look around wildly!
#ifdef HL2_EPISODIC
    
if ( MyCombatCharacterPointer() && MyCombatCharacterPointer()->IsInAVehicle() )
    {
        
pArgs->vTarget EyePosition() + forward 2048 right random->RandomFloat(-650,650) + up random->RandomFloat(-32,32);
    }
    else
#endif // HL2_EPISODIC
    
{
        
pArgs->vTarget EyePosition() + forward 128 right random->RandomFloat(-32,32) + up random->RandomFloat(-16,16);
    }

    
pArgs->flDuration random->RandomFloatminTimemaxTime );
    
pArgs->flInfluence 0.01;
    
pArgs->flRamp random->RandomFloat0.82.8 );
}

//-----------------------------------------------------------------------------
// Purpose: Make sure we're looking at what we're shooting at
//-----------------------------------------------------------------------------

void CAI_BaseActor::StartTaskRangeAttack1( const Task_t *pTask )
{
    
BaseClass::StartTaskRangeAttack1pTask );
    if (
GetEnemy())
    {
        
AddLookTargetGetEnemy(), 1.00.50.2 );
    }
}


//-----------------------------------------------------------------------------
// Purpose: Set direction that the NPC is looking
//-----------------------------------------------------------------------------
void CAI_BaseActor::AddLookTargetCBaseEntity *pTargetfloat flImportancefloat flDurationfloat flRamp )
{
    
m_lookQueue.AddpTargetflImportanceflDurationflRamp );
}


void CAI_BaseActor::AddLookTarget( const Vector &vecPositionfloat flImportancefloat flDurationfloat flRamp )
{
    
m_lookQueue.AddvecPositionflImportanceflDurationflRamp );
}

//-----------------------------------------------------------------------------
// Purpose: Maintain eye, head, body postures, etc.
//-----------------------------------------------------------------------------
void CAI_BaseActor::MaintainLookTargetsfloat flInterval )
{
    
int i;

    if ( 
m_iszExpressionScene != NULL_STRING && m_hExpressionSceneEnt == NULL )
    {
        
InstancedScriptedScenethisSTRING(m_iszExpressionScene), &m_hExpressionSceneEnt0.0true );
    }

    
// decay body/spine yaw
    
m_goalSpineYaw m_goalSpineYaw 0.8;
    
m_goalBodyYaw m_goalBodyYaw 0.8;
    
m_goalHeadCorrection m_goalHeadCorrection 0.8;

    
// ARRGGHHH, this needs to be moved!!!!
    
SetAccumulatedYawAndUpdate( );
    
ProcessSceneEvents( );
    
MaintainTurnActivity( );
    
DoBodyLean( );
    
UpdateBodyControl( );
    
InvalidateBoneCache();

    
// cached versions of the current eye position
    
Vector vEyePosition EyePosition( );

    
// FIXME: make this client side and automatic
    // set gesture positions
    
Setm_ParameterGestureHeightGetm_FlexweightGestureUpDown ) );
    
Setm_ParameterGestureWidthGetm_FlexweightGestureRightLeft ) );

    
// initialize goal head direction to be current direction - this frames animation layering/pose parameters -  
    // but with the head controlls removed.
    
Vector vHead HeadDirection3D( );
    
float flHeadInfluence 0.0;

    
// NDebugOverlay::Line( vEyePosition, vEyePosition + vHead * 16, 0,0,255, false, 0.1);

    // clean up look targets
    
m_lookQueue.Cleanup();

    
// clean up random look targets
    
m_randomLookQueue.Cleanup();

    
// clean up synthetic look targets
    
m_syntheticLookQueue.Cleanup();

    
// if there's real things to look at, turn off the random targets
    
if (m_lookQueue.Count() != || m_syntheticLookQueue.Count() != 0)
    {
        for (
0m_randomLookQueue.Count(); i++)
        {
            if (
gpGlobals->curtime m_randomLookQueue[i].m_flEndTime m_randomLookQueue[i].m_flRamp 0.2)
            {
                
m_randomLookQueue[i].m_flEndTime gpGlobals->curtime m_randomLookQueue[i].m_flRamp 0.2;
            }
        }
        
m_flNextRandomLookTime gpGlobals->curtime 1.0;
    }
    else if (
gpGlobals->curtime >= m_flNextRandomLookTime && GetState() != NPC_STATE_SCRIPT)
    {
        
// Look at whatever!
        
m_flNextRandomLookTime gpGlobals->curtime PickLookTargetm_randomLookQueue ) - 0.4;
    }

    
// don't bother with any of the rest if the player can't see you
    
if (!HasConditionCOND_IN_PVS ))
    {
        return;
    }

    
// Time to finish the current random expression? Or time to pick a new one?
    
if ( m_flNextRandomExpressionTime && gpGlobals->curtime m_flNextRandomExpressionTime )
    {
        
// Random expressions need to be cleared, because they don't loop. So if we
        // pick the same one again, we want to restart it.
        
ClearExpression();

        
PlayExpressionForStateGetState() );
    }

    
CUtlVector<CAI_InterestTarget_t *> active;
    
// clean up random look targets
    
for (0m_randomLookQueue.Count(); i++)
    {
        
active.AddToTail( &m_randomLookQueue[i] );
    }
    for (
0m_lookQueue.Count(); i++)
    {
        
active.AddToTail( &m_lookQueue[i] );
    }
    for (
0m_syntheticLookQueue.Count(); i++)
    {
        
active.AddToTail( &m_syntheticLookQueue[i] );
    }
        
    
// figure out ideal head yaw
    
bool bValidHeadTarget false;
    
bool bExpectedHeadTarget false;
    for (
0active.Count();i++)
    {
        
Vector dir;
        
float flDist 100.0f;
        
        
bExpectedHeadTarget true;
        
float flInterest active[i]->Interest( );

        if (
active[i]->IsThisthis ))
        {
            
int iForward LookupAttachment"forward" );
            if (
iForward)
            {
                
Vector tmp1;
                
GetAttachmentiForwardtmp1, &dirNULLNULL );
            }
            else
            {
                
dir HeadDirection3D();
            }
        }
        else
        {
            
dir active[i]->GetPosition() - vEyePosition;
            
flDist VectorNormalizedir );
            
flInterest flInterest HeadTargetValidityactive[i]->GetPosition() );
        }
        
        
/*
        if ( (m_debugOverlays & OVERLAY_NPC_SELECTED_BIT) )
        {
            DevMsg( "head (%d) %.2f : %s : %.1f %.1f %.1f\n", i, flInterest, active[i]->m_hTarget->GetClassname(), active[i]->GetPosition().x, active[i]->GetPosition().y, active[i]->GetPosition().z );
        }
        */
        
        
if (flInterest 0.0)
        {
            if (
flHeadInfluence == 0.0)
            {
                
vHead dir;
                
flHeadInfluence flInterest;
            }
            else
            {
                
flHeadInfluence flHeadInfluence * (flInterest) + flInterest;
                
float w flInterest flHeadInfluence;
                
vHead vHead * (w) + dir w;
            }

            
bValidHeadTarget true;

            
// NDebugOverlay::Line( vEyePosition, vEyePosition + dir * 64, 0,255,0, false, 0.1);
        
}
        else
        {
            
// NDebugOverlay::Line( vEyePosition, active[i]->GetPosition(), 255,0,0, false, 0.1);
        
}
    }

    
AssertflHeadInfluence <= 1.0 );

    
// turn head toward target
    
if (bValidHeadTarget)
    {
        
UpdateHeadControlvEyePosition vHead 100flHeadInfluence );
        
m_goalHeadDirection vHead;
        
m_goalHeadInfluence flHeadInfluence;
    }
    else
    {
        
// no target, decay all head control direction
        
m_goalHeadDirection m_goalHeadDirection 0.8 vHead 0.2;

        
m_goalHeadInfluence maxm_goalHeadInfluence 0.2);

        
VectorNormalizem_goalHeadDirection );
        
UpdateHeadControlvEyePosition m_goalHeadDirection 100m_goalHeadInfluence );
        
// NDebugOverlay::Line( vEyePosition, vEyePosition + m_goalHeadDirection * 100, 255,0,0, false, 0.1);
    
}

    
// DevMsg( "%.1f %.1f ", GetPoseParameter( "head_pitch" ), GetPoseParameter( "head_roll" ) );

    // figure out eye target
    // eyes need to look directly at a target, even if the head doesn't quite aim there yet.
    
bool bFoundTarget false;
    
EHANDLE    hTarget NULL;

    for (
active.Count() - 1>= 0i--)
    {
        if (
active[i]->IsThisthis ))
        {
            
// DevMsg( "eyes (%d) %s\n", i, STRING( active[i]->m_hTarget->GetEntityName().ToCStr() ) );
            
bFoundTarget true;
            
hTarget this;
            
SetViewtargetvEyePosition HeadDirection3D() * 100 );
            
// NDebugOverlay::Line( vEyePosition, vEyePosition + HeadDirection3D() * 100, 255,0,0, false, 0.1);
            
break;
        }
        else
        {
            
// E3 Hack
            
if (ValidEyeTarget(active[i]->GetPosition()))
            {
                
// DevMsg( "eyes (%d) %s\n", i, STRING( pTarget->GetEntityName().ToCStr() ) );

                
bFoundTarget true;
                
hTarget active[i]->m_hTarget;
                
SetViewtargetactive[i]->GetPosition() );
                break;
            }
        }
    }

    
// FIXME: add blink when changing targets
    
if (m_hLookTarget != hTarget)
    {
        
m_flBlinktime -= 0.5;
        
m_hLookTarget hTarget;

        if ( (
m_debugOverlays OVERLAY_NPC_SELECTED_BIT) && ai_debug_looktargets.GetInt() == && m_hLookTarget.Get() )
        {
            if ( 
m_hLookTarget != this )
            {
                
Vector vecEyePos m_hLookTarget->EyePosition();
                
NDebugOverlay::BoxvecEyePos, -Vector(5,5,5), Vector(5,5,5), 0255025520 );
                
NDebugOverlay::LineEyePosition(), vecEyePos0,255,0true20 );
                
NDebugOverlay::TextvecEyePosUTIL_VarArgs"%s (%s)"m_hLookTarget->GetClassname(), m_hLookTarget->GetDebugName() ), false20 );
            }
        }

        
OnNewLookTarget();
    }

    
// this should take into acount where it will try to be....
    
if (!bFoundTarget && !ValidEyeTargetGetViewtarget() ))
    {
        
Vector rightup;
        
VectorVectorsHeadDirection3D(), rightup );
        
// DevMsg("random view\n");
        
SetViewtargetEyePosition() + HeadDirection3D() * 128 right random->RandomFloat(-32,32) + up random->RandomFloat(-16,16) );
    }

    if ( 
m_hLookTarget != NULL )
    {
        
Vector absVel m_hLookTarget->GetAbsVelocity();
        
CBaseEntity *ground m_hLookTarget->GetGroundEntity();
        if ( 
ground && ground->GetMoveType() == MOVETYPE_PUSH)
        {
            
absVel absVel ground->GetAbsVelocity();
        }

#ifdef HL2_EPISODIC
        // Translate our position if riding in a vehicle
        
if ( m_hLookTarget->MyCombatCharacterPointer() )
        {
            
CBaseCombatCharacter *pBCC m_hLookTarget->MyCombatCharacterPointer();
            
CBaseEntity *pVehicle pBCC->GetVehicleEntity();
            if ( 
pVehicle )
            {
                
IPhysicsObject *pObj pVehicle->VPhysicsGetObject();
                if ( 
pObj )
                {
                    
Vector vecVelocity;
                    
pObj->GetVelocity( &vecVelocityNULL );

                    
absVel += vecVelocity;
                }
            }
        }
#endif //HL2_EPISODIC

        
if ( !VectorCompareabsVelvec3_origin ) )
        {
            
Vector viewTarget GetViewtarget();

            
// Forward one think cycle
            
viewTarget += absVel flInterval;

            
SetViewtargetviewTarget );
        }
    }

    
// NDebugOverlay::Triangle( vEyePosition, GetViewtarget(), GetAbsOrigin(), 255, 255, 255, 10, false, 0.1 );

    // DevMsg("pitch %.1f yaw %.1f\n", GetFlexWeight( "eyes_updown" ), GetFlexWeight( "eyes_rightleft" ) );

    // blink
    
if (m_flBlinktime gpGlobals->curtime)
    {
        
Blink();
        
m_flBlinktime gpGlobals->curtime random->RandomFloat1.54.5 );
    }

    if ( 
ai_debug_looktargets.GetInt() == && (m_debugOverlays OVERLAY_NPC_SELECTED_BIT) )
    {
        
NDebugOverlay::BoxGetViewtarget(), -Vector(2,2,2), Vector(2,2,2), 02550020 );
        
NDebugOverlay::LineEyePosition(),GetViewtarget(), 0,255,0false.1 );
    }
}

//-----------------------------------------------------------------------------

void CAI_BaseActor::PlayExpressionForStateNPC_STATE state )
{
    
// If we have an override expression, use it above everything else
    
if ( m_iszExpressionOverride != NULL_STRING && state != NPC_STATE_DEAD )
    {
        
SetExpressionSTRING(m_iszExpressionOverride) );
        return;
    }

    
// If we have a random expression, use that
    
const char *pszExpression SelectRandomExpressionForStatestate );
    if ( 
pszExpression && *pszExpression )
    {
        
float flDuration SetExpressionpszExpression );
        
m_flNextRandomExpressionTime gpGlobals->curtime flDuration;
        return;
    }
    else
    {
        
// Stop looking for random expressions for this state
        
m_flNextRandomExpressionTime 0;
    }

    
// Lastly, use the base expression loops
    
switch ( state )
    {
    case 
NPC_STATE_IDLE:
        if ( 
m_iszIdleExpression != NULL_STRING )
        {
            
SetExpressionSTRING(m_iszIdleExpression) );
        }
        break;

    case 
NPC_STATE_COMBAT:
        if ( 
m_iszCombatExpression != NULL_STRING )
        {
            
SetExpressionSTRING(m_iszCombatExpression) );
        }
        break;

    case 
NPC_STATE_ALERT:
        if ( 
m_iszAlertExpression != NULL_STRING )
        {
            
SetExpressionSTRING(m_iszAlertExpression) );
        }
        break;

    case 
NPC_STATE_PLAYDEAD:
    case 
NPC_STATE_DEAD:
        if ( 
m_iszDeathExpression != NULL_STRING )
        {
            
SetExpressionSTRING(m_iszDeathExpression) );
        }
        break;
    }
}

//-----------------------------------------------------------------------------
// Purpose: Return a random expression for the specified state to play over 
//            the state's expression loop.
//-----------------------------------------------------------------------------
const char *CAI_BaseActor::SelectRandomExpressionForStateNPC_STATE state )
{
    return 
NULL;
}

//-----------------------------------------------------------------------------

void CAI_BaseActor::OnStateChangeNPC_STATE OldStateNPC_STATE NewState )
{
    
PlayExpressionForStateNewState );

#ifdef HL2_EPISODIC
    // If we've just switched states, ensure we stop any scenes that asked to be stopped
    
if ( OldState == NPC_STATE_IDLE )
    {
        
RemoveActorFromScriptedScenesthistruetrue );
    }
#endif

    
BaseClass::OnStateChangeOldStateNewState );
}

//-----------------------------------------------------------------------------

float CAI_BaseActor::SetExpression( const char *pszExpressionScene )
{
    if ( !
pszExpressionScene || !*pszExpressionScene )
    {
        
ClearExpression();
        return 
0;
    }

    if ( 
m_iszExpressionScene != NULL_STRING && stricmpSTRING(m_iszExpressionScene), pszExpressionScene ) == )
    {
        return 
0;
    }

    if ( 
m_hExpressionSceneEnt != NULL )
    {
        
StopScriptedScenethism_hExpressionSceneEnt );
    }

    if ( 
ai_debug_expressions.GetInt() )
    {
        
Msg("%s (%s) set expression to: %s\n"GetClassname(), GetDebugName(), pszExpressionScene );
    }

    
m_iszExpressionScene NULL_STRING;
    if ( 
pszExpressionScene )
    {
        
float flDuration InstancedScriptedScenethispszExpressionScene, &m_hExpressionSceneEnt0.0true );

        if ( 
m_hExpressionSceneEnt != NULL )
        {
            
m_iszExpressionScene AllocPooledStringpszExpressionScene );
        }

        return 
flDuration;
    }

    return 
0;
}

//-----------------------------------------------------------------------------

void CAI_BaseActor::ClearExpression()
{
    if ( 
m_hExpressionSceneEnt != NULL )
    {
        
StopScriptedScenethism_hExpressionSceneEnt );
    }
    
m_iszExpressionScene NULL_STRING;
}

//-----------------------------------------------------------------------------

const char *CAI_BaseActor::GetExpression()
{
    return 
STRING(m_iszExpressionScene);
}

//-----------------------------------------------------------------------------

void CAI_BaseActor::InputSetExpressionOverrideinputdata_t &inputdata )
{
    
bool fHadOverride = ( m_iszExpressionOverride != NULL_STRING );
    
m_iszExpressionOverride inputdata.value.StringID();
    if (  
m_iszExpressionOverride != NULL_STRING )
    {
        
SetExpressionSTRING(m_iszExpressionOverride) );
    }
    else if ( 
fHadOverride )
    {
        
PlayExpressionForStateGetState() );
    }
}

//-----------------------------------------------------------------------------

bool CAI_BaseActor::UseSemaphorevoid )
{
    if ( 
m_bDontUseSemaphore )
        return 
false;

    return 
true;
}

//-----------------------------------------------------------------------------

CAI_Expresser *CAI_BaseActor::CreateExpresser()
{
    
m_pExpresser = new CAI_Expresser(this);
    return 
m_pExpresser;
}

//-----------------------------------------------------------------------------

CAI_Expresser *CAI_BaseActor::GetExpresser() 

    return 
m_pExpresser
}
    
//-----------------------------------------------------------------------------

bool CAI_BaseActor::CreateComponents()
{
    if ( !
BaseClass::CreateComponents() )
        return 
false;

    
m_pExpresser CreateExpresser();
    if ( !
m_pExpresser)
        return 
false;

    
m_pExpresser->Connect(this);

    return 
true;
}

//----------------------------------------------------------------------------- 
PHP Code:

#ifndef AI_BEHAVIOR_H
#define AI_BEHAVIOR_H

#include "ai_component.h"
#include "ai_basenpc.h"
#include "ai_default.h"
#include "AI_Criteria.h"
#include "networkvar.h"

#ifdef DEBUG
#pragma warning(push)
#include <typeinfo>
#pragma warning(pop)
#pragma warning(disable:4290)
#endif

#if defined( _WIN32 )
#pragma once
#endif

//-----------------------------------------------------------------------------
// CAI_Behavior...
//
// Purpose:    The core component that defines a behavior in an NPC by selecting
//            schedules and running tasks
//
//            Intended to be used as an organizational tool as well as a way
//            for various NPCs to share behaviors without sharing an inheritance
//            relationship, and without cramming those behaviors into the base
//            NPC class.
//-----------------------------------------------------------------------------


//-----------------------------------------------------------------------------
// Purpose: Base class defines interface to behaviors and provides bridging
//            methods
//-----------------------------------------------------------------------------

class IBehaviorBackBridge;

//-------------------------------------

abstract_class CAI_BehaviorBase : public CAI_Component
{
    
DECLARE_CLASSCAI_BehaviorBaseCAI_Component )
public:
    
CAI_BehaviorBase(CAI_BaseNPC *pOuter NULL)
     :     
CAI_Component(pOuter),
         
m_pBackBridge(NULL)
    {
    }

    
virtual const char *GetName() = 0;

    
virtual bool KeyValue( const char *szKeyName, const char *szValue 
    {
        return 
false;
    }
    
    
bool IsRunning()                                { AssertGetOuter() ); return ( GetOuter()->GetRunningBehavior() == this ); }
    
virtual bool CanSelectSchedule()                { return true; }
    
virtual void BeginScheduleSelection()             {}
    
virtual void EndScheduleSelection()             {}
    
    
void SetBackBridgeIBehaviorBackBridge *pBackBridge )
    {
        
Assertm_pBackBridge == NULL || pBackBridge == NULL );
        
m_pBackBridge pBackBridge;
    }

    
void BridgePrecache()                                    { Precache();        }
    
void BridgeSpawn()                                        { Spawn();            }
    
void BridgeUpdateOnRemove()                                { UpdateOnRemove();    }
    
void BridgeEvent_Killed( const CTakeDamageInfo &info )    { Event_Killedinfo );    }
    
void BridgeCleanupOnDeathCBaseEntity *pCulpritbool bFireDeathOutput )        { CleanupOnDeathpCulpritbFireDeathOutput ); }

    
void BridgeOnChangeHintGroupstring_t oldGroupstring_t newGroup ) {     OnChangeHintGroupoldGroupnewGroup ); }

    
void BridgeGatherConditions()                    { GatherConditions(); }
    
void BridgePrescheduleThink()                    { PrescheduleThink(); }
    
void BridgeOnScheduleChange()                    { OnScheduleChange(); }
    
void BridgeOnStartScheduleint scheduleType );

    
int  BridgeSelectSchedule();
    
bool BridgeSelectFailScheduleint failedScheduleint failedTaskAI_TaskFailureCode_t taskFailCodeint *pResult );
    
bool BridgeStartTask( const Task_t *pTask );
    
bool BridgeRunTask( const Task_t *pTask);
    
bool BridgeAimGunvoid );
    
int BridgeTranslateScheduleint scheduleType );
    
bool BridgeGetScheduleint localScheduleIDCAI_Schedule **ppResult );
    
bool BridgeTaskName(int taskID, const char **);
    
Activity BridgeNPC_TranslateActivityActivity activity );
    
void BridgeBuildScheduleTestBits()        { BuildScheduleTestBits(); }
    
bool BridgeIsCurTaskContinuousMovebool *pResult );
    
void BridgeOnMovementFailed()                    { OnMovementFailed(); }
    
void BridgeOnMovementComplete()                    { OnMovementComplete(); }
    
float BridgeGetDefaultNavGoalTolerance();
    
bool BridgeFValidateHintTypeCAI_Hint *pHintbool *pResult );
    
bool BridgeIsValidEnemyCBaseEntity *pEnemy );
    
CBaseEntity *BridgeBestEnemy();
    
bool BridgeIsValidCover( const Vector &vLocationCAI_Hint const *pHint );
    
bool BridgeIsValidShootPosition( const Vector &vLocationCAI_Node *pNodeCAI_Hint const *pHint );
    
float BridgeGetMaxTacticalLateralMovementvoid );
    
bool BridgeShouldIgnoreSoundCSound *pSound );
    
void BridgeOnSeeEntityCBaseEntity *pEntity );
    
void BridgeOnFriendDamagedCBaseCombatCharacter *pSquadmateCBaseEntity *pAttacker );
    
bool BridgeIsInterruptablevoid );
    
bool BridgeIsNavigationUrgentvoid );
    
bool BridgeShouldPlayerAvoidvoid );
    
int     BridgeOnTakeDamage_Alive( const CTakeDamageInfo &info );
    
float BridgeGetReasonableFacingDistvoid );
    
bool BridgeShouldAlwaysThinkbool *pResult );
    
void BridgeOnChangeActiveWeaponCBaseCombatWeapon *pOldWeaponCBaseCombatWeapon *pNewWeapon );
    
void BridgeOnRestore();
    
virtual bool BridgeSpeakMapmakerInterruptConceptstring_t iszConcept );
    
bool BridgeCanFlinchvoid );
    
bool BridgeIsCrouchingvoid );
    
bool BridgeIsCrouchedActivityActivity activity );
    
bool BridgeQueryHearSoundCSound *pSound );
    
bool BridgeCanRunAScriptedNPCInteractionbool bForced );
    
Activity BridgeGetFlinchActivitybool bHeavyDamagebool bGesture );
    
bool BridgeOnCalcBaseMoveAILocalMoveGoal_t *pMoveGoalfloat distClearAIMoveResult_t *pResult );
    
void BridgeModifyOrAppendCriteriaAI_CriteriaSetcriteriaSet );
    
void BridgeTeleport( const Vector *newPosition, const QAngle *newAngles, const Vector *newVelocity );
    
void BridgeHandleAnimEventanimevent_t *pEvent );

    
virtual void GatherConditions();
    
virtual void GatherConditionsNotActive() { return; } // Override this and your behavior will call this in place of GatherConditions() when your behavior is NOT the active one.
    
virtual void OnUpdateShotRegulator() {}

    
virtual CAI_ClassScheduleIdSpace *GetClassScheduleIdSpace();

    
virtual int  DrawDebugTextOverlaysint text_offset );

    
virtual int    SaveISave &save );
    
virtual int    RestoreIRestore &restore );

    static 
void SaveBehaviors(ISave &saveCAI_BehaviorBase *pCurrentBehaviorCAI_BehaviorBase **ppBehaviorint nBehaviors );
    static 
int RestoreBehaviors(IRestore &restoreCAI_BehaviorBase **ppBehaviorint nBehaviors ); // returns index of "current" behavior, or -1

protected:

    
int GetNpcState() { return GetOuter()->m_NPCState; }

    
virtual void Precache()                                        {}
    
virtual void Spawn()                                        {}
    
virtual void UpdateOnRemove()                                {}
    
virtual void Event_Killed( const CTakeDamageInfo &info )    {}
    
virtual void CleanupOnDeathCBaseEntity *pCulpritbool bFireDeathOutput ) {}
    
    
virtual void PrescheduleThink();
    
virtual void OnScheduleChange();
    
virtual void OnStartScheduleint scheduleType );

    
virtual int SelectSchedule();
    
virtual int    SelectFailScheduleint failedScheduleint failedTaskAI_TaskFailureCode_t taskFailCode );
    
virtual void StartTask( const Task_t *pTask );
    
virtual void RunTask( const Task_t *pTask );
    
virtual void AimGunvoid );
    
virtual int TranslateScheduleint scheduleType );
    
virtual CAI_Schedule *GetSchedule(int schedule);
    
virtual const char *GetSchedulingErrorName();
    
virtual void BuildScheduleTestBits() {}
    
bool IsCurScheduleint schedIdbool fIdeal true );


    
CAI_Hint *        GetHintNode()                            { return GetOuter()->GetHintNode(); }
    const 
CAI_Hint *GetHintNode() const                        { return GetOuter()->GetHintNode(); }
    
void            SetHintNodeCAI_Hint *pHintNode )        { GetOuter()->SetHintNodepHintNode ); }
    
void            ClearHintNodefloat reuseDelay 0.0 )    { GetOuter()->ClearHintNodereuseDelay ); }

protected:
    
// Used by derived classes to chain a task to a task that might not be the 
    // one they are currently handling:
    
void    ChainStartTaskint taskfloat taskData );
    
void    ChainRunTaskint taskfloat taskData );

protected:

    
virtual Activity NPC_TranslateActivityActivity activity );

    
virtual bool IsCurTaskContinuousMove();
    
virtual void OnMovementFailed() {};
    
virtual void OnMovementComplete() {};
    
virtual float GetDefaultNavGoalTolerance();
    
virtual bool FValidateHintTypeCAI_Hint *pHint );

    
virtual    bool IsValidEnemyCBaseEntity *pEnemy );
    
virtual CBaseEntity *BestEnemy();
    
virtual    bool IsValidCover( const Vector &vLocationCAI_Hint const *pHint );
    
virtual    bool IsValidShootPosition( const Vector &vLocationCAI_Node *pNodeCAI_Hint const *pHint );
    
virtual float GetMaxTacticalLateralMovementvoid );
    
virtual bool ShouldIgnoreSoundCSound *pSound );
    
virtual void OnSeeEntityCBaseEntity *pEntity );
    
virtual void OnFriendDamagedCBaseCombatCharacter *pSquadmateCBaseEntity *pAttacker );
    
virtual bool IsInterruptablevoid );
    
virtual bool IsNavigationUrgentvoid );
    
virtual int     OnTakeDamage_Alive( const CTakeDamageInfo &info );
    
virtual float GetReasonableFacingDistvoid );
    
virtual bool ShouldPlayerAvoidvoid );
    
virtual bool CanFlinchvoid );
    
virtual bool IsCrouchingvoid );
    
virtual bool IsCrouchedActivityActivity activity );
    
virtual bool QueryHearSoundCSound *pSound );
    
virtual bool CanRunAScriptedNPCInteractionbool bForced );
    
virtual Activity GetFlinchActivitybool bHeavyDamagebool bGesture );
    
virtual bool OnCalcBaseMoveAILocalMoveGoal_t *pMoveGoalfloat distClearAIMoveResult_t *pResult );
    
virtual void ModifyOrAppendCriteriaAI_CriteriaSetcriteriaSet );
    
virtual void Teleport( const Vector *newPosition, const QAngle *newAngles, const Vector *newVelocity );
    
virtual void HandleAnimEventanimevent_t *pEvent );

    
virtual bool ShouldAlwaysThink();

    
virtual void OnChangeActiveWeaponCBaseCombatWeapon *pOldWeaponCBaseCombatWeapon *pNewWeapon ) {};
    
virtual bool SpeakMapmakerInterruptConceptstring_t iszConcept ) { return false; };
    
    
virtual void OnRestore() {};
    
    
bool NotifyChangeBehaviorStatusbool fCanFinishSchedule false );

    
bool HaveSequenceForActivityActivity activity )        { return GetOuter()->HaveSequenceForActivityactivity ); }
    
    
//---------------------------------

    
string_t            GetHintGroup()            { return GetOuter()->GetHintGroup();    }
    
void                ClearHintGroup()            { GetOuter()->ClearHintGroup();            }
    
void                SetHintGroupstring_t name )    { GetOuter()->SetHintGroupname );        }

    
virtual void        OnChangeHintGroupstring_t oldGroupstring_t newGroup ) {}

    
//
    // These allow derived classes to implement custom schedules
    //
    
static CAI_GlobalScheduleNamespace *GetSchedulingSymbols()        { return CAI_BaseNPC::GetSchedulingSymbols(); }
    static 
bool                LoadSchedules()                            { return true; }
    
virtual bool            IsBehaviorScheduleint scheduleType )    { return false; }

    
CAI_Navigator *            GetNavigator()                             { return GetOuter()->GetNavigator();         }
    
CAI_Motor *                GetMotor()                                 { return GetOuter()->GetMotor();             }
    
CAI_TacticalServices *    GetTacticalServices()                    { return GetOuter()->GetTacticalServices();    }

    
bool                  m_fOverrode;
    
IBehaviorBackBridge *m_pBackBridge;

    
DECLARE_DATADESC();
};

//-----------------------------------------------------------------------------
// Purpose: Template provides provides back bridge to owning class and 
//            establishes namespace settings
//-----------------------------------------------------------------------------

template <class NPC_CLASS CAI_BaseNPC, const int ID_SPACE_OFFSET 100000>
class 
CAI_Behavior : public CAI_ComponentWithOuter<NPC_CLASSCAI_BehaviorBase>
{
public:
    
DECLARE_CLASS_NOFRIENDCAI_BehaviorNPC_CLASS );
    
    
enum
    
{
        
NEXT_TASK             ID_SPACE_OFFSET,
        
NEXT_SCHEDULE         ID_SPACE_OFFSET,
        
NEXT_CONDITION         ID_SPACE_OFFSET
    
};

    
void SetConditionint condition )
    {
        if ( 
condition >= ID_SPACE_OFFSET && condition ID_SPACE_OFFSET 10000 // it's local to us
            
condition GetClassScheduleIdSpace()->ConditionLocalToGlobalcondition );
        
GetOuter()->SetConditioncondition );
    }

    
bool HasConditionint condition )
    {
        if ( 
condition >= ID_SPACE_OFFSET && condition ID_SPACE_OFFSET 10000 // it's local to us
            
condition GetClassScheduleIdSpace()->ConditionLocalToGlobalcondition );
        return 
GetOuter()->HasConditioncondition );
    }

    
bool HasInterruptConditionint condition )
    {
        if ( 
condition >= ID_SPACE_OFFSET && condition ID_SPACE_OFFSET 10000 // it's local to us
            
condition GetClassScheduleIdSpace()->ConditionLocalToGlobalcondition );
        return 
GetOuter()->HasInterruptConditioncondition );
    }

    
void ClearConditionint condition )
    {
        if ( 
condition >= ID_SPACE_OFFSET && condition ID_SPACE_OFFSET 10000 // it's local to us
            
condition GetClassScheduleIdSpace()->ConditionLocalToGlobalcondition );
        
GetOuter()->ClearConditioncondition );
    }

protected:
    
CAI_Behavior(NPC_CLASS *pOuter NULL)
     : 
CAI_ComponentWithOuter<NPC_CLASSCAI_BehaviorBase>(pOuter)
    {
    }

    static 
CAI_GlobalScheduleNamespace *GetSchedulingSymbols()
    {
        return 
NPC_CLASS::GetSchedulingSymbols();
    }
    
virtual CAI_ClassScheduleIdSpace *GetClassScheduleIdSpace()
    {
        return 
GetOuter()->GetClassScheduleIdSpace();
    }

    static 
CAI_ClassScheduleIdSpace &AccessClassScheduleIdSpaceDirect()
    {
        return 
NPC_CLASS::AccessClassScheduleIdSpaceDirect();
    }

private:
    
virtual bool IsBehaviorScheduleint scheduleType ) { return ( scheduleType >= ID_SPACE_OFFSET && scheduleType ID_SPACE_OFFSET 10000 ); }
};


//-----------------------------------------------------------------------------
// Purpose: Some bridges a little more complicated to allow behavior to see 
//            what base class would do or control order in which it's donw
//-----------------------------------------------------------------------------

abstract_class IBehaviorBackBridge
{
public:
    
virtual void          BackBridge_GatherConditions() = 0;
    
virtual int          BackBridge_SelectSchedule() = 0;
    
virtual int          BackBridge_TranslateScheduleint scheduleType ) = 0;
    
virtual Activity      BackBridge_NPC_TranslateActivityActivity activity ) = 0;
    
virtual bool         BackBridge_IsValidEnemy(CBaseEntity *pEnemy) = 0;
    
virtual CBaseEntityBackBridge_BestEnemy(void) = 0;
    
virtual bool         BackBridge_IsValidCover( const Vector &vLocationCAI_Hint const *pHint ) = 0;
    
virtual bool         BackBridge_IsValidShootPosition( const Vector &vLocationCAI_Node *pNodeCAI_Hint const *pHint ) = 0;
    
virtual float         BackBridge_GetMaxTacticalLateralMovementvoid ) = 0;
    
virtual bool         BackBridge_ShouldIgnoreSoundCSound *pSound ) = 0;
    
virtual void         BackBridge_OnSeeEntityCBaseEntity *pEntity ) = 0;
    
virtual void         BackBridge_OnFriendDamagedCBaseCombatCharacter *pSquadmateCBaseEntity *pAttacker ) = 0;
    
virtual bool         BackBridge_IsInterruptablevoid ) = 0;
    
virtual bool         BackBridge_IsNavigationUrgentvoid ) = 0;
    
virtual bool         BackBridge_ShouldPlayerAvoidvoid ) = 0;
    
virtual int             BackBridge_OnTakeDamage_Alive( const CTakeDamageInfo &info ) = 0;
    
virtual float         BackBridge_GetDefaultNavGoalTolerance() = 0;
    
virtual float         BackBridge_GetReasonableFacingDistvoid ) = 0;
    
virtual bool         BackBridge_CanFlinchvoid ) = 0;
    
virtual bool         BackBridge_IsCrouchingvoid ) = 0;
    
virtual bool         BackBridge_IsCrouchedActivityActivity activity ) = 0;
    
virtual bool         BackBridge_QueryHearSoundCSound *pSound ) = 0;
    
virtual bool         BackBridge_CanRunAScriptedNPCInteractionbool bForced ) = 0;
    
virtual Activity     BackBridge_GetFlinchActivitybool bHeavyDamagebool bGesture ) = 0;
    
virtual bool         BackBridge_OnCalcBaseMoveAILocalMoveGoal_t *pMoveGoalfloat distClearAIMoveResult_t *pResult ) = 0;
    
virtual void         BackBridge_ModifyOrAppendCriteriaAI_CriteriaSetcriteriaSet ) = 0;
    
virtual void         BackBridge_Teleport( const Vector *newPosition, const QAngle *newAngles, const Vector *newVelocity ) = 0;

    
virtual void         BackBridge_HandleAnimEventanimevent_t *pEvent ) = 0;

//-------------------------------------

};

//-----------------------------------------------------------------------------
// Purpose: The common instantiation of the above template
//-----------------------------------------------------------------------------

typedef CAI_Behavior<> CAI_SimpleBehavior;

//-----------------------------------------------------------------------------
// Purpose: Base class for AIs that want to act as a host for CAI_Behaviors
//            NPCs aren't required to use this, but probably want to.
//-----------------------------------------------------------------------------

template <class BASE_NPC>
class 
CAI_BehaviorHost : public BASE_NPC,
                         private 
IBehaviorBackBridge
{
public:
    
DECLARE_CLASS_NOFRIENDCAI_BehaviorHostBASE_NPC );

    
CAI_BehaviorHost()
      : 
m_pCurBehavior(NULL)
    {
#ifdef DEBUG
          
m_fDebugInCreateBehaviors false;
#endif
    
}

    
void CleanupOnDeathCBaseEntity *pCulprit NULLbool bFireDeathOutput true );

    
virtual int        SaveISave &save );
    
virtual int        RestoreIRestore &restore );
    
virtual bool     CreateComponents();

    
// Automatically called during entity construction, derived class calls AddBehavior()
    
virtual bool     CreateBehaviors()    { return true; }
    
    
// forces movement and sets a new schedule
    
virtual bool    ScheduledMoveToGoalEntityint scheduleTypeCBaseEntity *pGoalEntityActivity movementActivity );
    
virtual bool    ScheduledFollowPathint scheduleTypeCBaseEntity *pPathStartActivity movementActivity );
    
virtual void    ForceSelectedGo(CBaseEntity *pPlayer, const Vector &targetPos, const Vector &traceDirbool bRun);
    
virtual void    ForceSelectedGoRandom(void);

    
// Bridges
    
void            Precache();
    
void            NPCInit();
    
void            UpdateOnRemove();
    
void            Event_Killed( const CTakeDamageInfo &info );
    
void             GatherConditions();
    
void             PrescheduleThink();
    
int             SelectSchedule();
    
void            KeepRunningBehavior();
    
int                SelectFailScheduleint failedScheduleint failedTaskAI_TaskFailureCode_t taskFailCode );
    
void             OnScheduleChange();
    
void            OnStartScheduleint scheduleType );
    
int             TranslateScheduleint scheduleType );
    
void             StartTask( const Task_t *pTask );
    
void             RunTask( const Task_t *pTask );
    
void            AimGunvoid );
    
CAI_Schedule *    GetSchedule(int localScheduleID);
    const 
char *    TaskName(int taskID);
    
void            BuildScheduleTestBits();

    
void            OnChangeHintGroupstring_t oldGroupstring_t newGroup );
    
    
Activity         NPC_TranslateActivityActivity activity );

    
bool            IsCurTaskContinuousMove();
    
void            OnMovementFailed();
    
void            OnMovementComplete();
    
bool            FValidateHintTypeCAI_Hint *pHint );
    
float            GetDefaultNavGoalTolerance();

    
bool            IsValidEnemy(CBaseEntity *pEnemy);
    
CBaseEntity*    BestEnemy(void);
    
bool            IsValidCover( const Vector &vLocationCAI_Hint const *pHint );
    
bool            IsValidShootPosition( const Vector &vLocationCAI_Node *pNodeCAI_Hint const *pHint );
    
float            GetMaxTacticalLateralMovementvoid );
    
bool            ShouldIgnoreSoundCSound *pSound );
    
void            OnSeeEntityCBaseEntity *pEntity );
    
void            OnFriendDamagedCBaseCombatCharacter *pSquadmateCBaseEntity *pAttacker );
    
bool            IsInterruptablevoid );
    
bool            IsNavigationUrgentvoid );
    
bool            ShouldPlayerAvoidvoid );
    
int                OnTakeDamage_Alive( const CTakeDamageInfo &info );
    
float            GetReasonableFacingDistvoid );
    
bool            CanFlinchvoid );
    
bool            IsCrouchingvoid );
    
bool            IsCrouchedActivityActivity activity );
    
bool            QueryHearSoundCSound *pSound );
    
bool            CanRunAScriptedNPCInteractionbool bForced );
    
Activity        GetFlinchActivitybool bHeavyDamagebool bGesture );
    
bool            OnCalcBaseMoveAILocalMoveGoal_t *pMoveGoalfloat distClearAIMoveResult_t *pResult );
    
void            HandleAnimEventanimevent_t *pEvent );
    
    
bool            ShouldAlwaysThink();

    
void            OnChangeActiveWeaponCBaseCombatWeapon *pOldWeaponCBaseCombatWeapon *pNewWeapon );
    
virtual bool    SpeakMapmakerInterruptConceptstring_t iszConcept );

    
void            OnRestore();

    
void            ModifyOrAppendCriteriaAI_CriteriaSetset );
    
void            Teleport( const Vector *newPosition, const QAngle *newAngles, const Vector *newVelocity );

    
//---------------------------------

    
virtual bool    OnBehaviorChangeStatusCAI_BehaviorBase *pBehaviorbool fCanFinishSchedule );
    
virtual void    OnChangeRunningBehaviorCAI_BehaviorBase *pOldBehavior,  CAI_BehaviorBase *pNewBehavior );

protected:
    
void            AddBehaviorCAI_BehaviorBase *pBehavior );
    
    
bool            BehaviorSelectSchedule();
    
virtual bool    ShouldBehaviorSelectScheduleCAI_BehaviorBase *pBehavior ) { return true; }

    
bool             IsRunningBehavior() const;
    
CAI_BehaviorBase *GetRunningBehavior();
    
CAI_BehaviorBase *DeferSchedulingToBehaviorCAI_BehaviorBase *pNewBehavior );
    
void            ChangeBehaviorToCAI_BehaviorBase *pNewBehavior );

    
CAI_Schedule *    GetNewSchedule();
    
CAI_Schedule *    GetFailSchedule();
private:
    
void             BackBridge_GatherConditions();
    
int                BackBridge_SelectSchedule();
    
int                BackBridge_TranslateScheduleint scheduleType );
    
Activity        BackBridge_NPC_TranslateActivityActivity activity );
    
bool            BackBridge_IsValidEnemy(CBaseEntity *pEnemy);
    
CBaseEntity*    BackBridge_BestEnemy(void);
    
bool            BackBridge_IsValidCover( const Vector &vLocationCAI_Hint const *pHint );
    
bool            BackBridge_IsValidShootPosition( const Vector &vLocationCAI_Node *pNodeCAI_Hint const *pHint );
    
float            BackBridge_GetMaxTacticalLateralMovementvoid );
    
bool            BackBridge_ShouldIgnoreSoundCSound *pSound );
    
void            BackBridge_OnSeeEntityCBaseEntity *pEntity );
    
void            BackBridge_OnFriendDamagedCBaseCombatCharacter *pSquadmateCBaseEntity *pAttacker );
    
bool            BackBridge_IsInterruptablevoid );
    
bool            BackBridge_IsNavigationUrgentvoid );
    
bool            BackBridge_ShouldPlayerAvoidvoid );
    
int                BackBridge_OnTakeDamage_Alive( const CTakeDamageInfo &info );
    
float            BackBridge_GetDefaultNavGoalTolerance();
    
float            BackBridge_GetReasonableFacingDistvoid );
    
bool            BackBridge_CanFlinchvoid );
    
bool            BackBridge_IsCrouchingvoid );
    
bool            BackBridge_IsCrouchedActivityActivity activity );
    
bool            BackBridge_QueryHearSoundCSound *pSound );
    
bool            BackBridge_CanRunAScriptedNPCInteractionbool bForced );
    
Activity        BackBridge_GetFlinchActivitybool bHeavyDamagebool bGesture );
    
bool            BackBridge_OnCalcBaseMoveAILocalMoveGoal_t *pMoveGoalfloat distClearAIMoveResult_t *pResult );
    
void            BackBridge_ModifyOrAppendCriteriaAI_CriteriaSetcriteriaSet );
    
void            BackBridge_Teleport( const Vector *newPosition, const QAngle *newAngles, const Vector *newVelocity );

    
void            BackBridge_HandleAnimEventanimevent_t *pEvent );

    
CAI_BehaviorBase **AccessBehaviors();
    
int                NumBehaviors();

    
CAI_BehaviorBase *               m_pCurBehavior;
    
CUtlVector<CAI_BehaviorBase *> m_Behaviors;

    
bool            m_bCalledBehaviorSelectSchedule;
    
#ifdef DEBUG
    
bool             m_fDebugInCreateBehaviors;
#endif
    
};

//-----------------------------------------------------------------------------

// The first frame a behavior begins schedule selection, it won't have had it's GatherConditions()
// called. To fix this, BeginScheduleSelection() manually calls the new behavior's GatherConditions(),
// but sets this global so that the baseclass GatherConditions() isn't called as well.
extern bool g_bBehaviorHost_PreventBaseClassGatherConditions;

//-----------------------------------------------------------------------------

inline void CAI_BehaviorBase::BridgeOnStartScheduleint scheduleType )
{
    
int localId AI_IdIsGlobalscheduleType ) ? GetClassScheduleIdSpace()->ScheduleGlobalToLocalscheduleType ) : scheduleType;
    
OnStartSchedulelocalId );
}

//-------------------------------------

inline int CAI_BehaviorBase::BridgeSelectSchedule()
{
    
int result SelectSchedule();

    if ( 
IsBehaviorScheduleresult ) )
        return 
GetClassScheduleIdSpace()->ScheduleLocalToGlobalresult );

    return 
result;
}

//-------------------------------------

inline bool CAI_BehaviorBase::BridgeSelectFailScheduleint failedScheduleint failedTaskAI_TaskFailureCode_t taskFailCodeint *pResult )
{
    
m_fOverrode true;
    
int result SelectFailSchedulefailedSchedulefailedTasktaskFailCode );
    if ( 
m_fOverrode )
    {
        if ( 
result != SCHED_NONE )
        {
            if ( 
IsBehaviorScheduleresult ) )
                *
pResult GetClassScheduleIdSpace()->ScheduleLocalToGlobalresult );
            else
                *
pResult result;
            return 
true;
        }
        
Warning"An AI behavior is in control but has no recommended schedule\n" );
    }
    return 
false;
}

//-------------------------------------

inline bool CAI_BehaviorBase::BridgeStartTask( const Task_t *pTask )
{
    
m_fOverrode true;
    
StartTaskpTask );
    return 
m_fOverrode;
}

//-------------------------------------

inline bool CAI_BehaviorBase::BridgeRunTask( const Task_t *pTask)
{
    
m_fOverrode true;
    
RunTaskpTask );
    return 
m_fOverrode;
}

//-------------------------------------

inline bool CAI_BehaviorBase::BridgeAimGunvoid )
{
    
m_fOverrode true;
    
AimGun();
    return 
m_fOverrode;
}

//-------------------------------------

inline void CAI_BehaviorBase::ChainStartTaskint taskfloat taskData )
{
    
Task_t tempTask = { tasktaskData }; 

    
bool fPrevOverride m_fOverrode;
    
GetOuter()->StartTask( (const Task_t *)&tempTask );
    
m_fOverrode fPrevOverride;;
}

//-------------------------------------

inline void CAI_BehaviorBase::ChainRunTaskint taskfloat taskData )

    
Task_t tempTask = { tasktaskData }; 
    
bool fPrevOverride m_fOverrode;
    
GetOuter()->RunTask( (const Task_t *)    &tempTask );
    
m_fOverrode fPrevOverride;;
}

//-------------------------------------

inline int CAI_BehaviorBase::BridgeTranslateScheduleint scheduleType )
{
    
int localId AI_IdIsGlobalscheduleType ) ? GetClassScheduleIdSpace()->ScheduleGlobalToLocalscheduleType ) : scheduleType;
    
int result TranslateSchedulelocalId );
    
    return 
result;
}

//-------------------------------------

inline bool CAI_BehaviorBase::BridgeGetScheduleint localScheduleIDCAI_Schedule **ppResult )
{
    *
ppResult GetSchedulelocalScheduleID );
    return (*
ppResult != NULL );
}

//-------------------------------------

inline bool CAI_BehaviorBase::BridgeTaskNameint taskID, const char **ppResult )
{
    if ( 
AI_IdIsLocaltaskID ) )
    {
        *
ppResult GetSchedulingSymbols()->TaskIdToSymbolGetClassScheduleIdSpace()->TaskLocalToGlobaltaskID ) );
        return (*
ppResult != NULL );
    }
    return 
false;
}

//-------------------------------------

inline Activity CAI_BehaviorBase::BridgeNPC_TranslateActivityActivity activity )
{
    return 
NPC_TranslateActivityactivity );
}

//-------------------------------------

inline bool CAI_BehaviorBase::BridgeIsCurTaskContinuousMovebool *pResult )
{
    
bool fPrevOverride m_fOverrode;
    
m_fOverrode true;
    *
pResult IsCurTaskContinuousMove();
    
bool result m_fOverrode;
    
m_fOverrode fPrevOverride;
    return 
result;
}

//-------------------------------------

inline bool CAI_BehaviorBase::BridgeFValidateHintTypeCAI_Hint *pHintbool *pResult )
{
    
bool fPrevOverride m_fOverrode;
    
m_fOverrode true;
    *
pResult FValidateHintTypepHint );
    
bool result m_fOverrode;
    
m_fOverrode fPrevOverride;
    return 
result;
}

//-------------------------------------

inline bool CAI_BehaviorBase::BridgeIsValidEnemyCBaseEntity *pEnemy )
{
    return 
IsValidEnemypEnemy );
}

//-------------------------------------

inline CBaseEntity *CAI_BehaviorBase::BridgeBestEnemy()
{
    return 
BestEnemy();
}

//-------------------------------------

inline bool CAI_BehaviorBase::BridgeIsValidCover( const Vector &vLocationCAI_Hint const *pHint )
{
    return 
IsValidCovervLocationpHint );
}

//-------------------------------------

inline bool CAI_BehaviorBase::BridgeIsValidShootPosition( const Vector &vLocationCAI_Node *pNodeCAI_Hint const *pHint )
{
    return 
IsValidShootPositionvLocationpNodepHint );
}

//-------------------------------------

inline float CAI_BehaviorBase::BridgeGetMaxTacticalLateralMovementvoid )
{
    return 
GetMaxTacticalLateralMovement();
}

//-------------------------------------

inline bool CAI_BehaviorBase::BridgeShouldIgnoreSoundCSound *pSound )
{
    return 
ShouldIgnoreSoundpSound );
}

//-------------------------------------

inline void CAI_BehaviorBase::BridgeOnSeeEntityCBaseEntity *pEntity )
{
    
OnSeeEntitypEntity );
}

//-------------------------------------

inline void CAI_BehaviorBase::BridgeOnFriendDamagedCBaseCombatCharacter *pSquadmateCBaseEntity *pAttacker )
{
    
OnFriendDamagedpSquadmatepAttacker );
}

//-------------------------------------

inline bool CAI_BehaviorBase::BridgeIsInterruptablevoid )
{
    return 
IsInterruptable();
}

//-------------------------------------

inline bool CAI_BehaviorBase::BridgeIsNavigationUrgentvoid )
{
    return 
IsNavigationUrgent();
}

//-------------------------------------

inline bool CAI_BehaviorBase::BridgeCanFlinchvoid )
{
    return 
CanFlinch();
}

//-------------------------------------

inline bool CAI_BehaviorBase::BridgeIsCrouchingvoid )
{
    return 
IsCrouching();
}

//-------------------------------------

inline bool CAI_BehaviorBase::BridgeIsCrouchedActivityActivity activity )
{
    return 
IsCrouchedActivityactivity );
}

inline bool CAI_BehaviorBase::BridgeQueryHearSoundCSound *pSound )
{
    return 
QueryHearSoundpSound );
}

//-------------------------------------

inline bool CAI_BehaviorBase::BridgeCanRunAScriptedNPCInteractionbool bForced )
{
    return 
CanRunAScriptedNPCInteractionbForced );
}

//-------------------------------------

inline bool CAI_BehaviorBase::BridgeShouldPlayerAvoidvoid )
{
    return 
ShouldPlayerAvoid();
}

//-------------------------------------

inline int CAI_BehaviorBase::BridgeOnTakeDamage_Alive( const CTakeDamageInfo &info )
{
    return 
OnTakeDamage_Aliveinfo );
}

//-------------------------------------

inline float CAI_BehaviorBase::BridgeGetReasonableFacingDistvoid )
{
    return 
GetReasonableFacingDist();
}

//-------------------------------------

inline bool CAI_BehaviorBase::BridgeShouldAlwaysThinkbool *pResult )
{
    
bool fPrevOverride m_fOverrode;
    
m_fOverrode true;
    *
pResult ShouldAlwaysThink();
    
bool result m_fOverrode;
    
m_fOverrode fPrevOverride;
    return 
result;
}

//-------------------------------------

inline void CAI_BehaviorBase::BridgeOnChangeActiveWeaponCBaseCombatWeapon *pOldWeaponCBaseCombatWeapon *pNewWeapon )
{
    
OnChangeActiveWeaponpOldWeaponpNewWeapon );
}

//-------------------------------------

inline bool CAI_BehaviorBase::BridgeSpeakMapmakerInterruptConceptstring_t iszConcept )
{
    return 
SpeakMapmakerInterruptConceptiszConcept );
}

//-------------------------------------

inline void CAI_BehaviorBase::BridgeOnRestore()
{
    
OnRestore();
}

//-------------------------------------

inline float CAI_BehaviorBase::BridgeGetDefaultNavGoalTolerance()
{
    return 
GetDefaultNavGoalTolerance();
}

//-----------------------------------------------------------------------------

inline Activity CAI_BehaviorBase::BridgeGetFlinchActivitybool bHeavyDamagebool bGesture )
{
    return 
GetFlinchActivitybHeavyDamagebGesture );
}

//-----------------------------------------------------------------------------

inline bool CAI_BehaviorBase::BridgeOnCalcBaseMoveAILocalMoveGoal_t *pMoveGoalfloat distClearAIMoveResult_t *pResult )
{
    return 
OnCalcBaseMovepMoveGoaldistClearpResult );
}

//-----------------------------------------------------------------------------

inline void CAI_BehaviorBase::BridgeModifyOrAppendCriteriaAI_CriteriaSetcriteriaSet )
{
    
ModifyOrAppendCriteriacriteriaSet );
}

//-----------------------------------------------------------------------------

inline void CAI_BehaviorBase::BridgeTeleport( const Vector *newPosition, const QAngle *newAngles, const Vector *newVelocity )
{
    
TeleportnewPositionnewAnglesnewVelocity );
}

//-----------------------------------------------------------------------------

inline void CAI_BehaviorBase::BridgeHandleAnimEventanimevent_t *pEvent )
{
    
HandleAnimEventpEvent );
}

//-----------------------------------------------------------------------------

template <class BASE_NPC>
inline void CAI_BehaviorHost<BASE_NPC>::CleanupOnDeathCBaseEntity *pCulpritbool bFireDeathOutput )
{
    
DeferSchedulingToBehaviorNULL );
    for( 
int i 0m_Behaviors.Count(); i++ )
    {
        
m_Behaviors[i]->BridgeCleanupOnDeathpCulpritbFireDeathOutput );
    }
    
BaseClass::CleanupOnDeathpCulpritbFireDeathOutput );
}

//-------------------------------------

template <class BASE_NPC>
inline void CAI_BehaviorHost<BASE_NPC>::GatherConditions()                    

    
// Iterate over behaviors and call GatherConditionsNotActive() on each behavior
    // not currently active.
    
for( int i 0m_Behaviors.Count(); i++ )
    {
        if( 
m_Behaviors[i] != m_pCurBehavior )
        {
            
m_Behaviors[i]->GatherConditionsNotActive();
        }
    }

    if ( 
m_pCurBehavior )
        
m_pCurBehavior->BridgeGatherConditions(); 
    else
        
BaseClass::GatherConditions();
}

//-------------------------------------

template <class BASE_NPC>
inline void CAI_BehaviorHost<BASE_NPC>::BackBridge_GatherConditions()
{
    if ( 
g_bBehaviorHost_PreventBaseClassGatherConditions )
        return;

    
BaseClass::GatherConditions();
}

//-------------------------------------

template <class BASE_NPC>
inline void CAI_BehaviorHost<BASE_NPC>::OnScheduleChange()

    if ( 
m_pCurBehavior )
        
m_pCurBehavior->BridgeOnScheduleChange(); 
    
BaseClass::OnScheduleChange();
}

//-------------------------------------

template <class BASE_NPC>
inline void CAI_BehaviorHost<BASE_NPC>::OnStartScheduleint scheduleType )
{
    if ( 
m_pCurBehavior )
        
m_pCurBehavior->BridgeOnStartSchedulescheduleType ); 
    
BaseClass::OnStartSchedulescheduleType );
}

//-------------------------------------

template <class BASE_NPC>
inline int CAI_BehaviorHost<BASE_NPC>::BackBridge_SelectSchedule() 
{
    return 
BaseClass::SelectSchedule();
}

//-------------------------------------

template <class BASE_NPC>
inline bool CAI_BehaviorHost<BASE_NPC>::BehaviorSelectSchedule()
{
    for ( 
int i 0m_Behaviors.Count(); i++ )
    {
        if ( 
m_Behaviors[i]->CanSelectSchedule() && ShouldBehaviorSelectSchedulem_Behaviors[i] ) )
        {
            
DeferSchedulingToBehaviorm_Behaviors[i] );
            return 
true;
        }
    }
    
    
DeferSchedulingToBehaviorNULL );
    return 
false;
}

//-------------------------------------

template <class BASE_NPC>
inline bool CAI_BehaviorHost<BASE_NPC>::IsRunningBehavior() const
{
    return ( 
m_pCurBehavior != NULL );
}

//-------------------------------------

template <class BASE_NPC>
inline CAI_BehaviorBase *CAI_BehaviorHost<BASE_NPC>::GetRunningBehavior()
{
    return 
m_pCurBehavior;
}

//-------------------------------------

template <class BASE_NPC>
inline CAI_Schedule *CAI_BehaviorHost<BASE_NPC>::GetNewSchedule()
{
    
m_bCalledBehaviorSelectSchedule false;
    
CAI_Schedule *pResult BaseClass::GetNewSchedule();
    if ( !
m_bCalledBehaviorSelectSchedule && m_pCurBehavior )
        
DeferSchedulingToBehaviorNULL );
    return 
pResult;
}

//-------------------------------------

template <class BASE_NPC>
inline CAI_Schedule *CAI_BehaviorHost<BASE_NPC>::GetFailSchedule()
{
    
m_bCalledBehaviorSelectSchedule false;
    
CAI_Schedule *pResult BaseClass::GetFailSchedule();
    if ( !
m_bCalledBehaviorSelectSchedule && m_pCurBehavior )
        
DeferSchedulingToBehaviorNULL );
    return 
pResult;
}

//------------------------------------

template <class BASE_NPC>
inline void CAI_BehaviorHost<BASE_NPC>::ChangeBehaviorToCAI_BehaviorBase *pNewBehavior )
{
    
bool change = ( m_pCurBehavior != pNewBehavior );
    
CAI_BehaviorBase *pOldBehavior m_pCurBehavior;
    
m_pCurBehavior pNewBehavior;
    
    if ( 
change 
    {
        if ( 
m_pCurBehavior )
        {
            
m_pCurBehavior->BeginScheduleSelection();

            
g_bBehaviorHost_PreventBaseClassGatherConditions true;
            
m_pCurBehavior->GatherConditions();
            
g_bBehaviorHost_PreventBaseClassGatherConditions false;
        }

        if ( 
pOldBehavior )
        {
            
pOldBehavior->EndScheduleSelection();
            
VacateStrategySlot();
        }

        
OnChangeRunningBehaviorpOldBehaviorpNewBehavior );
    }
}

//-------------------------------------

template <class BASE_NPC>
inline CAI_BehaviorBase *CAI_BehaviorHost<BASE_NPC>::DeferSchedulingToBehaviorCAI_BehaviorBase *pNewBehavior )
{
    
CAI_BehaviorBase *pOldBehavior m_pCurBehavior;
    
ChangeBehaviorTopNewBehavior );
    return 
pOldBehavior;
}

//-------------------------------------

template <class BASE_NPC>
inline int CAI_BehaviorHost<BASE_NPC>::BackBridge_TranslateScheduleint scheduleType 
{
    return 
BaseClass::TranslateSchedulescheduleType );
}

//-------------------------------------

template <class BASE_NPC>
inline int CAI_BehaviorHost<BASE_NPC>::TranslateScheduleint scheduleType 
{
    if ( 
m_pCurBehavior )
    {
        return 
m_pCurBehavior->BridgeTranslateSchedulescheduleType );
    }
    return 
BaseClass::TranslateSchedulescheduleType );
}

//-------------------------------------

template <class BASE_NPC>
inline void CAI_BehaviorHost<BASE_NPC>::PrescheduleThink()
{
    
BaseClass::PrescheduleThink();
    if ( 
m_pCurBehavior )
        
m_pCurBehavior->BridgePrescheduleThink();
}    

//-------------------------------------

template <class BASE_NPC>
inline int CAI_BehaviorHost<BASE_NPC>::SelectSchedule()
{
    
m_bCalledBehaviorSelectSchedule true;
    if ( 
m_pCurBehavior )
    {
        return 
m_pCurBehavior->BridgeSelectSchedule();
    }

    return 
BaseClass::SelectSchedule();
}

//-------------------------------------

template <class BASE_NPC>
inline void CAI_BehaviorHost<BASE_NPC>::KeepRunningBehavior()
{
    if ( 
m_pCurBehavior )
        
m_bCalledBehaviorSelectSchedule true;
}

//-------------------------------------

template <class BASE_NPC>
inline int CAI_BehaviorHost<BASE_NPC>::SelectFailScheduleint failedScheduleint failedTaskAI_TaskFailureCode_t taskFailCode )
{
    
m_bCalledBehaviorSelectSchedule true;
    
int result 0;
    if ( 
m_pCurBehavior && m_pCurBehavior->BridgeSelectFailSchedulefailedSchedulefailedTasktaskFailCode, &result ) )
        return 
result;
    return 
BaseClass::SelectFailSchedulefailedSchedulefailedTasktaskFailCode );
}

//-------------------------------------

template <class BASE_NPC>
inline void CAI_BehaviorHost<BASE_NPC>::StartTask( const Task_t *pTask )
{
    if ( 
m_pCurBehavior && m_pCurBehavior->BridgeStartTaskpTask ) )
        return;
    
BaseClass::StartTaskpTask );
}

//-------------------------------------

template <class BASE_NPC>
inline void CAI_BehaviorHost<BASE_NPC>::RunTask( const Task_t *pTask )
{
    if ( 
m_pCurBehavior && m_pCurBehavior->BridgeRunTaskpTask ) )
        return;
    
BaseClass::RunTaskpTask );
}

//-------------------------------------

template <class BASE_NPC>
inline void CAI_BehaviorHost<BASE_NPC>::AimGunvoid )
{
    if ( 
m_pCurBehavior && m_pCurBehavior->BridgeAimGun() )
        return;
    
BaseClass::AimGun();
}

//-------------------------------------

template <class BASE_NPC>
inline CAI_Schedule *CAI_BehaviorHost<BASE_NPC>::GetSchedule(int localScheduleID)
{
    
CAI_Schedule *pResult;
    if ( 
m_pCurBehavior && m_pCurBehavior->BridgeGetSchedulelocalScheduleID, &pResult ) )
        return 
pResult;
    return 
BaseClass::GetSchedulelocalScheduleID );
}

//-------------------------------------

template <class BASE_NPC>
inline const char *CAI_BehaviorHost<BASE_NPC>::TaskName(int taskID)
{
    const 
char *pszResult NULL;
    if ( 
m_pCurBehavior && m_pCurBehavior->BridgeTaskNametaskID, &pszResult ) )
        return 
pszResult;
    return 
BaseClass::TaskNametaskID );
}

//-------------------------------------

template <class BASE_NPC>
inline void CAI_BehaviorHost<BASE_NPC>::BuildScheduleTestBits()
{
    if ( 
m_pCurBehavior )
        
m_pCurBehavior->BridgeBuildScheduleTestBits(); 
    
BaseClass::BuildScheduleTestBits();
}

//-------------------------------------

template <class BASE_NPC>
inline void CAI_BehaviorHost<BASE_NPC>::OnChangeHintGroupstring_t oldGroupstring_t newGroup )
{
    for( 
int i 0m_Behaviors.Count(); i++ )
    {
        
m_Behaviors[i]->BridgeOnChangeHintGroupoldGroupnewGroup );
    }
    
BaseClass::OnChangeHintGroupoldGroupnewGroup );
}

//-------------------------------------

template <class BASE_NPC>
inline Activity CAI_BehaviorHost<BASE_NPC>::BackBridge_NPC_TranslateActivityActivity activity )
{
    return 
BaseClass::NPC_TranslateActivityactivity );
}

//-------------------------------------

template <class BASE_NPC>
inline Activity CAI_BehaviorHost<BASE_NPC>::NPC_TranslateActivityActivity activity )
{
    if ( 
m_pCurBehavior )
    {
        return 
m_pCurBehavior->BridgeNPC_TranslateActivityactivity );
    }
    return 
BaseClass::NPC_TranslateActivityactivity );
}

//-------------------------------------

template <class BASE_NPC>
inline bool CAI_BehaviorHost<BASE_NPC>::IsCurTaskContinuousMove()
{
    
bool result false;
    if ( 
m_pCurBehavior && m_pCurBehavior->BridgeIsCurTaskContinuousMove( &result ) )
        return 
result;
    return 
BaseClass::IsCurTaskContinuousMove();
}

//-------------------------------------

template <class BASE_NPC>
inline void CAI_BehaviorHost<BASE_NPC>::OnMovementFailed()

    if ( 
m_pCurBehavior )
        
m_pCurBehavior->BridgeOnMovementFailed(); 
    
BaseClass::OnMovementFailed();
}

//-------------------------------------

template <class BASE_NPC>
inline void CAI_BehaviorHost<BASE_NPC>::OnMovementComplete()

    if ( 
m_pCurBehavior )
        
m_pCurBehavior->BridgeOnMovementComplete(); 
    
BaseClass::OnMovementComplete();
}

//-------------------------------------

template <class BASE_NPC>
inline float CAI_BehaviorHost<BASE_NPC>::GetDefaultNavGoalTolerance()
{
    if ( 
m_pCurBehavior )
        return 
m_pCurBehavior->BridgeGetDefaultNavGoalTolerance();
    return 
BaseClass::GetDefaultNavGoalTolerance();
}

//-------------------------------------

template <class BASE_NPC>
inline float CAI_BehaviorHost<BASE_NPC>::BackBridge_GetDefaultNavGoalTolerance() 
{
    return 
BaseClass::GetDefaultNavGoalTolerance();
}

//-------------------------------------

template <class BASE_NPC>
inline bool CAI_BehaviorHost<BASE_NPC>::FValidateHintTypeCAI_Hint *pHint )
{
    
bool result false;
    if ( 
m_pCurBehavior && m_pCurBehavior->BridgeFValidateHintTypepHint, &result ) )
        return 
result;
    return 
BaseClass::FValidateHintTypepHint );
}

//-------------------------------------

template <class BASE_NPC>
inline bool CAI_BehaviorHost<BASE_NPC>::BackBridge_IsValidEnemy(CBaseEntity *pEnemy)
{
    return 
BaseClass::IsValidEnemypEnemy );
}

//-------------------------------------

template <class BASE_NPC>
inline CBaseEntity *CAI_BehaviorHost<BASE_NPC>::BackBridge_BestEnemy(void)
{
    return 
BaseClass::BestEnemy();
}

//-------------------------------------

template <class BASE_NPC>
inline bool CAI_BehaviorHost<BASE_NPC>::BackBridge_IsValidCover( const Vector &vLocationCAI_Hint const *pHint )
{
    return 
BaseClass::IsValidCovervLocationpHint );
}

//-------------------------------------

template <class BASE_NPC>
inline bool CAI_BehaviorHost<BASE_NPC>::BackBridge_IsValidShootPosition( const Vector &vLocationCAI_Node *pNodeCAI_Hint const *pHint )
{
    return 
BaseClass::IsValidShootPositionvLocationpNodepHint );
}

//-------------------------------------

template <class BASE_NPC>
inline float CAI_BehaviorHost<BASE_NPC>::BackBridge_GetMaxTacticalLateralMovementvoid )
{
    return 
BaseClass::GetMaxTacticalLateralMovement();
}

//-------------------------------------

template <class BASE_NPC>
inline bool CAI_BehaviorHost<BASE_NPC>::BackBridge_ShouldIgnoreSoundCSound *pSound )
{
    return 
BaseClass::ShouldIgnoreSoundpSound );
}

//-------------------------------------

template <class BASE_NPC>
inline void CAI_BehaviorHost<BASE_NPC>::BackBridge_OnSeeEntityCBaseEntity *pEntity )
{
    
BaseClass::OnSeeEntitypEntity );
}

//-------------------------------------

template <class BASE_NPC>
inline void CAI_BehaviorHost<BASE_NPC>::BackBridge_OnFriendDamagedCBaseCombatCharacter *pSquadmateCBaseEntity *pAttacker )
{
    
BaseClass::OnFriendDamagedpSquadmatepAttacker );
}


//-------------------------------------

template <class BASE_NPC>
inline bool CAI_BehaviorHost<BASE_NPC>::BackBridge_IsInterruptablevoid )
{
    return 
BaseClass::IsInterruptable();
}

//-------------------------------------

template <class BASE_NPC>
inline bool CAI_BehaviorHost<BASE_NPC>::BackBridge_IsNavigationUrgentvoid )
{
    return 
BaseClass::IsNavigationUrgent();
}

//-------------------------------------

template <class BASE_NPC>
inline bool CAI_BehaviorHost<BASE_NPC>::BackBridge_CanFlinchvoid )
{
    return 
BaseClass::CanFlinch();
}

//-------------------------------------

template <class BASE_NPC>
inline bool CAI_BehaviorHost<BASE_NPC>::BackBridge_IsCrouchingvoid )
{
    return 
BaseClass::IsCrouching();
}

//-------------------------------------

template <class BASE_NPC>
inline bool CAI_BehaviorHost<BASE_NPC>::BackBridge_IsCrouchedActivityActivity activity )
{
    return 
BaseClass::IsCrouchedActivityactivity );
}

//-------------------------------------

template <class BASE_NPC>
inline bool CAI_BehaviorHost<BASE_NPC>::BackBridge_QueryHearSoundCSound *pSound )
{
    return 
BaseClass::QueryHearSoundpSound );
}

//-------------------------------------

template <class BASE_NPC>
inline bool CAI_BehaviorHost<BASE_NPC>::BackBridge_CanRunAScriptedNPCInteractionbool bForced )
{
    return 
BaseClass::CanRunAScriptedNPCInteractionbForced );
}

//-------------------------------------

template <class BASE_NPC>
inline bool CAI_BehaviorHost<BASE_NPC>::BackBridge_ShouldPlayerAvoidvoid )
{
    return 
BaseClass::ShouldPlayerAvoid();
}

//-------------------------------------

template <class BASE_NPC>
inline int CAI_BehaviorHost<BASE_NPC>::BackBridge_OnTakeDamage_Alive( const CTakeDamageInfo &info )
{
    return 
BaseClass::OnTakeDamage_Aliveinfo );
}

//-------------------------------------

template <class BASE_NPC>
inline float CAI_BehaviorHost<BASE_NPC>::BackBridge_GetReasonableFacingDistvoid )
{
    return 
BaseClass::GetReasonableFacingDist();
}

//-------------------------------------

template <class BASE_NPC>
inline Activity CAI_BehaviorHost<BASE_NPC>::BackBridge_GetFlinchActivitybool bHeavyDamagebool bGesture )
{
    return 
BaseClass::GetFlinchActivitybHeavyDamagebGesture );
}

//-------------------------------------

template <class BASE_NPC>
inline bool CAI_BehaviorHost<BASE_NPC>::BackBridge_OnCalcBaseMoveAILocalMoveGoal_t *pMoveGoalfloat distClearAIMoveResult_t *pResult )
{
    return 
BaseClass::OnCalcBaseMovepMoveGoaldistClearpResult );
}

//-------------------------------------

template <class BASE_NPC>
inline void CAI_BehaviorHost<BASE_NPC>::BackBridge_ModifyOrAppendCriteriaAI_CriteriaSet &criteriaSet )
{
    
BaseClass::ModifyOrAppendCriteriacriteriaSet );
}

//-------------------------------------

template <class BASE_NPC>
inline void CAI_BehaviorHost<BASE_NPC>::BackBridge_Teleport( const Vector *newPosition, const QAngle *newAngles, const Vector *newVelocity )
{
    
BaseClass::TeleportnewPositionnewAnglesnewVelocity );
}

//-------------------------------------

template <class BASE_NPC>
inline void CAI_BehaviorHost<BASE_NPC>::BackBridge_HandleAnimEventanimevent_t *pEvent )
{
    
BaseClass::HandleAnimEventpEvent );
}

//-------------------------------------

template <class BASE_NPC>
inline bool CAI_BehaviorHost<BASE_NPC>::IsValidEnemyCBaseEntity *pEnemy )
{
    if ( 
m_pCurBehavior )
        return 
m_pCurBehavior->BridgeIsValidEnemypEnemy );
    
    return 
BaseClass::IsValidEnemypEnemy );
}

//-------------------------------------

template <class BASE_NPC>
inline CBaseEntity *CAI_BehaviorHost<BASE_NPC>::BestEnemy()
{
    if ( 
m_pCurBehavior )
        return 
m_pCurBehavior->BridgeBestEnemy();
    
    return 
BaseClass::BestEnemy();
}
    
//-------------------------------------

template <class BASE_NPC>
inline bool CAI_BehaviorHost<BASE_NPC>::ShouldAlwaysThink()
{
    
bool result false;
    if ( 
m_pCurBehavior && m_pCurBehavior->BridgeShouldAlwaysThink( &result ) )
        return 
result;
    return 
BaseClass::ShouldAlwaysThink();
}

//-------------------------------------

template <class BASE_NPC>
inline void CAI_BehaviorHost<BASE_NPC>::OnChangeActiveWeaponCBaseCombatWeapon *pOldWeaponCBaseCombatWeapon *pNewWeapon )
{
    for( 
int i 0m_Behaviors.Count(); i++ )
    {
        
m_Behaviors[i]->BridgeOnChangeActiveWeaponpOldWeaponpNewWeapon );
    }
    
BaseClass::OnChangeActiveWeaponpOldWeaponpNewWeapon );
}

//-------------------------------------

template <class BASE_NPC>
inline bool CAI_BehaviorHost<BASE_NPC>::SpeakMapmakerInterruptConceptstring_t iszConcept )
{
    for( 
int i 0m_Behaviors.Count(); i++ )
    {
        if ( 
m_Behaviors[i]->BridgeSpeakMapmakerInterruptConceptiszConcept ) )
            return 
true;
    }

    return 
false;
}

//-------------------------------------

template <class BASE_NPC>
inline void CAI_BehaviorHost<BASE_NPC>::OnRestore()
{
    for( 
int i 0m_Behaviors.Count(); i++ )
    {
        
m_Behaviors[i]->BridgeOnRestore();
    }
    
BaseClass::OnRestore();
}

//-------------------------------------

template <class BASE_NPC>
inline bool CAI_BehaviorHost<BASE_NPC>::IsValidCover( const Vector &vLocationCAI_Hint const *pHint )
{
    if ( 
m_pCurBehavior )
        return 
m_pCurBehavior->BridgeIsValidCovervLocationpHint );
    
    return 
BaseClass::IsValidCovervLocationpHint );
}
    
//-------------------------------------

template <class BASE_NPC>
inline bool CAI_BehaviorHost<BASE_NPC>::IsValidShootPosition( const Vector &vLocationCAI_Node *pNodeCAI_Hint const *pHint )
{
    if ( 
m_pCurBehavior )
        return 
m_pCurBehavior->BridgeIsValidShootPositionvLocationpNodepHint );
    
    return 
BaseClass::IsValidShootPositionvLocationpNodepHint );
}

//-------------------------------------

template <class BASE_NPC>
inline float CAI_BehaviorHost<BASE_NPC>::GetMaxTacticalLateralMovementvoid )
{
    if ( 
m_pCurBehavior )
        return 
m_pCurBehavior->BridgeGetMaxTacticalLateralMovement();

    return 
BaseClass::GetMaxTacticalLateralMovement();
}

//-------------------------------------

template <class BASE_NPC>
inline bool CAI_BehaviorHost<BASE_NPC>::ShouldIgnoreSoundCSound *pSound )
{
    if ( 
m_pCurBehavior )
        return 
m_pCurBehavior->BridgeShouldIgnoreSoundpSound );
    
    return 
BaseClass::ShouldIgnoreSoundpSound );
}

//-------------------------------------

template <class BASE_NPC>
inline void CAI_BehaviorHost<BASE_NPC>::OnSeeEntityCBaseEntity *pEntity )
{
    if ( 
m_pCurBehavior )
        return 
m_pCurBehavior->BridgeOnSeeEntitypEntity );

    
BaseClass::OnSeeEntitypEntity );
}

//-------------------------------------

template <class BASE_NPC>
inline void CAI_BehaviorHost<BASE_NPC>::OnFriendDamagedCBaseCombatCharacter *pSquadmateCBaseEntity *pAttacker )
{
    if ( 
m_pCurBehavior )
        return 
m_pCurBehavior->BridgeOnFriendDamagedpSquadmatepAttacker );

    
BaseClass::OnFriendDamagedpSquadmatepAttacker );
}

//-------------------------------------

template <class BASE_NPC>
inline bool CAI_BehaviorHost<BASE_NPC>::IsInterruptablevoid )
{
    if ( 
m_pCurBehavior )
        return 
m_pCurBehavior->BridgeIsInterruptable();
    
    return 
BaseClass::IsInterruptable();
}

//-------------------------------------

template <class BASE_NPC>
inline bool CAI_BehaviorHost<BASE_NPC>::IsNavigationUrgentvoid )
{
    if ( 
m_pCurBehavior )
        return 
m_pCurBehavior->BridgeIsNavigationUrgent();

    return 
BaseClass::IsNavigationUrgent();
}

//-------------------------------------

template <class BASE_NPC>
inline bool CAI_BehaviorHost<BASE_NPC>::CanFlinchvoid )
{
    if ( 
m_pCurBehavior )
        return 
m_pCurBehavior->BridgeCanFlinch();

    return 
BaseClass::CanFlinch();
}

//-------------------------------------

template <class BASE_NPC>
inline bool CAI_BehaviorHost<BASE_NPC>::IsCrouchingvoid )
{
    if ( 
m_pCurBehavior )
        return 
m_pCurBehavior->BridgeIsCrouching();

    return 
BaseClass::IsCrouching();
}

//-------------------------------------

template <class BASE_NPC>
inline bool CAI_BehaviorHost<BASE_NPC>::IsCrouchedActivityActivity activity )
{
    if ( 
m_pCurBehavior )
        return 
m_pCurBehavior->BridgeIsCrouchedActivityactivity );

    return 
BaseClass::IsCrouchedActivityactivity );
}

//-------------------------------------

template <class BASE_NPC>
inline bool CAI_BehaviorHost<BASE_NPC>::QueryHearSoundCSound *pSound )
{
    if ( 
m_pCurBehavior )
        return 
m_pCurBehavior->BridgeQueryHearSoundpSound );

    return 
BaseClass::QueryHearSoundpSound );
}

//-------------------------------------

template <class BASE_NPC>
inline bool CAI_BehaviorHost<BASE_NPC>::CanRunAScriptedNPCInteractionbool bForced )
{
    if ( 
m_pCurBehavior )
        return 
m_pCurBehavior->BridgeCanRunAScriptedNPCInteractionbForced );

    return 
BaseClass::CanRunAScriptedNPCInteractionbForced );
}

//-------------------------------------

template <class BASE_NPC>
inline bool CAI_BehaviorHost<BASE_NPC>::ShouldPlayerAvoidvoid )
{
    if ( 
m_pCurBehavior )
        return 
m_pCurBehavior->BridgeShouldPlayerAvoid();
    
    return 
BaseClass::ShouldPlayerAvoid();
}

//-------------------------------------

template <class BASE_NPC>
inline int CAI_BehaviorHost<BASE_NPC>::OnTakeDamage_Alive( const CTakeDamageInfo &info )
{
    if ( 
m_pCurBehavior )
        return 
m_pCurBehavior->BridgeOnTakeDamage_Aliveinfo );
    
    return 
BaseClass::OnTakeDamage_Aliveinfo );
}

//-------------------------------------

template <class BASE_NPC>
inline float CAI_BehaviorHost<BASE_NPC>::GetReasonableFacingDistvoid )    
{
    if ( 
m_pCurBehavior )
        return 
m_pCurBehavior->BridgeGetReasonableFacingDist();
    
    return 
BaseClass::GetReasonableFacingDist();
}

//-------------------------------------

template <class BASE_NPC>
inline void CAI_BehaviorHost<BASE_NPC>::Precache()
{
    
BaseClass::Precache();
    for( 
int i 0m_Behaviors.Count(); i++ )
    {
        
m_Behaviors[i]->BridgePrecache();
    }
}

//-------------------------------------

template <class BASE_NPC>
inline bool CAI_BehaviorHost<BASE_NPC>::ScheduledMoveToGoalEntityint scheduleTypeCBaseEntity *pGoalEntityActivity movementActivity )
{
    
// If a behavior is active, we need to stop running it
    
ChangeBehaviorToNULL );

    return 
BaseClass::ScheduledMoveToGoalEntityscheduleTypepGoalEntitymovementActivity );
}

//-------------------------------------

template <class BASE_NPC>
inline bool CAI_BehaviorHost<BASE_NPC>::ScheduledFollowPathint scheduleTypeCBaseEntity *pPathStartActivity movementActivity )
{
    
// If a behavior is active, we need to stop running it
    
ChangeBehaviorToNULL );

    return 
BaseClass::ScheduledFollowPathscheduleTypepPathStartmovementActivity );
}

//-------------------------------------

template <class BASE_NPC>
inline void CAI_BehaviorHost<BASE_NPC>::ForceSelectedGo(CBaseEntity *pPlayer, const Vector &targetPos, const Vector &traceDirbool bRun)
{
    
// If a behavior is active, we need to stop running it
    
ChangeBehaviorToNULL );

    
BaseClass::ForceSelectedGo(pPlayertargetPostraceDirbRun);
}

//-------------------------------------

template <class BASE_NPC>
inline void CAI_BehaviorHost<BASE_NPC>::ForceSelectedGoRandom(void)
{
    
// If a behavior is active, we need to stop running it
    
ChangeBehaviorToNULL );

    
BaseClass::ForceSelectedGoRandom();
}

//-------------------------------------

template <class BASE_NPC>
inline void CAI_BehaviorHost<BASE_NPC>::NPCInit()
{
    
BaseClass::NPCInit();
    for( 
int i 0m_Behaviors.Count(); i++ )
    {
        
m_Behaviors[i]->BridgeSpawn();
    }
}

//-------------------------------------

template <class BASE_NPC>
inline void CAI_BehaviorHost<BASE_NPC>::UpdateOnRemove()
{
    for( 
int i 0m_Behaviors.Count(); i++ )
    {
        
m_Behaviors[i]->BridgeUpdateOnRemove();
    }
    
BaseClass::UpdateOnRemove();
}

//-------------------------------------

template <class BASE_NPC>
inline void CAI_BehaviorHost<BASE_NPC>::Event_Killed( const CTakeDamageInfo &info )
{
    for( 
int i 0m_Behaviors.Count(); i++ )
    {
        
m_Behaviors[i]->BridgeEvent_Killedinfo );
    }
    
BaseClass::Event_Killedinfo );
}

//-------------------------------------

template <class BASE_NPC>
inline Activity CAI_BehaviorHost<BASE_NPC>::GetFlinchActivitybool bHeavyDamagebool bGesture )
{
    if ( 
m_pCurBehavior )
        return 
m_pCurBehavior->BridgeGetFlinchActivitybHeavyDamagebGesture );

    return 
BaseClass::GetFlinchActivitybHeavyDamagebGesture );
}

//-------------------------------------

template <class BASE_NPC>
inline bool CAI_BehaviorHost<BASE_NPC>::OnCalcBaseMoveAILocalMoveGoal_t *pMoveGoalfloat distClearAIMoveResult_t *pResult )
{
    if ( 
m_pCurBehavior )
        return 
m_pCurBehavior->BridgeOnCalcBaseMovepMoveGoaldistClearpResult );

    return 
BaseClass::OnCalcBaseMovepMoveGoaldistClearpResult );
}

//-------------------------------------

template <class BASE_NPC>
inline void CAI_BehaviorHost<BASE_NPC>::ModifyOrAppendCriteriaAI_CriteriaSet &criteriaSet )
{
    
BaseClass::ModifyOrAppendCriteriacriteriaSet );

    if ( 
m_pCurBehavior )
    {
        
// Append active behavior name
        
criteriaSet.AppendCriteria"active_behavior"GetRunningBehavior()->GetName() );
        
        
m_pCurBehavior->BridgeModifyOrAppendCriteriacriteriaSet );
        return;
    }
}

//-------------------------------------

template <class BASE_NPC>
inline void CAI_BehaviorHost<BASE_NPC>::Teleport( const Vector *newPosition, const QAngle *newAngles, const Vector *newVelocity )
{
    if ( 
m_pCurBehavior )
    {
        
m_pCurBehavior->BridgeTeleportnewPositionnewAnglesnewVelocity );
        return;
    }

    
BaseClass::TeleportnewPositionnewAnglesnewVelocity );
}

//-------------------------------------

template <class BASE_NPC>
inline void CAI_BehaviorHost<BASE_NPC>::HandleAnimEventanimevent_t *pEvent )
{
    if ( 
m_pCurBehavior )
        return 
m_pCurBehavior->BridgeHandleAnimEventpEvent );

    return 
BaseClass::HandleAnimEventpEvent );
}

//-------------------------------------

template <class BASE_NPC>
inline bool CAI_BehaviorHost<BASE_NPC>::OnBehaviorChangeStatus(  CAI_BehaviorBase *pBehaviorbool fCanFinishSchedule )
{
    if ( 
pBehavior == GetRunningBehavior() && !pBehavior->CanSelectSchedule() && !fCanFinishSchedule )
    {
        
DeferSchedulingToBehaviorNULL );
        return 
true;
    }
    return 
false;
}

//-------------------------------------

template <class BASE_NPC>
inline void CAI_BehaviorHost<BASE_NPC>::OnChangeRunningBehaviorCAI_BehaviorBase *pOldBehavior,  CAI_BehaviorBase *pNewBehavior )
{
}

//-------------------------------------

template <class BASE_NPC>
inline void CAI_BehaviorHost<BASE_NPC>::AddBehaviorCAI_BehaviorBase *pBehavior )
{
#ifdef DEBUG
    
Assertm_Behaviors.FindpBehavior ) == m_Behaviors.InvalidIndex() );
    
Assertm_fDebugInCreateBehaviors );
    for ( 
int i 0m_Behaviors.Count(); i++)
    {
        
Asserttypeid(*m_Behaviors[i]) != typeid(*pBehavior) );
    }
#endif
    
m_Behaviors.AddToTailpBehavior );
    
pBehavior->SetOuterthis );
    
pBehavior->SetBackBridgethis );
}

//-------------------------------------

template <class BASE_NPC>
inline CAI_BehaviorBase **CAI_BehaviorHost<BASE_NPC>::AccessBehaviors()
{
    if (
m_Behaviors.Count())
        return 
m_Behaviors.Base();
    return 
NULL;
}

//-------------------------------------

template <class BASE_NPC>
inline int CAI_BehaviorHost<BASE_NPC>::NumBehaviors()
{
    return 
m_Behaviors.Count();
}

//-------------------------------------

template <class BASE_NPC>
inline int CAI_BehaviorHost<BASE_NPC>::SaveISave &save )
{
    
int result BaseClass::Savesave );
    if ( 
result )
        
CAI_BehaviorBase::SaveBehaviorssavem_pCurBehaviorAccessBehaviors(), NumBehaviors() );
    return 
result;
}

//-------------------------------------

template <class BASE_NPC>
inline int CAI_BehaviorHost<BASE_NPC>::RestoreIRestore &restore )
{
    
int result BaseClass::Restorerestore );
    if ( 
result )
    {
        
int iCurrent CAI_BehaviorBase::RestoreBehaviorsrestoreAccessBehaviors(), NumBehaviors() );
        if ( 
iCurrent != -)
            
m_pCurBehavior AccessBehaviors()[iCurrent];
        else
            
m_pCurBehavior NULL;
    }
    return 
result;
}

//-------------------------------------

template <class BASE_NPC>
inline bool CAI_BehaviorHost<BASE_NPC>::CreateComponents()
{
    if ( 
BaseClass::CreateComponents() )
    {
#ifdef DEBUG
        
m_fDebugInCreateBehaviors true;
#endif
        
bool result CreateBehaviors();
#ifdef DEBUG
        
m_fDebugInCreateBehaviors false;
#endif
        
return result;
    }
    return 
false;
}

//-----------------------------------------------------------------------------

#endif // AI_BEHAVIOR_H 

Last edited by 01101101; 12-17-2009 at 19:16.
01101101 is offline
meTaLiCroSS
Gaze Upon My Hat
Join Date: Feb 2009
Location: Viña del Mar, Chile
Old 12-17-2009 , 19:44   Re: [ES][OFF] Todas las Boludeces Aca!!
#99

Thread Favorito del Gordo Rubio
__________________
Quote:
Originally Posted by joropito View Post
You're right Metalicross
meTaLiCroSS is offline
fezh
Veteran Member
Join Date: Dec 2008
Location: BANNED
Old 12-17-2009 , 20:38   Re: [ES][OFF] Todas las Boludeces Aca!!
#100

Hola vengo a robar post.
__________________
"There is no knowledge, that is not power"
fezh is offline
Closed Thread



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -4. The time now is 15:26.


Powered by vBulletin®
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
Theme made by Freecode