void Boba_FlyStart( gentity_t *self ) {//switch to seeker AI for a while if ( TIMER_Done( self, "jetRecharge" ) && !Boba_Flying( self ) ) { self->client->ps.gravity = 0; self->svFlags |= SVF_CUSTOM_GRAVITY; self->client->moveType = MT_FLYSWIM; //start jet effect self->client->jetPackTime = level.time + Q_irand( 3000, 10000 ); if ( self->genericBolt1 != -1 ) { G_PlayEffect( G_EffectIndex( "boba/jetSP" ), self->playerModel, self->genericBolt1, self->s.number, self->currentOrigin, qtrue, qtrue ); } if ( self->genericBolt2 != -1 ) { G_PlayEffect( G_EffectIndex( "boba/jetSP" ), self->playerModel, self->genericBolt2, self->s.number, self->currentOrigin, qtrue, qtrue ); } //take-off sound G_SoundOnEnt( self, CHAN_ITEM, "sound/chars/boba/bf_blast-off.wav" ); //jet loop sound self->s.loopSound = G_SoundIndex( "sound/chars/boba/bf_jetpack_lp.wav" ); if ( self->NPC ) { self->count = Q3_INFINITE; // SEEKER shot ammo count } } }
qboolean JET_Flying( gentity_t *self ) { if ( !self || !self->client ) { return qfalse; } if ( self->client->NPC_class == CLASS_BOBAFETT ) { return (Boba_Flying(self)); } else if ( self->client->NPC_class == CLASS_ROCKETTROOPER ) { return (RT_Flying(self)); } else { return qfalse; } }
void NPC_RunBehavior( int team, int bState ) { qboolean dontSetAim = qfalse; if (NPC->s.NPC_class == CLASS_VEHICLE && NPC->m_pVehicle) { //vehicles don't do AI! return; } if ( bState == BS_CINEMATIC ) { NPC_BSCinematic(); } else if ( NPC->client->ps.weapon == WP_EMPLACED_GUN ) { NPC_BSEmplaced(); NPC_CheckCharmed(); return; } else if ( NPC->client->ps.weapon == WP_SABER ) {//jedi NPC_BehaviorSet_Jedi( bState ); dontSetAim = qtrue; } else if ( NPC->client->NPC_class == CLASS_WAMPA ) {//wampa NPC_BSWampa_Default(); } else if ( NPC->client->NPC_class == CLASS_RANCOR ) {//rancor NPC_BehaviorSet_Rancor( bState ); } else if ( NPC->client->NPC_class == CLASS_REMOTE ) { NPC_BehaviorSet_Remote( bState ); } else if ( NPC->client->NPC_class == CLASS_SEEKER ) { NPC_BehaviorSet_Seeker( bState ); } else if ( NPC->client->NPC_class == CLASS_BOBAFETT ) {//bounty hunter if ( Boba_Flying( NPC ) ) { NPC_BehaviorSet_Seeker(bState); } else { NPC_BehaviorSet_Jedi( bState ); } dontSetAim = qtrue; } else if ( NPCInfo->scriptFlags & SCF_FORCED_MARCH ) {//being forced to march NPC_BSDefault(); } else { switch( team ) { // case NPCTEAM_SCAVENGERS: // case NPCTEAM_IMPERIAL: // case NPCTEAM_KLINGON: // case NPCTEAM_HIROGEN: // case NPCTEAM_MALON: // not sure if TEAM_ENEMY is appropriate here, I think I should be using NPC_class to check for behavior - dmv case NPCTEAM_ENEMY: // special cases for enemy droids switch( NPC->client->NPC_class) { case CLASS_ATST: NPC_BehaviorSet_ATST( bState ); return; case CLASS_PROBE: NPC_BehaviorSet_ImperialProbe(bState); return; case CLASS_REMOTE: NPC_BehaviorSet_Remote( bState ); return; case CLASS_SENTRY: NPC_BehaviorSet_Sentry(bState); return; case CLASS_INTERROGATOR: NPC_BehaviorSet_Interrogator( bState ); return; case CLASS_MINEMONSTER: NPC_BehaviorSet_MineMonster( bState ); return; case CLASS_HOWLER: NPC_BehaviorSet_Howler( bState ); return; case CLASS_MARK1: NPC_BehaviorSet_Mark1( bState ); return; case CLASS_MARK2: NPC_BehaviorSet_Mark2( bState ); return; case CLASS_GALAKMECH: NPC_BSGM_Default(); return; default: break; } if ( NPC->enemy && NPC->s.weapon == WP_NONE && bState != BS_HUNT_AND_KILL && !trap->ICARUS_TaskIDPending( (sharedEntity_t *)NPC, TID_MOVE_NAV ) ) {//if in battle and have no weapon, run away, fixme: when in BS_HUNT_AND_KILL, they just stand there if ( bState != BS_FLEE ) { NPC_StartFlee( NPC->enemy, &NPC->enemy->r.currentOrigin, AEL_DANGER_GREAT, 5000, 10000 ); } else { NPC_BSFlee(); } return; } if ( NPC->client->ps.weapon == WP_SABER ) {//special melee exception NPC_BehaviorSet_Default( bState ); return; } if ( NPC->client->ps.weapon == WP_DISRUPTOR && (NPCInfo->scriptFlags & SCF_ALT_FIRE) ) {//a sniper NPC_BehaviorSet_Sniper( bState ); return; } if ( NPC->client->ps.weapon == WP_THERMAL || NPC->client->ps.weapon == WP_STUN_BATON )//FIXME: separate AI for melee fighters {//a grenadier NPC_BehaviorSet_Grenadier( bState ); return; } if ( NPC_CheckSurrender() ) { return; } NPC_BehaviorSet_Stormtrooper( bState ); break; case NPCTEAM_NEUTRAL: // special cases for enemy droids if ( NPC->client->NPC_class == CLASS_PROTOCOL || NPC->client->NPC_class == CLASS_UGNAUGHT || NPC->client->NPC_class == CLASS_JAWA) { NPC_BehaviorSet_Default(bState); } else if ( NPC->client->NPC_class == CLASS_VEHICLE ) { // TODO: Add vehicle behaviors here. NPC_UpdateAngles( qtrue, qtrue );//just face our spawn angles for now } else { // Just one of the average droids NPC_BehaviorSet_Droid( bState ); } break; default: if ( NPC->client->NPC_class == CLASS_SEEKER ) { NPC_BehaviorSet_Seeker(bState); } else { if ( NPCInfo->charmedTime > level.time ) { NPC_BehaviorSet_Charmed( bState ); } else { NPC_BehaviorSet_Default( bState ); } NPC_CheckCharmed(); dontSetAim = qtrue; } break; } } }