本文整理汇总了C++中NPC_ClearLOS函数的典型用法代码示例。如果您正苦于以下问题:C++ NPC_ClearLOS函数的具体用法?C++ NPC_ClearLOS怎么用?C++ NPC_ClearLOS使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了NPC_ClearLOS函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: Seeker_Attack
//------------------------------------
void Seeker_Attack( void )
{
// Always keep a good height off the ground
Seeker_MaintainHeight();
// Rate our distance to the target, and our visibilty
float distance = DistanceHorizontalSquared( NPC->currentOrigin, NPC->enemy->currentOrigin );
qboolean visible = NPC_ClearLOS( NPC->enemy );
qboolean advance = (qboolean)(distance > MIN_DISTANCE_SQR);
if ( NPC->client->NPC_class == CLASS_BOBAFETT )
{
advance = (qboolean)(distance>(200.0f*200.0f));
}
// If we cannot see our target, move to see it
if ( visible == qfalse )
{
if ( NPCInfo->scriptFlags & SCF_CHASE_ENEMIES )
{
Seeker_Hunt( visible, advance );
return;
}
}
Seeker_Ranged( visible, advance );
}
开发者ID:Arbixal,项目名称:OpenJK,代码行数:28,代码来源:AI_Seeker.cpp
示例2: Sentry_AttackDecision
/*
-------------------------
Sentry_AttackDecision
-------------------------
*/
void Sentry_AttackDecision( void )
{
// 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 )
{
Sentry_Idle();
return;
}
// Rate our distance to the target and visibilty
float distance = (int) DistanceHorizontalSquared( NPC->currentOrigin, NPC->enemy->currentOrigin );
qboolean visible = NPC_ClearLOS( NPC->enemy );
qboolean 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 );
}
开发者ID:Avygeil,项目名称:NewJK,代码行数:57,代码来源:AI_Sentry.cpp
示例3: Seeker_FindEnemy
//------------------------------------
void Seeker_FindEnemy( void )
{
int numFound;
float dis, bestDis = SEEKER_SEEK_RADIUS * SEEKER_SEEK_RADIUS + 1;
vec3_t mins, maxs;
gentity_t *entityList[MAX_GENTITIES], *ent, *best = NULL;
VectorSet( maxs, SEEKER_SEEK_RADIUS, SEEKER_SEEK_RADIUS, SEEKER_SEEK_RADIUS );
VectorScale( maxs, -1, mins );
numFound = gi.EntitiesInBox( mins, maxs, entityList, MAX_GENTITIES );
for ( int i = 0 ; i < numFound ; i++ )
{
ent = entityList[i];
if ( ent->s.number == NPC->s.number || !ent->client || !ent->NPC || ent->health <= 0 || !ent->inuse )
{
continue;
}
if ( ent->client->playerTeam == NPC->client->playerTeam || ent->client->playerTeam == TEAM_NEUTRAL ) // don't attack same team or bots
{
continue;
}
// try to find the closest visible one
if ( !NPC_ClearLOS( ent ))
{
continue;
}
dis = DistanceHorizontalSquared( NPC->currentOrigin, ent->currentOrigin );
if ( dis <= bestDis )
{
bestDis = dis;
best = ent;
}
}
if ( best )
{
// 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
NPC->enemy = best;
}
}
开发者ID:AlexXT,项目名称:OpenJK,代码行数:50,代码来源:AI_Seeker.cpp
示例4: NPC_TargetVisible
qboolean NPC_TargetVisible( gentity_t *ent )
{
//Make sure we're in a valid range
if ( DistanceSquared( ent->currentOrigin, NPC->currentOrigin ) > ( NPCInfo->stats.visrange * NPCInfo->stats.visrange ) )
return qfalse;
//Check our FOV
if ( InFOV( ent, NPC, NPCInfo->stats.hfov, NPCInfo->stats.vfov ) == qfalse )
return qfalse;
//Check for sight
if ( NPC_ClearLOS( ent ) == qfalse )
return qfalse;
return qtrue;
}
开发者ID:Agustinlv,项目名称:BlueHarvest,代码行数:16,代码来源:NPC_utils.cpp
示例5: ImperialProbe_AttackDecision
void ImperialProbe_AttackDecision( void )
{
// 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 )
{
ImperialProbe_Idle();
return;
}
NPC_SetAnim( NPC, SETANIM_BOTH, BOTH_RUN1, SETANIM_FLAG_NORMAL);
// Rate our distance to the target, and our visibilty
float distance = (int) DistanceHorizontalSquared( NPC->currentOrigin, NPC->enemy->currentOrigin );
// distance_e distRate = ( distance > MIN_MELEE_RANGE_SQR ) ? DIST_LONG : DIST_MELEE;
qboolean visible = NPC_ClearLOS( NPC->enemy );
qboolean 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 );
}
开发者ID:Christian-Barrett,项目名称:OpenJK,代码行数:47,代码来源:AI_ImperialProbe.cpp
示例6: Interrogator_Attack
/*
-------------------------
Interrogator_Attack
-------------------------
*/
void Interrogator_Attack( void )
{
// 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 )
{
Interrogator_Idle();
return;
}
// Rate our distance to the target, and our visibilty
float distance = (int) DistanceHorizontalSquared( NPC->currentOrigin, NPC->enemy->currentOrigin );
qboolean visible = NPC_ClearLOS( NPC->enemy );
qboolean 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 );
}
}
开发者ID:Chedo,项目名称:OpenJK,代码行数:49,代码来源:AI_Interrogator.cpp
示例7: NPC_BSReaver_Attack
void NPC_BSReaver_Attack( void )
{
// We may have a pounce animation started and are waiting to actually start the jump movement...
Reaver_Jump();
//If we don't have an enemy, just idle
if ( NPC_CheckEnemyExt() == qfalse )
{
NPC_BSReaver_Idle();
return;
}
//Rate our distance to the target, and our visibilty
float distance = (int) DistanceHorizontalSquared( NPC->currentOrigin, NPC->enemy->currentOrigin );
distance_e distRate = ( distance > MIN_MELEE_RANGE_SQR ) ? DIST_LONG : DIST_MELEE;
int visRate = NPC_ClearLOS( NPC->enemy );
//If we cannot see our target, move to see it
if ( visRate == qfalse )
{
Reaver_Hunt();
return;
}
if ( distance < MIN_CRITICAL_DIST_SQR )
{
// We're not happy when the player gets too close
Reaver_Backup();
}
//Decide what to do next
switch ( distRate )
{
case DIST_MELEE:
Reaver_Melee();
break;
case DIST_LONG:
Reaver_Ranged( distance );
break;
}
}
开发者ID:UberGames,项目名称:SP-Mod-Source-Code,代码行数:42,代码来源:AI_Reaver.cpp
示例8: RT_Flying_Attack
void RT_Flying_Attack( void )
{
// Always keep a good height off the ground
RT_Flying_MaintainHeight();
// Rate our distance to the target, and our visibilty
float distance = DistanceHorizontalSquared( NPC->currentOrigin, NPC->enemy->currentOrigin );
qboolean visible = NPC_ClearLOS( NPC->enemy );
qboolean advance = (qboolean)(distance>(256.0f*256.0f));
// If we cannot see our target, move to see it
if ( visible == qfalse )
{
if ( NPCInfo->scriptFlags & SCF_CHASE_ENEMIES )
{
RT_Flying_Hunt( visible, advance );
return;
}
}
RT_Flying_Ranged( visible, advance );
}
开发者ID:3ddy,项目名称:Jedi-Academy,代码行数:22,代码来源:AI_RocketTrooper.cpp
示例9: Remote_Attack
/*
-------------------------
Remote_Attack
-------------------------
*/
void Remote_Attack( void )
{
if ( TIMER_Done(NPC,"spin") )
{
TIMER_Set( NPC, "spin", Q_irand( 250, 1500 ) );
NPCInfo->desiredYaw += Q_irand( -200, 200 );
}
// Always keep a good height off the ground
Remote_MaintainHeight();
// If we don't have an enemy, just idle
if ( NPC_CheckEnemyExt() == qfalse )
{
Remote_Idle();
return;
}
// Rate our distance to the target, and our visibilty
float distance = (int) DistanceHorizontalSquared( NPC->currentOrigin, NPC->enemy->currentOrigin );
// distance_e distRate = ( distance > MIN_MELEE_RANGE_SQR ) ? DIST_LONG : DIST_MELEE;
qboolean visible = NPC_ClearLOS( NPC->enemy );
float idealDist = MIN_DISTANCE_SQR+(MIN_DISTANCE_SQR*Q_flrand( 0, 1 ));
qboolean advance = (qboolean)(distance > idealDist*1.25);
qboolean retreat = (qboolean)(distance < idealDist*0.75);
// If we cannot see our target, move to see it
if ( visible == qfalse )
{
if ( NPCInfo->scriptFlags & SCF_CHASE_ENEMIES )
{
Remote_Hunt( visible, advance, retreat );
return;
}
}
Remote_Ranged( visible, advance, retreat );
}
开发者ID:LTolosa,项目名称:Jedi-Outcast,代码行数:43,代码来源:AI_Remote.cpp
示例10: MineMonster_Combat
//----------------------------------
void MineMonster_Combat( void )
{
// If we cannot see our target or we have somewhere to go, then do that
if ( !NPC_ClearLOS( 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 );
float distance = DistanceHorizontalSquared( NPC->currentOrigin, NPC->enemy->currentOrigin );
qboolean 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( 1 );
}
}
else
{
MineMonster_Attack();
}
}
开发者ID:Arbixal,项目名称:OpenJK,代码行数:37,代码来源:AI_MineMonster.cpp
示例11: NPC_RemoveBody
void NPC_RemoveBody( gentity_t *self )
{
// Only do all of this nonsense for Scav boys ( and girls )
if ( self->client->playerTeam == TEAM_SCAVENGERS || self->client->playerTeam == TEAM_KLINGON
|| self->client->playerTeam == TEAM_HIROGEN || self->client->playerTeam == TEAM_MALON )
{
self->nextthink = level.time + 1000; // try back in a second
if ( DistanceSquared( g_entities[0].currentOrigin, self->currentOrigin ) <= REMOVE_DISTANCE_SQR )
{
return;
}
if ( (InFOV( self, &g_entities[0], 110, 90 )) ) // generous FOV check
{
if ( (NPC_ClearLOS( &g_entities[0], self->currentOrigin )) )
{
return;
}
}
}
G_FreeEntity( self );
}
开发者ID:UberGames,项目名称:SP-Mod-Source-Code,代码行数:24,代码来源:NPC.cpp
示例12: Howler_Combat
//----------------------------------
static void Howler_Combat( void )
{
qboolean faced = qfalse;
float distance;
qboolean advance = qfalse;
if ( NPC->client->ps.groundEntityNum == ENTITYNUM_NONE )
{//not on the ground
if ( NPC->client->ps.legsAnim == BOTH_JUMP1
|| NPC->client->ps.legsAnim == BOTH_INAIR1 )
{//flying through the air with the greatest of ease, etc
Howler_TryDamage( 10, qfalse, qfalse );
}
}
else
{//not in air, see if we should attack or advance
// If we cannot see our target or we have somewhere to go, then do that
if ( !NPC_ClearLOS( NPC->enemy ) )//|| UpdateGoal( ))
{
NPCInfo->goalEntity = NPC->enemy;
NPCInfo->goalRadius = MAX_DISTANCE; // just get us within combat range
if ( NPCInfo->localState == LSTATE_BERZERK )
{
NPC_Howler_Move( 3 );
}
else
{
NPC_Howler_Move( 10 );
}
NPC_UpdateAngles( qfalse, qtrue );
return;
}
distance = DistanceHorizontal( NPC->currentOrigin, NPC->enemy->currentOrigin );
if ( NPC->enemy && NPC->enemy->client && PM_InKnockDown( &NPC->enemy->client->ps ) )
{//get really close to knocked down enemies
advance = (qboolean)( distance > MIN_DISTANCE ? qtrue : qfalse );
}
else
{
advance = (qboolean)( distance > MAX_DISTANCE ? qtrue : qfalse );//MIN_DISTANCE
}
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 if ( TIMER_Done( NPC, "standing" ) )
{
faced = Howler_Move( 1 );
}
}
else
{
Howler_Attack( distance );
}
}
if ( !faced )
{
if ( //TIMER_Done( NPC, "standing" ) //not just standing there
//!advance //not moving
TIMER_Done( NPC, "attacking" ) )// not attacking
{//not standing around
// Sometimes I have problems with facing the enemy I'm attacking, so force the issue so I don't look dumb
NPC_FaceEnemy( qtrue );
}
else
{
NPC_UpdateAngles( qfalse, qtrue );
}
}
}
开发者ID:Arbixal,项目名称:OpenJK,代码行数:77,代码来源:AI_Howler.cpp
示例13: NPC_BSEmplaced
void NPC_BSEmplaced( void )
{
//Don't do anything if we're hurt
if ( NPC->painDebounceTime > level.time )
{
NPC_UpdateAngles( qtrue, qtrue );
return;
}
if( NPCInfo->scriptFlags & SCF_FIRE_WEAPON )
{
WeaponThink( qtrue );
}
//If we don't have an enemy, just idle
if ( NPC_CheckEnemyExt() == qfalse )
{
if ( !Q_irand( 0, 30 ) )
{
NPCInfo->desiredYaw = NPC->s.angles[1] + Q_irand( -90, 90 );
}
if ( !Q_irand( 0, 30 ) )
{
NPCInfo->desiredPitch = Q_irand( -20, 20 );
}
NPC_UpdateAngles( qtrue, qtrue );
return;
}
qboolean enemyLOS = qfalse;
qboolean enemyCS = qfalse;
qboolean faceEnemy = qfalse;
qboolean shoot = qfalse;
vec3_t impactPos;
if ( NPC_ClearLOS( NPC->enemy ) )
{
enemyLOS = qtrue;
int hit = NPC_ShotEntity( NPC->enemy, impactPos );
gentity_t *hitEnt = &g_entities[hit];
if ( hit == NPC->enemy->s.number || ( hitEnt && hitEnt->takedamage ) )
{//can hit enemy or will hit glass or other minor breakable (or in emplaced gun), so shoot anyway
enemyCS = qtrue;
NPC_AimAdjust( 2 );//adjust aim better longer we have clear shot at enemy
VectorCopy( NPC->enemy->currentOrigin, NPCInfo->enemyLastSeenLocation );
}
}
/*
else if ( gi.inPVS( NPC->enemy->currentOrigin, NPC->currentOrigin ) )
{
NPCInfo->enemyLastSeenTime = level.time;
faceEnemy = qtrue;
NPC_AimAdjust( -1 );//adjust aim worse longer we cannot see enemy
}
*/
if ( enemyLOS )
{//FIXME: no need to face enemy if we're moving to some other goal and he's too far away to shoot?
faceEnemy = qtrue;
}
if ( enemyCS )
{
shoot = qtrue;
}
if ( faceEnemy )
{//face the enemy
NPC_FaceEnemy( qtrue );
}
else
{//we want to face in the dir we're running
NPC_UpdateAngles( qtrue, qtrue );
}
if ( NPCInfo->scriptFlags & SCF_DONT_FIRE )
{
shoot = qfalse;
}
if ( NPC->enemy && NPC->enemy->enemy )
{
if ( NPC->enemy->s.weapon == WP_SABER && NPC->enemy->enemy->s.weapon == WP_SABER )
{//don't shoot at an enemy jedi who is fighting another jedi, for fear of injuring one or causing rogue blaster deflections (a la Obi Wan/Vader duel at end of ANH)
shoot = qfalse;
}
}
if ( shoot )
{//try to shoot if it's time
if( !(NPCInfo->scriptFlags & SCF_FIRE_WEAPON) ) // we've already fired, no need to do it again here
{
WeaponThink( qtrue );
}
}
}
开发者ID:Chedo,项目名称:OpenJK,代码行数:96,代码来源:NPC_behavior.cpp
示例14: NPC_BSHirogenAlpha_Attack
void NPC_BSHirogenAlpha_Attack( void )
{
//FIXME: Move to spawn location
NPC->flags |= FL_NO_KNOCKBACK;
if ( TIMER_Done( NPC, "speech" ) == qfalse )
{
NPC_FaceEnemy( qtrue );
return;
}
//Do any taunts if need-be
if ( Hirogen_Speak() )
return;
//Check for the enemy (formality)
if ( NPC_CheckEnemyExt() == qfalse )
{
Hirogen_ActivateShield( qtrue );
NPC_BSHirogenAlpha_Idle();
return;
}
//See if we're currently attacking the player
if ( NPCInfo->standTime > level.time )
{
Hirogen_PauseState();
return;
}
//Turn our shielding on
Hirogen_ActivateShield( qtrue );
//See if the target is visible
if ( NPC_ClearLOS( NPC->enemy ) == qfalse )
{
Hirogen_Hunt();
//This is done to keep the enemy from stopping too soon
if ( DistanceSquared( NPC->currentOrigin, NPCInfo->tempGoal->currentOrigin ) > 96 )
{
NPC_UpdateAngles( qtrue, qtrue );
return;
}
}
//Must be at our goal
if ( DistanceSquared( NPC->currentOrigin, NPCInfo->tempGoal->currentOrigin ) > 96 )
{
Hirogen_Hunt();
return;
}
//Setup our timing information
NPCInfo->pauseTime = level.time + HIROGEN_PREFIRE_DELAY;
NPCInfo->weaponTime = NPCInfo->pauseTime + HIROGEN_FIRE_DURATION;
NPCInfo->standTime = NPCInfo->weaponTime + HIROGEN_RELOAD_PAUSE;
G_SoundOnEnt( NPC, CHAN_WEAPON, alphaSpeech[5] );
NPC_UpdateAngles( qtrue, qtrue );
}
开发者ID:UberGames,项目名称:SP-Mod-Source-Code,代码行数:62,代码来源:AI_HirogenAlpha.cpp
示例15: RT_FireDecide
void RT_FireDecide( void )
{
qboolean enemyLOS = qfalse;
qboolean enemyCS = qfalse;
qboolean enemyInFOV = qfalse;
//qboolean move = qtrue;
qboolean faceEnemy = qfalse;
qboolean shoot = qfalse;
qboolean hitAlly = qfalse;
vec3_t impactPos;
float enemyDist;
if ( NPC->client->ps.groundEntityNum == ENTITYNUM_NONE
&& NPC->client->ps.forceJumpZStart
&& !PM_FlippingAnim( NPC->client->ps.legsAnim )
&& !Q_irand( 0, 10 ) )
{//take off
RT_FlyStart( NPC );
}
if ( !NPC->enemy )
{
return;
}
VectorClear( impactPos );
enemyDist = DistanceSquared( NPC->currentOrigin, NPC->enemy->currentOrigin );
vec3_t enemyDir, shootDir;
VectorSubtract( NPC->enemy->currentOrigin, NPC->currentOrigin, enemyDir );
VectorNormalize( enemyDir );
AngleVectors( NPC->client->ps.viewangles, shootDir, NULL, NULL );
float dot = DotProduct( enemyDir, shootDir );
if ( dot > 0.5f ||( enemyDist * (1.0f-dot)) < 10000 )
{//enemy is in front of me or they're very close and not behind me
enemyInFOV = qtrue;
}
if ( enemyDist < MIN_ROCKET_DIST_SQUARED )//128
{//enemy within 128
if ( (NPC->client->ps.weapon == WP_FLECHETTE || NPC->client->ps.weapon == WP_REPEATER) &&
(NPCInfo->scriptFlags & SCF_ALT_FIRE) )
{//shooting an explosive, but enemy too close, switch to primary fire
NPCInfo->scriptFlags &= ~SCF_ALT_FIRE;
//FIXME: we can never go back to alt-fire this way since, after this, we don't know if we were initially supposed to use alt-fire or not...
}
}
//can we see our target?
if ( TIMER_Done( NPC, "nextAttackDelay" ) && TIMER_Done( NPC, "flameTime" ) )
{
if ( NPC_ClearLOS( NPC->enemy ) )
{
NPCInfo->enemyLastSeenTime = level.time;
enemyLOS = qtrue;
if ( NPC->client->ps.weapon == WP_NONE )
{
enemyCS = qfalse;//not true, but should stop us from firing
}
else
{//can we shoot our target?
if ( (NPC->client->ps.weapon == WP_ROCKET_LAUNCHER
|| (NPC->client->ps.weapon == WP_CONCUSSION && !(NPCInfo->scriptFlags&SCF_ALT_FIRE))
|| (NPC->client->ps.weapon == WP_FLECHETTE && (NPCInfo->scriptFlags&SCF_ALT_FIRE))) && enemyDist < MIN_ROCKET_DIST_SQUARED )//128*128
{
enemyCS = qfalse;//not true, but should stop us from firing
hitAlly = qtrue;//us!
//FIXME: if too close, run away!
}
else if ( enemyInFOV )
{//if enemy is FOV, go ahead and check for shooting
int hit = NPC_ShotEntity( NPC->enemy, impactPos );
gentity_t *hitEnt = &g_entities[hit];
if ( hit == NPC->enemy->s.number
|| ( hitEnt && hitEnt->client && hitEnt->client->playerTeam == NPC->client->enemyTeam )
|| ( hitEnt && hitEnt->takedamage && ((hitEnt->svFlags&SVF_GLASS_BRUSH)||hitEnt->health < 40||NPC->s.weapon == WP_EMPLACED_GUN) ) )
{//can hit enemy or enemy ally or will hit glass or other minor breakable (or in emplaced gun), so shoot anyway
enemyCS = qtrue;
//NPC_AimAdjust( 2 );//adjust aim better longer we have clear shot at enemy
VectorCopy( NPC->enemy->currentOrigin, NPCInfo->enemyLastSeenLocation );
}
else
{//Hmm, have to get around this bastard
//NPC_AimAdjust( 1 );//adjust aim better longer we can see enemy
if ( hitEnt && hitEnt->client && hitEnt->client->playerTeam == NPC->client->playerTeam )
{//would hit an ally, don't fire!!!
hitAlly = qtrue;
}
else
{//Check and see where our shot *would* hit... if it's not close to the enemy (within 256?), then don't fire
}
}
}
else
{
enemyCS = qfalse;//not true, but should stop us from firing
}
}
//.........这里部分代码省略.........
开发者ID:3ddy,项目名称:Jedi-Academy,代码行数:101,代码来源:AI_RocketTrooper.cpp
示例16: NPC_BSGM_Attack
//.........这里部分代码省略.........
&& ((!Q_irand( 0, 10*(2-g_spskill->integer))&& enemyDist > MIN_LOB_DIST_SQUARED&& enemyDist < MAX_LOB_DIST_SQUARED)
||(!TIMER_Done( NPC, "noLob" )&&!TIMER_Done( NPC, "noRapid" )))
&& NPC->enemy->s.weapon != WP_TURRET )
{//sometimes use the laser beam attack, but only after he's taken down our generator
shoot = qfalse;
NPC_GM_StartLaser();
}
else if ( enemyDist < MIN_LOB_DIST_SQUARED
&& (NPC->enemy->s.weapon != WP_TURRET || Q_stricmp( "PAS", NPC->enemy->classname ))
&& TIMER_Done( NPC, "noRapid" ) )//256
{//enemy within 256
if ( (NPC->client->ps.weapon == WP_REPEATER) && (NPCInfo->scriptFlags & SCF_ALT_FIRE) )
{//shooting an explosive, but enemy too close, switch to primary fire
NPCInfo->scriptFlags &= ~SCF_ALT_FIRE;
NPC->alt_fire = qfalse;
//FIXME: use weap raise & lower anims
NPC_ChangeWeapon( WP_REPEATER );
}
}
else if ( (enemyDist > MAX_LOB_DIST_SQUARED || (NPC->enemy->s.weapon == WP_TURRET && !Q_stricmp( "PAS", NPC->enemy->classname )))
&& TIMER_Done( NPC, "noLob" ) )//448
{//enemy more than 448 away and we are ready to try lob fire again
if ( (NPC->client->ps.weapon == WP_REPEATER) && !(NPCInfo->scriptFlags & SCF_ALT_FIRE) )
{//enemy far enough away to use lobby explosives
NPCInfo->scriptFlags |= SCF_ALT_FIRE;
NPC->alt_fire = qtrue;
//FIXME: use weap raise & lower anims
NPC_ChangeWeapon( WP_REPEATER );
}
}
}
//can we see our target?
if ( NPC_ClearLOS( NPC->enemy ) )
{
NPCInfo->enemyLastSeenTime = level.time;//used here for aim debouncing, not always a clear LOS
enemyLOS = qtrue;
if ( NPC->client->ps.weapon == WP_NONE )
{
enemyCS = qfalse;//not true, but should stop us from firing
NPC_AimAdjust( -1 );//adjust aim worse longer we have no weapon
}
else
{//can we shoot our target?
if ( ((NPC->client->ps.weapon == WP_REPEATER && (NPCInfo->scriptFlags&SCF_ALT_FIRE))) && enemyDist < MIN_LOB_DIST_SQUARED )//256
{
enemyCS = qfalse;//not true, but should stop us from firing
hitAlly = qtrue;//us!
//FIXME: if too close, run away!
}
else
{
int hit = NPC_ShotEntity( NPC->enemy, impactPos );
gentity_t *hitEnt = &g_entities[hit];
if ( hit == NPC->enemy->s.number
|| ( hitEnt && hitEnt->client && hitEnt->client->playerTeam == NPC->client->enemyTeam )
|| ( hitEnt && hitEnt->takedamage ) )
{//can hit enemy or will hit glass or other breakable, so shoot anyway
enemyCS = qtrue;
NPC_AimAdjust( 2 );//adjust aim better longer we have clear shot at enemy
VectorCopy( NPC->enemy->currentOrigin, NPCInfo->enemyLastSeenLocation );
}
else
{//Hmm, have to get around this bastard
NPC_AimAdjust( 1 );//adjust aim better longer we can see enemy
开发者ID:PJayB,项目名称:jk2src,代码行数:67,代码来源:AI_GalakMech.cpp
示例17: Mark1_AttackDecision
/*
-------------------------
Mark1_AttackDecision
-------------------------
*/
void Mark1_AttackDecision( void )
{
int blasterTest,rocketTest;
//randomly talk
if ( TIMER_Done(NPC,"patrolNoise") )
{
if (TIMER_Done(NPC,"angerNoise"))
{
// G_Sound( NPC, G_SoundIndex(va("sound/chars/mark1/misc/talk%d.wav", Q_irand(1, 4))));
TIMER_Set( NPC, "patrolNoise", Q_irand( 4000, 10000 ) );
}
}
// Enemy is dead or he has no enemy.
if ((NPC->enemy->health<1) || ( NPC_CheckEnemyExt() == qfalse ))
{
NPC->enemy = NULL;
return;
}
// Rate our distance to the target and visibility
float distance = (int) DistanceHorizontalSquared( NPC->currentOrigin, NPC->enemy->currentOrigin );
distance_e distRate = ( distance > MIN_MELEE_RANGE_SQR ) ? DIST_LONG : DIST_MELEE;
qboolean visible = NPC_ClearLOS( NPC->enemy );
qboolean 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 = gi.G2API_GetSurfaceRenderStatus( &NPC->ghoul2[NPC->playerModel], "l_arm" );
rocketTest = gi.G2API_GetSurfaceRenderStatus( &NPC->ghoul2[NPC->playerModel], "r_arm" );
// It has both side weapons
if (!blasterTest && !rocketTest)
{
; // So do nothing.
}
else if (blasterTest)
{
distRate = DIST_LONG;
}
else if (rocketTest)
{
distRate = DIST_MELEE;
}
else // It should never get here, but just in case
{
NPC->health = 0;
NPC->client->ps.stats[STAT_HEALTH] = 0;
GEntity_DieFunc(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);
}
}
开发者ID:AlexXT,项目名称:OpenJK,代码行数:75,代码来源:AI_Mark1.cpp
示例18: ATST_Attack
/*
-------------------------
ATST_Attack
-------------------------
*/
void ATST_Attack( void )
{
qboolean altAttack=qfalse;
int blasterTest,chargerTest,weapon;
if ( NPC_CheckEnemyExt() == qfalse )//!NPC->enemy )//
{
NPC->enemy = NULL;
return;
}
NPC_FaceEnemy( qtrue );
// Rate our distance to the target, and our visibilty
float distance = (int) DistanceHorizontalSquared( NPC->currentOrigin, NPC->enemy->currentOrigin );
distance_e distRate = ( distance > MIN_MELEE_RANGE_SQR ) ? DIST_LONG : DIST_MELEE;
qboolean visible = NPC_ClearLOS( NPC->enemy );
qboolean 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 )
{
ATST_Hunt( visible, advance );
return;
}
}
// Decide what type of attack to do
switch ( distRate )
{
case DIST_MELEE:
NPC_ChangeWeapon( WP_ATST_MAIN );
break;
case DIST_LONG:
NPC_ChangeWeapon( WP_ATST_SIDE );
// See if the side weapons are there
blasterTest = gi.G2API_GetSurfaceRenderStatus( &NPC->ghoul2[NPC->playerModel], "head_light_blaster_cann" );
chargerTest = gi.G2API_GetSurfaceRenderStatus( &NPC->ghoul2[NPC->playerModel], "head_concussion_charger" );
// It has both side weapons
if (!(blasterTest & TURN_OFF) && !(chargerTest & TURN_OFF))
{
weapon = Q_irand( 0, 1); // 0 is blaster, 1 is charger (ALT SIDE)
if (weapon) // Fire charger
{
altAttack = qtrue;
}
else
{
altAttack = qfalse;
}
}
else if (!(blasterTest & TURN_OFF)) // Blaster is on
{
altAttack = qfalse;
}
else if (!(chargerTest & TURN_OFF)) // Blaster is on
{
altAttack = qtrue;
}
else
{
NPC_ChangeWeapon( WP_NONE );
}
break;
}
NPC_FaceEnemy( qtrue );
ATST_Ranged( visible, advance,altAttack );
}
开发者ID:MrSquirrely,项目名称:Jedi-Academy,代码行数:83,代码来源:AI_Atst.cpp
示例19: NPC_BSSniper_Attack
void NPC_BSSniper_Attack( void )
{
//Don't do anything if we're hurt
if ( NPC->painDebounceTime > level.time )
{
NPC_UpdateAngles( qtrue, qtrue );
return;
}
//NPC_CheckEnemy( qtrue, qfalse );
//If we don't have an enemy, just idle
if ( NPC_CheckEnemyExt() == qfalse )//!NPC->enemy )//
{
NPC->enemy = NULL;
NPC_BSSniper_Patrol();//FIXME: or patrol?
return;
}
if ( TIMER_Done( NPC, "flee" ) && NPC_CheckForDanger( NPC_CheckAlertEvents( qtrue, qtrue, -1, qfalse, AEL_DANGER ) ) )
{//going to run
NPC_UpdateAngles( qtrue, qtrue );
return;
}
if ( !NPC->enemy )
{//WTF? somehow we lost our enemy?
NPC_BSSniper_Patrol();//FIXME: or patrol?
return;
}
enemyLOS = enemyCS = qfalse;
AImove = qtrue;
faceEnemy = qfalse;
shoot = qfalse;
enemyDist = DistanceSquared( NPC->currentOrigin, NPC->enemy->currentOrigin );
if ( enemyDist < 16384 )//128 squared
{//too close, so switch to primary fire
if ( NPC->client->ps.weapon == WP_DISRUPTOR )
{//sniping... should be assumed
if ( NPCInfo->scriptFlags & SCF_ALT_FIRE )
{//use primary fire
trace_t trace;
gi.trace ( &trace, NPC->enemy->currentOrigin, NPC->enemy->mins, NPC->enemy->maxs, NPC->currentOrigin, NPC->enemy->s.number, NPC->enemy->clipmask, G2_NOCOLLIDE, 0 );
if ( !trace.allsolid && !trace.startsolid && (trace.fraction == 1.0 || trace.entityNum == NPC->s.number ) )
{//he can get right to me
NPCInfo->scriptFlags &= ~SCF_ALT_FIRE;
//reset fire-timing variables
NPC_ChangeWeapon( WP_DISRUPTOR );
NPC_UpdateAngles( qtrue, qtrue );
return;
}
}
//FIXME: switch back if he gets far away again?
}
}
else if ( enemyDist > 65536 )//256 squared
{
if ( NPC->client->ps.weapon == WP_DISRUPTOR )
{//sniping... should be assumed
if ( !(NPCInfo->scriptFlags&SCF_ALT_FIRE) )
{//use primary fire
NPCInfo->scriptFlags |= SCF_ALT_FIRE;
//reset fire-timing variables
NPC_ChangeWeapon( WP_DISRUPTOR );
NPC_UpdateAngles( qtrue, qtrue );
return;
}
}
}
Sniper_UpdateEnemyPos();
//can we see our target?
if ( NPC_ClearLOS( NPC->enemy ) )//|| (NPCInfo->stats.aim >= 5 && gi.inPVS( NPC->client->renderInfo.eyePoint, NPC->enemy->currentOrigin )) )
{
NPCInfo->enemyLastSeenTime = level.time;
VectorCopy( NPC->enemy->currentOrigin, NPCInfo->enemyLastSeenLocation );
enemyLOS = qtrue;
float maxShootDist = NPC_MaxDistSquaredForWeapon();
if ( enemyDist < maxShootDist )
{
vec3_t fwd, right, up, muzzle, end;
trace_t tr;
AngleVectors( NPC->client->ps.viewangles, fwd, right, up );
CalcMuzzlePoint( NPC, fwd, right, up, muzzle, 0 );
VectorMA( muzzle, 8192, fwd, end );
gi.trace ( &tr, muzzle, NULL, NULL, end, NPC->s.number, MASK_SHOT, G2_RETURNONHIT, 0 );
int hit = tr.entityNum;
//can we shoot our target?
if ( Sniper_EvaluateShot( hit ) )
{
enemyCS = qtrue;
}
}
}
/*
else if ( gi.inPVS( NPC->enemy->currentOrigin, NPC->currentOrigin ) )
{
NPCInfo->enemyLastSeenTime = level.time;
faceEnemy = qtrue;
//.........这里部分代码省略.........
开发者ID:kikili,项目名称:OpenJK,代码行数:101,代码来源:AI_Sniper.cpp
示例20: Wampa_Combat
//----------------------------------
void Wampa_Combat( void )
{
// If we cannot see our target or we have somewhere to go, then do that
if ( !NPC_ClearLOS( NPC->r.currentOrigin, NPC->enemy->r.currentOrigin ) )
{
if ( !Q_irand( 0, 10 ) )
{
if ( Wampa_CheckRoar( NPC ) )
{
return;
}
}
NPCInfo->combatMove = qtrue;
NPCInfo->goalEntity = NPC->enemy;
NPCInfo->goalRadius = MAX_DISTANCE; // just get us within combat range
Wampa_Move( 0 );
return;
}
else if ( UpdateGoal() )
{
NPCInfo->combatMove = qtrue;
NPCInfo->goalEntity = NPC->enemy;
NPCInfo->goalRadius = MAX_DISTANCE; // just get us within combat range
Wampa_Move( 1 );
return;
}
else
{
float distance = enemyDist = Distance( NPC->r.currentOrigin, NPC->enemy->r.currentOrigin );
qboolean advance = (qboolean)( distance > (NPC->r.maxs[0]+MIN_DISTANCE) ? qtrue : qfalse );
qboolean doCharge = qfalse;
// Sometimes I have problems with facing the enemy I'm attacking, so force the issue so I don't look dumb
//FIXME: always seems to face off to the left or right?!!!!
NPC_FaceEnemy( qtrue );
if ( advance )
{//have to get closer
vec3_t yawOnlyAngles;
VectorSet( yawOnlyAngles, 0, NPC->r.currentAngles[YAW], 0 );
if ( NPC->enemy->health > 0//enemy still alive
&& fabs(distance-350) <= 80 //enemy anywhere from 270 to 430 away
&& InFOV3( NPC->enemy->r.currentOrigin, NPC->r.currentOrigin, yawOnlyAngles, 20, 20 ) )//enemy generally in front
{//10% chance of doing charge anim
if ( !Q_irand( 0, 9 ) )
{//go for the charge
doCharge = qtrue;
advance = 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
{
Wampa_Move( 1 );
}
}
else
{
if ( !Q_irand( 0, 20 ) )
{//FIXME: only do this if we just damaged them or vice-versa?
if ( Wampa_CheckRoar( NPC ) )
{
return;
}
}
if ( !Q_irand( 0, 1 ) )
{//FIXME: base on skill
Wampa_Attack( distance, doCharge );
}
}
}
}
开发者ID:DarthFutuza,项目名称:JediKnightGalaxies,代码行数:83,代码来源:NPC_AI_Wampa.cpp
注:本文中的NPC_ClearLOS函数示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论