这篇教程C++ DistanceHorizontalSquared函数代码示例写得很实用,希望能帮到您。
本文整理汇总了C++中DistanceHorizontalSquared函数的典型用法代码示例。如果您正苦于以下问题:C++ DistanceHorizontalSquared函数的具体用法?C++ DistanceHorizontalSquared怎么用?C++ DistanceHorizontalSquared使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。 在下文中一共展示了DistanceHorizontalSquared函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。 示例1: Seeker_Attack//------------------------------------void Seeker_Attack( void ){ float distance; qboolean visible, advance; // Always keep a good height off the ground Seeker_MaintainHeight(); // Rate our distance to the target, and our visibilty distance = DistanceHorizontalSquared( NPCS.NPC->r.currentOrigin, NPCS.NPC->enemy->r.currentOrigin ); visible = NPC_ClearLOS4( NPCS.NPC->enemy ); advance = (qboolean)(distance > MIN_DISTANCE_SQR); if ( NPCS.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 ( NPCS.NPCInfo->scriptFlags & SCF_CHASE_ENEMIES ) { Seeker_Hunt( visible, advance ); return; } } Seeker_Ranged( visible, advance );}
开发者ID:Avygeil,项目名称:NewJK,代码行数:31,
示例2: 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 );}
开发者ID:DarthFutuza,项目名称:JediKnightGalaxies,代码行数:61,
示例3: Seeker_FindEnemy//------------------------------------void Seeker_FindEnemy( void ){ int numFound; float dis, bestDis = SEEKER_SEEK_RADIUS * SEEKER_SEEK_RADIUS + 1; vec3_t mins, maxs; int entityList[MAX_GENTITIES]; gentity_t *ent, *best = NULL; int i; VectorSet( maxs, SEEKER_SEEK_RADIUS, SEEKER_SEEK_RADIUS, SEEKER_SEEK_RADIUS ); VectorScale( maxs, -1, mins ); numFound = trap->EntitiesInBox( mins, maxs, entityList, MAX_GENTITIES ); for ( i = 0 ; i < numFound ; i++ ) { ent = &g_entities[entityList[i]]; if ( ent->s.number == NPCS.NPC->s.number || !ent->client //&& || !ent->NPC || ent->health <= 0 || !ent->inuse ) { continue; } if ( ent->client->playerTeam == NPCS.NPC->client->playerTeam || ent->client->playerTeam == NPCTEAM_NEUTRAL ) // don't attack same team or bots { continue; } // try to find the closest visible one if ( !NPC_ClearLOS4( ent )) { continue; } dis = DistanceHorizontalSquared( NPCS.NPC->r.currentOrigin, ent->r.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. NPCS.NPC->random = Q_flrand(0.0f, 1.0f) * 6.3f; // roughly 2pi NPCS.NPC->enemy = best; }}
开发者ID:Avygeil,项目名称:NewJK,代码行数:55,
示例4: ATST_Attackvoid ATST_Attack( void ) { qboolean altAttack = qfalse, visible = qfalse, advance = qfalse; int blasterTest, chargerTest; float distance; if ( !NPC_CheckEnemyExt( qfalse ) ) { NPC->enemy = NULL; return; } NPC_FaceEnemy( qtrue ); // Rate our distance to the target, and our visibilty distance = (int)DistanceHorizontalSquared( &NPC->r.currentOrigin, &NPC->enemy->r.currentOrigin ); visible = NPC_ClearLOS4( NPC->enemy ) ? qtrue : qfalse; advance = (distance > MIN_DISTANCE_SQR) ? qtrue : qfalse; // If we cannot see our target, move to see it if ( !visible ) { if ( NPCInfo->scriptFlags & SCF_CHASE_ENEMIES ) { ATST_Hunt( visible, advance ); return; } } // Decide what type of attack to do if ( distance > MIN_MELEE_RANGE_SQR ) { // DIST_LONG // NPC_ChangeWeapon( WP_ATST_SIDE ); //rwwFIXMEFIXME: make atst weaps work. // See if the side weapons are there blasterTest = trap->G2API_GetSurfaceRenderStatus( NPC->ghoul2, 0, "head_light_blaster_cann" ); chargerTest = trap->G2API_GetSurfaceRenderStatus( NPC->ghoul2, 0, "head_concussion_charger" ); // It has both side weapons if ( blasterTest != -1 && !(blasterTest & TURN_OFF) && chargerTest != -1 && !(chargerTest & TURN_OFF) ) altAttack = Q_irand( 0, 1 ) ? qtrue : qfalse; else if ( blasterTest != -1 && !(blasterTest & TURN_OFF) ) altAttack = qfalse; else if ( chargerTest != -1 && !(chargerTest & TURN_OFF) ) altAttack = qtrue; else NPC_ChangeWeapon( WP_NONE ); } else { // DIST_MELEE // NPC_ChangeWeapon( WP_ATST_MAIN ); } NPC_FaceEnemy( qtrue ); ATST_Ranged( visible, advance, altAttack );}
开发者ID:Arcadiaprime,项目名称:japp,代码行数:53,
示例5: ImperialProbe_AttackDecisionvoid 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 );}
开发者ID:ForcePush,项目名称:OJPRPFZ,代码行数:50,
示例6: Seeker_Attackvoid Seeker_Attack( void ){ float distance; qboolean visible; qboolean advance; // Always keep a good height off the ground Seeker_MaintainHeight(); // Rate our distance to the target, and our visibilty distance = DistanceHorizontalSquared( NPC->r.currentOrigin, NPC->enemy->r.currentOrigin ); visible = NPC_ClearLOS4( NPC->enemy ); advance = (qboolean)(distance > MIN_DISTANCE_SQR); //[SeekerItemNpc] //dont shoot at dead people if(!NPC->enemy->inuse || NPC->enemy->health <= 0) { NPC->enemy = NULL; return; } //[/SeekerItemNpc] 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; } //[SeekerItemNpc] else { //we cant chase them? then return to the follow target NPC->enemy = NULL; if(NPC->client->leader) NPCInfo->goalEntity = NPC->client->leader; return; } //[/SeekerItemNpc] } Seeker_Ranged( visible, advance );}
开发者ID:jwginge,项目名称:ojpa,代码行数:49,
示例7: 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 ); }}
开发者ID:AlexCSilva,项目名称:jediacademy,代码行数:53,
示例8: Remote_Attack/*-------------------------Remote_Attack-------------------------*/void Remote_Attack( void ){ float distance; qboolean visible; float idealDist; qboolean advance; qboolean retreat; 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) == qfalse ) { Remote_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 ); //[CoOp] idealDist = MIN_DISTANCE_SQR+(MIN_DISTANCE_SQR*Q_flrand( 0, 1 )); //idealDist = MIN_DISTANCE_SQR+(MIN_DISTANCE_SQR*flrand( 0, 1 )); //[/CoOp] advance = (qboolean)(distance > idealDist*1.25); 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:jwginge,项目名称:ojpa,代码行数:51,
示例9: NPC_BSReaver_Attackvoid 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,
示例10: Seeker_FollowPlayer//------------------------------------void Seeker_FollowPlayer( void ){ Seeker_MaintainHeight(); float dis = DistanceHorizontalSquared( NPC->currentOrigin, g_entities[0].currentOrigin ); vec3_t pt, dir; if ( dis < MIN_DISTANCE_SQR ) { // generally circle the player closely till we take an enemy..this is our target point pt[0] = g_entities[0].currentOrigin[0] + cos( level.time * 0.001f + NPC->random ) * 56; pt[1] = g_entities[0].currentOrigin[1] + sin( level.time * 0.001f + NPC->random ) * 56; pt[2] = g_entities[0].currentOrigin[2] + 40; VectorSubtract( pt, NPC->currentOrigin, dir ); VectorMA( NPC->client->ps.velocity, 0.8f, dir, NPC->client->ps.velocity ); } else { if ( TIMER_Done( NPC, "seekerhiss" )) { TIMER_Set( NPC, "seekerhiss", 1000 + random() * 1000 ); G_Sound( NPC, G_SoundIndex( "sound/chars/seeker/misc/hiss" )); } // Hey come back! NPCInfo->goalEntity = &g_entities[0]; NPCInfo->goalRadius = 32; NPC_MoveToGoal( qtrue ); NPC->owner = &g_entities[0]; } if ( NPCInfo->enemyCheckDebounceTime < level.time ) { // check twice a second to find a new enemy Seeker_FindEnemy(); NPCInfo->enemyCheckDebounceTime = level.time + 500; } NPC_UpdateAngles( qtrue, qtrue );}
开发者ID:AlexXT,项目名称:OpenJK,代码行数:42,
示例11: RT_Flying_Attackvoid 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,
示例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(); }}
开发者ID:Geptun,项目名称:japp,代码行数:40,
示例13: Mark2_AttackDecision/*-------------------------Mark2_AttackDecision-------------------------*/void Mark2_AttackDecision( void ){ float distance; qboolean visible; qboolean advance; NPC_FaceEnemy( qtrue ); distance = (int) DistanceHorizontalSquared( NPC->r.currentOrigin, NPC->enemy->r.currentOrigin ); visible = NPC_ClearLOS4( NPC->enemy ); advance = (qboolean)(distance > MIN_DISTANCE_SQR); // He's been ordered to get up if (NPCInfo->localState == LSTATE_RISINGUP) { NPC->flags &= ~FL_SHIELDED; NPC_SetAnim( NPC, SETANIM_BOTH, BOTH_RUN1START, SETANIM_FLAG_HOLD|SETANIM_FLAG_OVERRIDE ); if ((NPC->client->ps.legsTimer<=0) && NPC->client->ps.torsoAnim == BOTH_RUN1START ) { NPCInfo->localState = LSTATE_NONE; // He's up again. } return; } // If we cannot see our target, move to see it if ((!visible) || (!NPC_FaceEnemy(qtrue))) { // If he's going down or is down, make him get up if ((NPCInfo->localState == LSTATE_DOWN) || (NPCInfo->localState == LSTATE_DROPPINGDOWN)) { if ( TIMER_Done( NPC, "downTime" ) ) // Down being down?? (The delay is so he doesn't pop up and down when the player goes in and out of range) { NPCInfo->localState = LSTATE_RISINGUP; NPC_SetAnim( NPC, SETANIM_BOTH, BOTH_RUN1STOP, SETANIM_FLAG_HOLD|SETANIM_FLAG_OVERRIDE ); TIMER_Set( NPC, "runTime", Q_irand( 3000, 8000) ); // So he runs for a while before testing to see if he should drop down. } } else { Mark2_Hunt(); } return; } // He's down but he could advance if he wants to. if ((advance) && (TIMER_Done( NPC, "downTime" )) && (NPCInfo->localState == LSTATE_DOWN)) { NPCInfo->localState = LSTATE_RISINGUP; NPC_SetAnim( NPC, SETANIM_BOTH, BOTH_RUN1STOP, SETANIM_FLAG_HOLD|SETANIM_FLAG_OVERRIDE ); TIMER_Set( NPC, "runTime", Q_irand( 3000, 8000) ); // So he runs for a while before testing to see if he should drop down. } NPC_FaceEnemy( qtrue ); // Dropping down to shoot if (NPCInfo->localState == LSTATE_DROPPINGDOWN) { NPC_SetAnim( NPC, SETANIM_BOTH, BOTH_RUN1STOP, SETANIM_FLAG_HOLD|SETANIM_FLAG_OVERRIDE ); TIMER_Set( NPC, "downTime", Q_irand( 3000, 9000) ); if ((NPC->client->ps.legsTimer<=0) && NPC->client->ps.torsoAnim == BOTH_RUN1STOP ) { NPC->flags |= FL_SHIELDED; NPCInfo->localState = LSTATE_DOWN; } } // He's down and shooting else if (NPCInfo->localState == LSTATE_DOWN) { NPC->flags |= FL_SHIELDED;//only damagable by lightsabers and missiles Mark2_BlasterAttack(qfalse); } else if (TIMER_Done( NPC, "runTime" )) // Lowering down to attack. But only if he's done running at you. { NPCInfo->localState = LSTATE_DROPPINGDOWN; } else if (advance) { // We can see enemy so shoot him if timer lets you. Mark2_BlasterAttack(advance); }}
开发者ID:NikitaRus,项目名称:JediKnightGalaxies-1,代码行数:89,
示例14: 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); }}
开发者ID:NoahBennet,项目名称:base_enhanced,代码行数:83,
示例15: Seeker_FollowOwner//------------------------------------void Seeker_FollowOwner( void ){ float dis, minDistSqr; vec3_t pt, dir; gentity_t *owner = &g_entities[NPCS.NPC->s.owner]; Seeker_MaintainHeight(); if ( NPCS.NPC->client->NPC_class == CLASS_BOBAFETT ) { owner = NPCS.NPC->enemy; } if ( !owner || owner == NPCS.NPC || !owner->client ) { return; } //rwwFIXMEFIXME: Care about all clients not just 0 dis = DistanceHorizontalSquared( NPCS.NPC->r.currentOrigin, owner->r.currentOrigin ); minDistSqr = MIN_DISTANCE_SQR; if ( NPCS.NPC->client->NPC_class == CLASS_BOBAFETT ) { if ( TIMER_Done( NPCS.NPC, "flameTime" ) ) { minDistSqr = 200*200; } } if ( dis < minDistSqr ) { // generally circle the player closely till we take an enemy..this is our target point if ( NPCS.NPC->client->NPC_class == CLASS_BOBAFETT ) { pt[0] = owner->r.currentOrigin[0] + cos( level.time * 0.001f + NPCS.NPC->random ) * 250; pt[1] = owner->r.currentOrigin[1] + sin( level.time * 0.001f + NPCS.NPC->random ) * 250; if ( NPCS.NPC->client->jetPackTime < level.time ) { pt[2] = NPCS.NPC->r.currentOrigin[2] - 64; } else { pt[2] = owner->r.currentOrigin[2] + 200; } } else { pt[0] = owner->r.currentOrigin[0] + cos( level.time * 0.001f + NPCS.NPC->random ) * 56; pt[1] = owner->r.currentOrigin[1] + sin( level.time * 0.001f + NPCS.NPC->random ) * 56; pt[2] = owner->r.currentOrigin[2] + 40; } VectorSubtract( pt, NPCS.NPC->r.currentOrigin, dir ); VectorMA( NPCS.NPC->client->ps.velocity, 0.8f, dir, NPCS.NPC->client->ps.velocity ); } else { if ( NPCS.NPC->client->NPC_class != CLASS_BOBAFETT ) { if ( TIMER_Done( NPCS.NPC, "seekerhiss" )) { TIMER_Set( NPCS.NPC, "seekerhiss", 1000 + Q_flrand(0.0f, 1.0f) * 1000 ); G_Sound( NPCS.NPC, CHAN_AUTO, G_SoundIndex( "sound/chars/seeker/misc/hiss" )); } } // Hey come back! NPCS.NPCInfo->goalEntity = owner; NPCS.NPCInfo->goalRadius = 32; NPC_MoveToGoal( qtrue ); NPCS.NPC->parent = owner; } if ( NPCS.NPCInfo->enemyCheckDebounceTime < level.time ) { // check twice a second to find a new enemy Seeker_FindEnemy(); NPCS.NPCInfo->enemyCheckDebounceTime = level.time + 500; } NPC_UpdateAngles( qtrue, qtrue );}
开发者ID:Avygeil,项目名称:NewJK,代码行数:83,
示例16: Seeker_FollowPlayer//[CoOp]//------------------------------------void Seeker_FollowPlayer( void ){ //hover around the closest player //[SeekerItemNpc]#if 1 vec3_t pt, dir; float dis; float minDistSqr = MIN_DISTANCE_SQR; gentity_t *target; Seeker_MaintainHeight(); if(NPC->activator && NPC->activator->client) { if(NPC->activator->client->remote != NPC || NPC->activator->health <= 0) { //have us fall down and explode. NPC->NPC->aiFlags |= NPCAI_CUSTOM_GRAVITY; return; } target = NPCInfo->goalEntity; if(!target) target = NPC->client->leader; } else { target = FindClosestPlayer(NPC->r.currentOrigin, NPC->client->playerTeam); } if(!target) { //in MP it's actually possible that there's no players on our team at the moment. return; } dis = DistanceHorizontalSquared( NPC->r.currentOrigin, target->r.currentOrigin ); if ( NPC->client->NPC_class == CLASS_BOBAFETT ) { if ( TIMER_Done( NPC, "flameTime" ) ) { minDistSqr = 200*200; } } if ( dis < minDistSqr ) { // generally circle the player closely till we take an enemy..this is our target point if ( NPC->client->NPC_class == CLASS_BOBAFETT ) { pt[0] = target->r.currentOrigin[0] + cos( level.time * 0.001f + NPC->random ) * 250; pt[1] = target->r.currentOrigin[1] + sin( level.time * 0.001f + NPC->random ) * 250; if ( NPC->client->jetPackTime < level.time ) { pt[2] = target->r.currentOrigin[2] - 64; } else { pt[2] = target->r.currentOrigin[2] + 200; } } else { pt[0] = target->r.currentOrigin[0] + cos( level.time * 0.001f + NPC->random ) * 56; pt[1] = target->r.currentOrigin[1] + sin( level.time * 0.001f + NPC->random ) * 56; pt[2] = target->r.currentOrigin[2] + 40; } VectorSubtract( pt, NPC->r.currentOrigin, dir ); VectorMA( NPC->client->ps.velocity, 0.8f, dir, NPC->client->ps.velocity ); } else { if ( NPC->client->NPC_class != CLASS_BOBAFETT ) { if ( TIMER_Done( NPC, "seekerhiss" )) { TIMER_Set( NPC, "seekerhiss", 1000 + random() * 1000 ); G_Sound( NPC, CHAN_AUTO, G_SoundIndex( "sound/chars/seeker/misc/hiss" )); } } // Hey come back! NPCInfo->goalEntity = target; if(target == NPC->enemy) NPCInfo->goalRadius = 60; else NPCInfo->goalRadius = 32; if(!NPC_MoveToGoal(qtrue)) { //cant go there on our first try, abort. //this really isnt the best way... but if it cant reach the point, it will just sit there doing nothing. NPCInfo->goalEntity = NPC->client->leader; //stop chasing the enemy if we were told to, and return to the player NPCInfo->scriptFlags &= ~SCF_CHASE_ENEMIES; } } //call this even if we do have an enemy, for enemy proximity detection if ( /*!NPC->enemy && */ NPCInfo->enemyCheckDebounceTime < level.time ) { // check twice a second to find a new enemy//.........这里部分代码省略.........
开发者ID:jwginge,项目名称:ojpa,代码行数:101,
示例17: 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,
示例18: Seeker_FindEnemy//------------------------------------void Seeker_FindEnemy( void ){ int numFound; float dis, bestDis = SEEKER_SEEK_RADIUS * SEEKER_SEEK_RADIUS + 1; vec3_t mins, maxs; int entityList[MAX_GENTITIES]; gentity_t *ent, *best = NULL; int i; //[SeekerItemNpc] float closestDist = SEEKER_SEEK_RADIUS * SEEKER_SEEK_RADIUS + 1; //[/SeekerItemNpc] if(NPC->activator && NPC->activator->client->ps.weapon == WP_SABER && !NPC->activator->client->ps.saberHolstered) { NPC->enemy=NULL; return; } VectorSet( maxs, SEEKER_SEEK_RADIUS, SEEKER_SEEK_RADIUS, SEEKER_SEEK_RADIUS ); VectorScale( maxs, -1, mins ); //[CoOp] //without this, the seekers are just scanning in terms of the world coordinates instead of around themselves, which is bad. VectorAdd(maxs, NPC->r.currentOrigin, maxs); VectorAdd(mins, NPC->r.currentOrigin, mins); //[/CoOp] numFound = trap_EntitiesInBox( mins, maxs, entityList, MAX_GENTITIES ); for ( i = 0 ; i < numFound ; i++ ) { ent = &g_entities[entityList[i]]; if ( ent->s.number == NPC->s.number || !ent->client //&& || !ent->NPC //[CoOp] //SP says this. Don't attack non-NPCs?! //|| !ent->NPC //[/CoOp] || ent->health <= 0 || !ent->inuse ) { continue; } //[SeekerItemNpc] if(OnSameTeam(NPC->activator, ent)) { //our owner is on the same team as this entity, don't target them. continue; } //dont attack our owner if(NPC->activator == ent) continue; if(ent->s.NPC_class == CLASS_VEHICLE) continue; //[/SeekerItemNpc] dis = DistanceHorizontalSquared( NPC->r.currentOrigin, ent->r.currentOrigin ); if ( dis <= closestDist ) closestDist = dis; // try to find the closest visible one if ( !NPC_ClearLOS4( ent )) { continue; } if ( dis <= bestDis ) { bestDis = dis; best = ent; } //[/SeekerItemNpc] } if ( best ) { //[SeekerItemNpc] because we can run even if we already have an enemy if(!NPC->enemy) { // 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; } //[/SeekerItemNpc] } //[SeekerItemNpc] //positive radius, check with los in mind if(NPC->radius > 0) { if(best && bestDis <= NPC->radius) NPC->fly_sound_debounce_time = level.time + (int)floor(2500.0f * (bestDis / (float)NPC->radius)) + 500; else NPC->fly_sound_debounce_time = -1; }//.........这里部分代码省略.........
开发者ID:jwginge,项目名称:ojpa,代码行数:101,
示例19: NPC_BSGrenadier_Attackvoid NPC_BSGrenadier_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_BSGrenadier_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_BSGrenadier_Patrol();//FIXME: or patrol? return; } enemyLOS = enemyCS = qfalse; move = qtrue; faceEnemy = qfalse; shoot = qfalse; enemyDist = DistanceSquared( NPC->enemy->currentOrigin, NPC->currentOrigin ); //See if we should switch to melee attack if ( enemyDist < 16384 && (!NPC->enemy->client||NPC->enemy->client->ps.weapon != WP_SABER||!NPC->enemy->client->ps.saberActive) )//128 {//enemy is close and not using saber if ( NPC->client->ps.weapon == WP_THERMAL ) {//grenadier trace_t trace; gi.trace ( &trace, NPC->currentOrigin, NPC->enemy->mins, NPC->enemy->maxs, NPC->enemy->currentOrigin, NPC->s.number, NPC->enemy->clipmask ); if ( !trace.allsolid && !trace.startsolid && (trace.fraction == 1.0 || trace.entityNum == NPC->enemy->s.number ) ) {//I can get right to him //reset fire-timing variables NPC_ChangeWeapon( WP_MELEE ); if ( !(NPCInfo->scriptFlags&SCF_CHASE_ENEMIES) )//NPCInfo->behaviorState == BS_STAND_AND_SHOOT ) {//FIXME: should we be overriding scriptFlags? NPCInfo->scriptFlags |= SCF_CHASE_ENEMIES;//NPCInfo->behaviorState = BS_HUNT_AND_KILL; } } } } else if ( enemyDist > 65536 || (NPC->enemy->client && NPC->enemy->client->ps.weapon == WP_SABER && NPC->enemy->client->ps.saberActive) )//256 {//enemy is far or using saber if ( NPC->client->ps.weapon == WP_MELEE && (NPC->client->ps.stats[STAT_WEAPONS]&(1<<WP_THERMAL)) ) {//fisticuffs, make switch to thermal if have it //reset fire-timing variables NPC_ChangeWeapon( WP_THERMAL ); } } //can we see our target? if ( NPC_ClearLOS( NPC->enemy ) ) { NPCInfo->enemyLastSeenTime = level.time; enemyLOS = qtrue; if ( NPC->client->ps.weapon == WP_MELEE ) { if ( enemyDist <= 4096 && InFOV( NPC->enemy->currentOrigin, NPC->currentOrigin, NPC->client->ps.viewangles, 90, 45 ) )//within 64 & infront { VectorCopy( NPC->enemy->currentOrigin, NPCInfo->enemyLastSeenLocation ); enemyCS = qtrue; } } else if ( InFOV( NPC->enemy->currentOrigin, NPC->currentOrigin, NPC->client->ps.viewangles, 45, 90 ) ) {//in front of me //can we shoot our target? //FIXME: how accurate/necessary is this check? int hit = NPC_ShotEntity( NPC->enemy ); gentity_t *hitEnt = &g_entities[hit]; if ( hit == NPC->enemy->s.number || ( hitEnt && hitEnt->client && hitEnt->client->playerTeam == NPC->client->enemyTeam ) ) { VectorCopy( NPC->enemy->currentOrigin, NPCInfo->enemyLastSeenLocation ); float enemyHorzDist = DistanceHorizontalSquared( NPC->enemy->currentOrigin, NPC->currentOrigin ); if ( enemyHorzDist < 1048576 ) {//within 1024 enemyCS = qtrue; NPC_AimAdjust( 2 );//adjust aim better longer we have clear shot at enemy } else { NPC_AimAdjust( 1 );//adjust aim better longer we can see enemy } } } }//.........这里部分代码省略.........
开发者ID:blaenk,项目名称:jedioutcast,代码行数:101,
示例20: NPC_BSGM_Attackvoid NPC_BSGM_Attack( void ){ //Don't do anything if we're hurt if ( NPC->painDebounceTime > level.time ) { NPC_UpdateAngles( qtrue, qtrue ); return; } //FIXME: if killed enemy, use victory anim if ( NPC->enemy && NPC->enemy->health <= 0 && !NPC->enemy->s.number ) {//my enemy is dead if ( NPC->client->ps.torsoAnim == BOTH_STAND2TO1 ) { if ( NPC->client->ps.torsoAnimTimer <= 500 ) { G_AddVoiceEvent( NPC, Q_irand( EV_VICTORY1, EV_VICTORY3 ), 3000 ); NPC_SetAnim( NPC, SETANIM_BOTH, BOTH_TRIUMPHANT1START, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); NPC->client->ps.legsAnimTimer += 500; NPC->client->ps.torsoAnimTimer += 500; } } else if ( NPC->client->ps.torsoAnim == BOTH_TRIUMPHANT1START ) { if ( NPC->client->ps.torsoAnimTimer <= 500 ) { NPC_SetAnim( NPC, SETANIM_BOTH, BOTH_TRIUMPHANT1STARTGESTURE, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); NPC->client->ps.legsAnimTimer += 500; NPC->client->ps.torsoAnimTimer += 500; } } else if ( NPC->client->ps.torsoAnim == BOTH_TRIUMPHANT1STARTGESTURE ) { if ( NPC->client->ps.torsoAnimTimer <= 500 ) { NPC_SetAnim( NPC, SETANIM_BOTH, BOTH_TRIUMPHANT1STOP, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); NPC->client->ps.legsAnimTimer += 500; NPC->client->ps.torsoAnimTimer += 500; } } else if ( NPC->client->ps.torsoAnim == BOTH_TRIUMPHANT1STOP ) { if ( NPC->client->ps.torsoAnimTimer <= 500 ) { NPC_SetAnim( NPC, SETANIM_BOTH, BOTH_STAND1, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); NPC->client->ps.legsAnimTimer = -1; NPC->client->ps.torsoAnimTimer = -1; } } else if ( NPC->wait ) { if ( TIMER_Done( NPC, "gloatTime" ) ) { GM_StartGloat(); } else if ( DistanceHorizontalSquared( NPC->client->renderInfo.eyePoint, NPC->enemy->currentOrigin ) > 4096 && (NPCInfo->scriptFlags&SCF_CHASE_ENEMIES) )//64 squared { NPCInfo->goalEntity = NPC->enemy; GM_Move(); } else {//got there GM_StartGloat(); } } NPC_FaceEnemy( qtrue ); NPC_UpdateAngles( qtrue, qtrue ); return; } //If we don't have an enemy, just idle if ( NPC_CheckEnemyExt() == qfalse || !NPC->enemy ) { NPC->enemy = NULL; NPC_BSGM_Patrol(); return; } enemyLOS = enemyCS = qfalse; bMove = qtrue; faceEnemy = qfalse; shoot = qfalse; hitAlly = qfalse; VectorClear( impactPos ); enemyDist = DistanceSquared( NPC->currentOrigin, NPC->enemy->currentOrigin ); if ( NPC->client->ps.torsoAnim == BOTH_ATTACK4 || NPC->client->ps.torsoAnim == BOTH_ATTACK5 ) { shoot = qfalse; if ( TIMER_Done( NPC, "smackTime" ) && !NPCInfo->blockedDebounceTime ) {//time to smack //recheck enemyDist and InFront if ( enemyDist < MELEE_DIST_SQUARED && InFront( NPC->enemy->currentOrigin, NPC->currentOrigin, NPC->client->ps.viewangles, 0.3f ) ) { vec3_t smackDir; VectorSubtract( NPC->enemy->currentOrigin, NPC->currentOrigin, smackDir ); smackDir[2] += 30; VectorNormalize( smackDir ); //hurt them//.........这里部分代码省略.........
开发者ID:PJayB,项目名称:jk2src,代码行数:101,
注:本文中的DistanceHorizontalSquared函数示例整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 C++ DistanceSquared函数代码示例 C++ DistanceBearing函数代码示例 |