本文整理汇总了C++中NPC_FaceEnemy函数的典型用法代码示例。如果您正苦于以下问题:C++ NPC_FaceEnemy函数的具体用法?C++ NPC_FaceEnemy怎么用?C++ NPC_FaceEnemy使用的例子?那么, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了NPC_FaceEnemy函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: Mark1_Hunt
/*
-------------------------
Mark1_Hunt
- look for enemy.
-------------------------`
*/
void Mark1_Hunt(void)
{
if ( NPCInfo->goalEntity == NULL )
{
NPCInfo->goalEntity = NPC->enemy;
}
NPC_FaceEnemy( qtrue );
NPCInfo->combatMove = qtrue;
NPC_MoveToGoal( qtrue );
}
示例2: Mark2_Hunt
/*
-------------------------
Mark2_Hunt
-------------------------
*/
void Mark2_Hunt(void)
{
if ( NPCInfo->goalEntity == NULL )
{
NPCInfo->goalEntity = NPC->enemy;
}
// Turn toward him before moving towards him.
NPC_FaceEnemy( qtrue );
NPCInfo->combatMove = qtrue;
NPC_MoveToGoal( qtrue );
}
示例3: ImperialProbe_AttackDecision
void ImperialProbe_AttackDecision( void )
{
float distance;
qboolean visible;
qboolean advance;
// Always keep a good height off the ground
ImperialProbe_MaintainHeight();
//randomly talk
if ( TIMER_Done(NPC,"patrolNoise") )
{
if (TIMER_Done(NPC,"angerNoise"))
{
G_SoundOnEnt( NPC, CHAN_AUTO, va("sound/chars/probe/misc/probetalk%d", Q_irand(1, 3)) );
TIMER_Set( NPC, "patrolNoise", Q_irand( 4000, 10000 ) );
}
}
// If we don't have an enemy, just idle
if ( NPC_CheckEnemyExt(qfalse) == qfalse )
{
ImperialProbe_Idle();
return;
}
NPC_SetAnim( NPC, SETANIM_BOTH, BOTH_RUN1, SETANIM_FLAG_NORMAL);
// Rate our distance to the target, and our visibilty
distance = (int) DistanceHorizontalSquared( NPC->r.currentOrigin, NPC->enemy->r.currentOrigin );
visible = NPC_ClearLOS4( NPC->enemy );
advance = (qboolean)(distance > MIN_DISTANCE_SQR);
// If we cannot see our target, move to see it
if ( visible == qfalse )
{
if ( NPCInfo->scriptFlags & SCF_CHASE_ENEMIES )
{
ImperialProbe_Hunt( visible, advance );
return;
}
}
// Sometimes I have problems with facing the enemy I'm attacking, so force the issue so I don't look dumb
NPC_FaceEnemy( qtrue );
// Decide what type of attack to do
ImperialProbe_Ranged( visible, advance );
}
示例4: Sentry_AttackDecision
/*
-------------------------
Sentry_AttackDecision
-------------------------
*/
void Sentry_AttackDecision( void ) {
float distance;
qboolean visible;
qboolean advance;
// Always keep a good height off the ground
Sentry_MaintainHeight();
NPC->s.loopSound = G_SoundIndex( "sound/chars/sentry/misc/sentry_hover_2_lp" );
//randomly talk
if ( TIMER_Done( NPC, "patrolNoise" ) ) {
if ( TIMER_Done( NPC, "angerNoise" ) ) {
G_SoundOnEnt( NPC, CHAN_AUTO, va( "sound/chars/sentry/misc/talk%d", Q_irand( 1, 3 ) ) );
TIMER_Set( NPC, "patrolNoise", Q_irand( 4000, 10000 ) );
}
}
// He's dead.
if ( NPC->enemy->health < 1 ) {
NPC->enemy = NULL;
Sentry_Idle();
return;
}
// If we don't have an enemy, just idle
if ( NPC_CheckEnemyExt( qfalse ) == qfalse ) {
Sentry_Idle();
return;
}
// Rate our distance to the target and visibilty
distance = (int)DistanceHorizontalSquared( &NPC->r.currentOrigin, &NPC->enemy->r.currentOrigin );
visible = NPC_ClearLOS4( NPC->enemy );
advance = (qboolean)(distance > MIN_DISTANCE_SQR);
// If we cannot see our target, move to see it
if ( visible == qfalse ) {
if ( NPCInfo->scriptFlags & SCF_CHASE_ENEMIES ) {
Sentry_Hunt( visible, advance );
return;
}
}
NPC_FaceEnemy( qtrue );
Sentry_RangedAttack( visible, advance );
}
示例5: Interrogator_Attack
/*
-------------------------
Interrogator_Attack
-------------------------
*/
void Interrogator_Attack( void )
{
float distance;
qboolean visible;
qboolean advance;
// Always keep a good height off the ground
Interrogator_MaintainHeight();
//randomly talk
if ( TIMER_Done(NPC,"patrolNoise") )
{
if (TIMER_Done(NPC,"angerNoise"))
{
G_SoundOnEnt( NPC, CHAN_AUTO, va("sound/chars/probe/misc/talk.wav", Q_irand(1, 3)) );
TIMER_Set( NPC, "patrolNoise", Q_irand( 4000, 10000 ) );
}
}
// If we don't have an enemy, just idle
if ( NPC_CheckEnemyExt(qfalse) == qfalse )
{
Interrogator_Idle();
return;
}
// Rate our distance to the target, and our visibilty
distance = (int) DistanceHorizontalSquared( NPC->r.currentOrigin, NPC->enemy->r.currentOrigin );
visible = NPC_ClearLOS4( NPC->enemy );
advance = (qboolean)(distance > MIN_DISTANCE*MIN_DISTANCE );
if ( !visible )
{
advance = qtrue;
}
if ( NPCInfo->scriptFlags & SCF_CHASE_ENEMIES )
{
Interrogator_Hunt( visible, advance );
}
NPC_FaceEnemy( qtrue );
if (!advance)
{
Interrogator_Melee( visible, advance );
}
}
示例6: NPC_CheckCanAttackExt
qboolean NPC_CheckCanAttackExt( void )
{
//We don't want them to shoot
if( NPCInfo->scriptFlags & SCF_DONT_FIRE )
return qfalse;
//Turn to face
if ( NPC_FaceEnemy( qtrue ) == qfalse )
return qfalse;
//Must have a clear line of sight to the target
if ( NPC_ClearShot( NPC->enemy ) == qfalse )
return qfalse;
return qtrue;
}
示例7: Interrogator_Hunt
void Interrogator_Hunt( qboolean visible, qboolean advance )
{
float distance, speed;
vec3_t forward;
Interrogator_PartsMove();
NPC_FaceEnemy(qfalse);
//If we're not supposed to stand still, pursue the player
if ( NPCInfo->standTime < level.time )
{
// Only strafe when we can see the player
if ( visible )
{
Interrogator_Strafe();
if ( NPCInfo->standTime > level.time )
{//successfully strafed
return;
}
}
}
//If we don't want to advance, stop here
if ( advance == qfalse )
return;
//Only try and navigate if the player is visible
if ( visible == qfalse )
{
// Move towards our goal
NPCInfo->goalEntity = NPC->enemy;
NPCInfo->goalRadius = 12;
//Get our direction from the navigator if we can't see our target
if ( NPC_GetMoveDirection( forward, &distance ) == qfalse )
return;
}
else
{
VectorSubtract( NPC->enemy->r.currentOrigin, NPC->r.currentOrigin, forward );
distance = VectorNormalize( forward );
}
speed = HUNTER_FORWARD_BASE_SPEED + HUNTER_FORWARD_MULTIPLIER * g_spskill.integer;
VectorMA( NPC->client->ps.velocity, speed, forward, NPC->client->ps.velocity );
}
示例8: Seeker_Hunt
//------------------------------------
void Seeker_Hunt( qboolean visible, qboolean advance )
{
float distance, speed;
vector3 forward;
NPC_FaceEnemy( qtrue );
// If we're not supposed to stand still, pursue the player
if ( NPCInfo->standTime < level.time )
{
// Only strafe when we can see the player
if ( visible )
{
Seeker_Strafe();
return;
}
}
// If we don't want to advance, stop here
if ( advance == qfalse )
{
return;
}
// Only try and navigate if the player is visible
if ( visible == qfalse )
{
// Move towards our goal
NPCInfo->goalEntity = NPC->enemy;
NPCInfo->goalRadius = 24;
// Get our direction from the navigator if we can't see our target
if ( NPC_GetMoveDirection( &forward, &distance ) == qfalse )
{
return;
}
}
else
{
VectorSubtract( &NPC->enemy->r.currentOrigin, &NPC->r.currentOrigin, &forward );
distance = VectorNormalize( &forward );
}
speed = SEEKER_FORWARD_BASE_SPEED + SEEKER_FORWARD_MULTIPLIER * g_spSkill.integer;
VectorMA( &NPC->client->ps.velocity, speed, &forward, &NPC->client->ps.velocity );
}
示例9: Reaver_Jump
/*
-------------------------
Reaver_Jump
-------------------------
*/
void Reaver_Jump( void )
{
if ( NPC->enemy )
NPC_FaceEnemy();
// This seems a bit risky, but here I'm trying to actually delay the jump process so it's timed up better with its anims
if ( NPCInfo->jumpTime - 2500 > level.time && level.time + 2700 > NPCInfo->jumpTime )
{
vec3_t dir;
AngleVectors( NPC->currentAngles, dir, NULL, NULL );
VectorScale( dir, REAVER_JUMP_VELOCITY, dir );
dir[2] += REAVER_JUMP_HEIGHT;
VectorCopy( dir, NPC->client->ps.velocity );
}
}
示例10: Seeker_Hunt
//------------------------------------
void Seeker_Hunt( qboolean visible, qboolean advance )
{
float speed;
vec3_t forward;
NPC_FaceEnemy( qtrue );
// If we're not supposed to stand still, pursue the player
if ( NPCInfo->standTime < level.time )
{
// Only strafe when we can see the player
if ( visible )
{
Seeker_Strafe();
return;
}
}
// If we don't want to advance, stop here
if ( advance == qfalse )
{
return;
}
// Only try and navigate if the player is visible
if ( visible == qfalse )
{
// Move towards our goal
NPCInfo->goalEntity = NPC->enemy;
NPCInfo->goalRadius = 24;
NPC_MoveToGoal(qtrue);
return;
}
else
{
VectorSubtract( NPC->enemy->currentOrigin, NPC->currentOrigin, forward );
/*distance = */VectorNormalize( forward );
}
speed = SEEKER_FORWARD_BASE_SPEED + SEEKER_FORWARD_MULTIPLIER * g_spskill->integer;
VectorMA( NPC->client->ps.velocity, speed, forward, NPC->client->ps.velocity );
}
示例11: Boba_DoSniper
void Boba_DoSniper( gentity_t *self)
{
if (TIMER_Done(NPC, "PickNewSniperPoint"))
{
TIMER_Set(NPC, "PickNewSniperPoint", Q_irand(15000, 25000));
int SniperPoint = NPC_FindCombatPoint(NPC->currentOrigin, 0, NPC->currentOrigin, CP_SNIPE|CP_CLEAR|CP_HAS_ROUTE|CP_TRYFAR|CP_HORZ_DIST_COLL, 0, -1);
if (SniperPoint!=-1)
{
NPC_SetCombatPoint(SniperPoint);
NPC_SetMoveGoal( NPC, level.combatPoints[SniperPoint].origin, 20, qtrue, SniperPoint );
}
}
if (Distance(NPC->currentOrigin, level.combatPoints[NPCInfo->combatPoint].origin)<50.0f)
{
Boba_FireDecide();
}
bool IsOnAPath = !!NPC_MoveToGoal(qtrue);
// Resolve Blocked Problems
//--------------------------
if (NPCInfo->aiFlags&NPCAI_BLOCKED &&
NPC->client->moveType!=MT_FLYSWIM &&
((level.time - NPCInfo->blockedDebounceTime)>3000)
)
{
Boba_Printf("BLOCKED: Attempting Jump");
if (IsOnAPath)
{
if (!NPC_TryJump(NPCInfo->blockedTargetPosition))
{
Boba_Printf(" Failed");
}
}
}
NPC_FaceEnemy(qtrue);
NPC_UpdateAngles( qtrue, qtrue );
}
示例12: MineMonster_Combat
//----------------------------------
void MineMonster_Combat( void )
{
float distance;
qboolean advance;
// If we cannot see our target or we have somewhere to go, then do that
if ( !NPC_ClearLOS4( NPC->enemy ) || UpdateGoal( ))
{
NPCInfo->combatMove = qtrue;
NPCInfo->goalEntity = NPC->enemy;
NPCInfo->goalRadius = MAX_DISTANCE; // just get us within combat range
NPC_MoveToGoal( qtrue );
return;
}
// Sometimes I have problems with facing the enemy I'm attacking, so force the issue so I don't look dumb
NPC_FaceEnemy( qtrue );
distance = DistanceHorizontalSquared( &NPC->r.currentOrigin, &NPC->enemy->r.currentOrigin );
advance = (qboolean)( distance > MIN_DISTANCE_SQR ? qtrue : qfalse );
if (( advance || NPCInfo->localState == LSTATE_WAITING ) && TIMER_Done( NPC, "attacking" )) // waiting monsters can't attack
{
if ( TIMER_Done2( NPC, "takingPain", qtrue ))
{
NPCInfo->localState = LSTATE_CLEAR;
}
else
{
MineMonster_Move( qtrue );
}
}
else
{
MineMonster_Attack();
}
}
示例13: RT_Flying_Think
void RT_Flying_Think( void )
{
if ( Q3_TaskIDPending( NPC, TID_MOVE_NAV )
&& UpdateGoal() )
{//being scripted to go to a certain spot, don't maintain height
if ( NPC_MoveToGoal( qtrue ) )
{//we could macro-nav to our goal
if ( NPC->enemy && NPC->enemy->health && NPC->enemy->inuse )
{
NPC_FaceEnemy( qtrue );
RT_FireDecide();
}
}
else
{//frick, no where to nav to, keep us in the air!
RT_Flying_MaintainHeight();
}
return;
}
if ( NPC->random == 0.0f )
{
// used to offset seekers around a circle so they don't occupy the same spot. This is not a fool-proof method.
NPC->random = random() * 6.3f; // roughly 2pi
}
if ( NPC->enemy && NPC->enemy->health && NPC->enemy->inuse )
{
RT_Flying_Attack();
RT_FireDecide();
return;
}
else
{
RT_Flying_MaintainHeight();
RT_RunStormtrooperAI();
return;
}
}
示例14: Rancor_Combat
//----------------------------------
void Rancor_Combat( void )
{
if ( NPCS.NPC->count )
{//holding my enemy
if ( TIMER_Done2( NPCS.NPC, "takingPain", qtrue ))
{
NPCS.NPCInfo->localState = LSTATE_CLEAR;
}
else
{
Rancor_Attack( 0, qfalse );
}
NPC_UpdateAngles( qtrue, qtrue );
return;
}
// If we cannot see our target or we have somewhere to go, then do that
if ( !NPC_ClearLOS4( NPCS.NPC->enemy ) )//|| UpdateGoal( ))
{
NPCS.NPCInfo->combatMove = qtrue;
NPCS.NPCInfo->goalEntity = NPCS.NPC->enemy;
NPCS.NPCInfo->goalRadius = MIN_DISTANCE;//MAX_DISTANCE; // just get us within combat range
if ( !NPC_MoveToGoal( qtrue ) )
{//couldn't go after him? Look for a new one
TIMER_Set( NPCS.NPC, "lookForNewEnemy", 0 );
NPCS.NPCInfo->consecutiveBlockedMoves++;
}
else
{
NPCS.NPCInfo->consecutiveBlockedMoves = 0;
}
return;
}
// Sometimes I have problems with facing the enemy I'm attacking, so force the issue so I don't look dumb
NPC_FaceEnemy( qtrue );
{
float distance;
qboolean advance;
qboolean doCharge;
distance = Distance( NPCS.NPC->r.currentOrigin, NPCS.NPC->enemy->r.currentOrigin );
advance = (qboolean)( distance > (NPCS.NPC->r.maxs[0]+MIN_DISTANCE) ? qtrue : qfalse );
doCharge = qfalse;
if ( advance )
{//have to get closer
vec3_t yawOnlyAngles;
VectorSet( yawOnlyAngles, 0, NPCS.NPC->r.currentAngles[YAW], 0 );
if ( NPCS.NPC->enemy->health > 0
&& fabs(distance-250) <= 80
&& InFOV3( NPCS.NPC->enemy->r.currentOrigin, NPCS.NPC->r.currentOrigin, yawOnlyAngles, 30, 30 ) )
{
if ( !Q_irand( 0, 9 ) )
{//go for the charge
doCharge = qtrue;
advance = qfalse;
}
}
}
if (( advance /*|| NPCInfo->localState == LSTATE_WAITING*/ ) && TIMER_Done( NPCS.NPC, "attacking" )) // waiting monsters can't attack
{
if ( TIMER_Done2( NPCS.NPC, "takingPain", qtrue ))
{
NPCS.NPCInfo->localState = LSTATE_CLEAR;
}
else
{
Rancor_Move( qtrue );
}
}
else
{
Rancor_Attack( distance, doCharge );
}
}
}
示例15: Mark1_AttackDecision
/*
-------------------------
Mark1_AttackDecision
-------------------------
*/
void Mark1_AttackDecision( void )
{
int blasterTest,rocketTest;
float distance;
distance_e distRate;
qboolean visible;
qboolean advance;
//randomly talk
if ( TIMER_Done(NPC,"patrolNoise") )
{
if (TIMER_Done(NPC,"angerNoise"))
{
TIMER_Set( NPC, "patrolNoise", Q_irand( 4000, 10000 ) );
}
}
// Enemy is dead or he has no enemy.
if ((NPC->enemy->health<1) || ( NPC_CheckEnemyExt(qfalse) == qfalse ))
{
NPC->enemy = NULL;
return;
}
// Rate our distance to the target and visibility
distance = (int) DistanceHorizontalSquared( NPC->r.currentOrigin, NPC->enemy->r.currentOrigin );
distRate = ( distance > MIN_MELEE_RANGE_SQR ) ? DIST_LONG : DIST_MELEE;
visible = NPC_ClearLOS4( NPC->enemy );
advance = (qboolean)(distance > MIN_DISTANCE_SQR);
// If we cannot see our target, move to see it
if ((!visible) || (!NPC_FaceEnemy(qtrue)))
{
Mark1_Hunt();
return;
}
// See if the side weapons are there
blasterTest = trap_G2API_GetSurfaceRenderStatus( NPC->ghoul2, 0, "l_arm" );
rocketTest = trap_G2API_GetSurfaceRenderStatus( NPC->ghoul2, 0, "r_arm" );
// It has both side weapons
if (!blasterTest && !rocketTest)
{
; // So do nothing.
}
else if (blasterTest!=-1
&&blasterTest)
{
distRate = DIST_LONG;
}
else if (rocketTest!=-1
&&rocketTest)
{
distRate = DIST_MELEE;
}
else // It should never get here, but just in case
{
NPC->health = 0;
NPC->client->ps.stats[STAT_HEALTH] = 0;
if (NPC->die)
{
NPC->die(NPC, NPC, NPC, 100, MOD_UNKNOWN);
}
}
// We can see enemy so shoot him if timers let you.
NPC_FaceEnemy( qtrue );
if (distRate == DIST_MELEE)
{
Mark1_BlasterAttack(advance);
}
else if (distRate == DIST_LONG)
{
Mark1_RocketAttack(advance);
}
}