void NPC_Mark2_Precache( void ) { G_SoundIndex( "sound/chars/mark2/misc/mark2_explo" );// blows up on death G_SoundIndex( "sound/chars/mark2/misc/mark2_pain" ); G_SoundIndex( "sound/chars/mark2/misc/mark2_fire" ); G_SoundIndex( "sound/chars/mark2/misc/mark2_move_lp" ); G_EffectIndex( "droidexplosion1" ); G_EffectIndex( "env/med_explode2" ); G_EffectIndex( "blaster/smoke_bolton" ); G_EffectIndex( "bryar/muzzle_flash" ); RegisterItem( FindItemForWeapon( WP_BRYAR_PISTOL )); RegisterItem( FindItemForAmmo( AMMO_METAL_BOLTS)); RegisterItem( FindItemForAmmo( AMMO_POWERCELL )); RegisterItem( FindItemForAmmo( AMMO_BLASTER )); }
//------------------------------------------------------------------------------------------------------------ void auto_turret_die ( gentity_t *self, gentity_t *inflictor, gentity_t *attacker, int damage, int meansOfDeath ) //------------------------------------------------------------------------------------------------------------ { vec3_t forward = { 0,0, 1 }, pos; // Turn off the thinking of the base & use it's targets g_entities[self->r.ownerNum].think = NULL; g_entities[self->r.ownerNum].use = NULL; // clear my data self->die = NULL; self->takedamage = qfalse; self->s.health = self->health = 0; self->s.loopSound = 0; self->s.shouldtarget = qfalse; VectorCopy( self->r.currentOrigin, pos ); pos[2] += self->r.maxs[2]*0.5f; G_PlayEffect( EFFECT_EXPLOSION_TURRET, pos, forward ); G_PlayEffectID( G_EffectIndex( "turret/explode" ), pos, forward ); if ( self->splashDamage > 0 && self->splashRadius > 0 ) { G_RadiusDamage( self->r.currentOrigin, attacker, self->splashDamage, self->splashRadius, attacker, NULL, MOD_UNKNOWN ); } self->s.weapon = 0; // crosshair code uses this to mark crosshair red if ( self->s.modelindex2 ) { // switch to damage model if we should self->s.modelindex = self->s.modelindex2; if (self->target_ent && self->target_ent->s.modelindex2) { self->target_ent->s.modelindex = self->target_ent->s.modelindex2; } VectorCopy( self->r.currentAngles, self->s.apos.trBase ); VectorClear( self->s.apos.trDelta ); if ( self->target ) { G_UseTargets( self, attacker ); } } else { ObjectDie( self, inflictor, attacker, damage, meansOfDeath ); } }
/* ------------------------- ImperialProbe_FireBlaster ------------------------- */ void ImperialProbe_FireBlaster(void) { vec3_t muzzle1,enemy_org1,delta1,angleToEnemy1; static vec3_t forward, vright, up; // static vec3_t muzzle; int genBolt1; gentity_t *missile; mdxaBone_t boltMatrix; genBolt1 = trap_G2API_AddBolt(NPC->ghoul2, 0, "*flash"); //FIXME: use {0, NPC->client->ps.legsYaw, 0} trap_G2API_GetBoltMatrix( NPC->ghoul2, 0, genBolt1, &boltMatrix, NPC->r.currentAngles, NPC->r.currentOrigin, level.time, NULL, NPC->modelScale ); BG_GiveMeVectorFromMatrix( &boltMatrix, ORIGIN, muzzle1 ); G_PlayEffectID( G_EffectIndex("bryar/muzzle_flash"), muzzle1, vec3_origin ); G_Sound( NPC, CHAN_AUTO, G_SoundIndex( "sound/chars/probe/misc/fire" )); if (NPC->health) { CalcEntitySpot( NPC->enemy, SPOT_CHEST, enemy_org1 ); enemy_org1[0]+= Q_irand(0,10); enemy_org1[1]+= Q_irand(0,10); VectorSubtract (enemy_org1, muzzle1, delta1); vectoangles ( delta1, angleToEnemy1 ); AngleVectors (angleToEnemy1, forward, vright, up); } else { AngleVectors (NPC->r.currentAngles, forward, vright, up); } missile = CreateMissile( muzzle1, forward, 1600, 10000, NPC, qfalse ); missile->classname = "bryar_proj"; missile->s.weapon = WP_BRYAR_PISTOL; if ( g_spskill.integer <= 1 ) { missile->damage = 5; } else { missile->damage = 10; } missile->dflags = DAMAGE_DEATH_KNOCKBACK; missile->methodOfDeath = MOD_UNKNOWN; missile->clipmask = MASK_SHOT | CONTENTS_LIGHTSABER; }
/* ------------------------- NPC_Interrogator_Precache ------------------------- */ void NPC_Interrogator_Precache(gentity_t *self) { G_SoundIndex( "sound/chars/interrogator/misc/torture_droid_lp" ); G_SoundIndex("sound/chars/mark1/misc/anger.wav"); G_SoundIndex( "sound/chars/probe/misc/talk"); G_SoundIndex( "sound/chars/interrogator/misc/torture_droid_inject" ); G_SoundIndex( "sound/chars/interrogator/misc/int_droid_explo" ); G_EffectIndex( "explosions/droidexplosion1" ); }
void NPC_Probe_Precache(void) { for ( int i = 1; i < 4; i++) { G_SoundIndex( va( "sound/chars/probe/misc/probetalk%d", i ) ); } G_SoundIndex( "sound/chars/probe/misc/probedroidloop" ); G_SoundIndex("sound/chars/probe/misc/anger1"); G_SoundIndex("sound/chars/probe/misc/fire"); G_EffectIndex( "chunks/probehead" ); G_EffectIndex( "env/med_explode2" ); G_EffectIndex( "explosions/probeexplosion1"); G_EffectIndex( "bryar/muzzle_flash" ); RegisterItem( FindItemForAmmo( AMMO_BLASTER )); RegisterItem( FindItemForWeapon( WP_BRYAR_PISTOL ) ); }
void G_ATSTCheckPain( gentity_t *self, gentity_t *other, const vec3_t point, int damage, int mod,int hitLoc ) { int newBolt; if ( rand() & 1 ) { G_SoundOnEnt( self, CHAN_LESS_ATTEN, "sound/chars/atst/atst_damaged1" ); } else { G_SoundOnEnt( self, CHAN_LESS_ATTEN, "sound/chars/atst/atst_damaged2" ); } if ((hitLoc==HL_ARM_LT) && (self->locationDamage[HL_ARM_LT] > LEFT_ARM_HEALTH)) { if (self->locationDamage[hitLoc] >= LEFT_ARM_HEALTH) // Blow it up? { newBolt = gi.G2API_AddBolt( &self->ghoul2[self->playerModel], "*flash3" ); if ( newBolt != -1 ) { // G_PlayEffect( "small_chunks", self->playerModel, self->genericBolt1, self->s.number); ATST_PlayEffect( self, self->genericBolt1, "env/med_explode2" ); G_PlayEffect( G_EffectIndex("blaster/smoke_bolton"), self->playerModel, newBolt, self->s.number, point); } gi.G2API_SetSurfaceOnOff( &self->ghoul2[self->playerModel], "head_light_blaster_cann", TURN_OFF ); } } else if ((hitLoc==HL_ARM_RT) && (self->locationDamage[HL_ARM_RT] > RIGHT_ARM_HEALTH)) // Blow it up? { if (self->locationDamage[hitLoc] >= RIGHT_ARM_HEALTH) { newBolt = gi.G2API_AddBolt( &self->ghoul2[self->playerModel], "*flash4" ); if ( newBolt != -1 ) { // G_PlayEffect( "small_chunks", self->playerModel, self->genericBolt2, self->s.number); ATST_PlayEffect( self, self->genericBolt2, "env/med_explode2" ); G_PlayEffect( G_EffectIndex("blaster/smoke_bolton"), self->playerModel, newBolt, self->s.number, point); } gi.G2API_SetSurfaceOnOff( &self->ghoul2[self->playerModel], "head_concussion_charger", TURN_OFF ); } } }
void NPC_Gonk_Precache( void ) { G_SoundIndex( "sound/chars/gonk/misc/gonktalk1.wav" ); G_SoundIndex( "sound/chars/gonk/misc/gonktalk2.wav" ); G_SoundIndex( "sound/chars/gonk/misc/death1.wav" ); G_SoundIndex( "sound/chars/gonk/misc/death2.wav" ); G_SoundIndex( "sound/chars/gonk/misc/death3.wav" ); G_EffectIndex( "env/med_explode" ); }
/* ------------------------- NPC_R2D2_Precache ------------------------- */ void NPC_R2D2_Precache(void) { for ( int i = 1; i < 4; i++) { G_SoundIndex( va( "sound/chars/r2d2/misc/r2d2talk0%d.wav", i ) ); } G_SoundIndex( "sound/chars/mark2/misc/mark2_explo" ); // ?? G_SoundIndex( "sound/chars/r2d2/misc/r2_move_lp.wav" ); G_EffectIndex( "env/med_explode"); }
/* ------------------------- NPC_Sentry_Precache ------------------------- */ void NPC_Sentry_Precache( void ) { int i; G_SoundIndex( "sound/chars/sentry/misc/sentry_explo" ); G_SoundIndex( "sound/chars/sentry/misc/sentry_pain" ); G_SoundIndex( "sound/chars/sentry/misc/sentry_shield_open" ); G_SoundIndex( "sound/chars/sentry/misc/sentry_shield_close" ); G_SoundIndex( "sound/chars/sentry/misc/sentry_hover_1_lp" ); G_SoundIndex( "sound/chars/sentry/misc/sentry_hover_2_lp" ); for ( i = 1; i < 4; i++ ) { G_SoundIndex( va( "sound/chars/sentry/misc/talk%d", i ) ); } G_EffectIndex( "bryar/muzzle_flash" ); G_EffectIndex( "env/med_explode" ); RegisterItem( BG_FindItemForAmmo( AMMO_BLASTER ) ); }
// Play an effect bolted onto the muzzle of the specified client //---------------------------- void G_PlayEffect( const char *name, int clientNum ) { gentity_t *tent; tent = G_TempEntity( g_entities[clientNum].currentOrigin, EV_PLAY_MUZZLE_EFFECT ); tent->s.eventParm = G_EffectIndex( name ); tent->s.otherEntityNum = clientNum; VectorSet( tent->maxs, FX_ENT_RADIUS, FX_ENT_RADIUS, FX_ENT_RADIUS ); VectorScale( tent->maxs, -1, tent->mins ); }
/* ------------------------- NPC_Howler_Pain ------------------------- */ void NPC_Howler_Pain( gentity_t *self, gentity_t *inflictor, gentity_t *other, const vec3_t point, int damage, int mod,int hitLoc ) { if ( !self || !self->NPC ) { return; } if ( self->NPC->localState != LSTATE_BERZERK )//damage >= 10 ) { self->NPC->stats.aggression += damage; self->NPC->localState = LSTATE_WAITING; TIMER_Remove( self, "attacking" ); VectorCopy( self->NPC->lastPathAngles, self->s.angles ); //if ( self->client->ps.legsAnim == BOTH_GESTURE1 ) { G_StopEffect( G_EffectIndex( "howler/sonic" ), self->playerModel, self->genericBolt1, self->s.number ); } NPC_SetAnim( self, SETANIM_BOTH, BOTH_PAIN1, SETANIM_FLAG_OVERRIDE | SETANIM_FLAG_HOLD ); TIMER_Set( self, "takingPain", self->client->ps.legsAnimTimer );//2900 ); if ( self->health > HOWLER_PANIC_HEALTH ) {//still have some health left if ( Q_irand( 0, self->max_health ) > self->health )//FIXME: or check damage? {//back off! TIMER_Set( self, "standing", -level.time ); TIMER_Set( self, "running", -level.time ); TIMER_Set( self, "walking", -level.time ); TIMER_Set( self, "retreating", Q_irand( 1000, 5000 ) ); } else {//go after him! TIMER_Set( self, "standing", -level.time ); TIMER_Set( self, "running", self->client->ps.legsAnimTimer+Q_irand(3000,6000) ); TIMER_Set( self, "walking", -level.time ); TIMER_Set( self, "retreating", -level.time ); } } else if ( self->NPC ) {//panic! if ( Q_irand( 0, 1 ) ) {//berzerk self->NPC->localState = LSTATE_BERZERK; } else {//flee self->NPC->localState = LSTATE_FLEE; TIMER_Set( self, "flee", Q_irand( 10000, 30000 ) ); } } } }
void NPC_Mouse_Precache( void ) { int i; for ( i = 1; i < 4; i++ ) { G_SoundIndex( va( "sound/chars/mouse/misc/mousego%d.wav", i ) ); } G_EffectIndex( "env/small_explode" ); G_SoundIndex( "sound/chars/mouse/misc/death1" ); G_SoundIndex( "sound/chars/mouse/misc/mouse_lp" ); }
//---------------------------------------------------------- void SP_fx_explosion_trail( gentity_t *ent ) { // We have to be useable, otherwise we won't spawn in if ( !ent->targetname ) { gi.Printf( S_COLOR_RED"ERROR: fx_explosion_trail at %s has no targetname specified\n", vtos( ent->s.origin )); G_FreeEntity( ent ); return; } // Get our defaults G_SpawnString( "fxFile", "env/exp_trail_comp", &ent->fxFile ); G_SpawnInt( "damage", "128", &ent->damage ); G_SpawnFloat( "radius", "128", &ent->radius ); G_SpawnFloat( "speed", "350", &ent->speed ); // Try and associate an effect file, unfortunately we won't know if this worked or not until the CGAME trys to register it... ent->fxID = G_EffectIndex( ent->fxFile ); if ( ent->fullName ) { G_EffectIndex( ent->fullName ); } if ( ent->model ) { ent->s.modelindex2 = G_ModelIndex( ent->model ); } // Give us a bit of time to spawn in the other entities, since we may have to target one of 'em ent->e_ThinkFunc = thinkF_fx_explosion_trail_link; ent->nextthink = level.time + 500; // Save our position and link us up! G_SetOrigin( ent, ent->s.origin ); VectorSet( ent->maxs, FX_ENT_RADIUS, FX_ENT_RADIUS, FX_ENT_RADIUS ); VectorScale( ent->maxs, -1, ent->mins ); gi.linkentity( ent ); }
void NPC_Mark2_Part_Explode( gentity_t *self, int bolt ) { if ( bolt >= 0 ) { mdxaBone_t boltMatrix; vector3 org, dir; trap->G2API_GetBoltMatrix( self->ghoul2, 0, bolt, &boltMatrix, &self->r.currentAngles, &self->r.currentOrigin, level.time, NULL, &self->modelScale ); BG_GiveMeVectorFromMatrix( &boltMatrix, ORIGIN, &org ); BG_GiveMeVectorFromMatrix( &boltMatrix, NEGATIVE_Y, &dir ); G_PlayEffectID( G_EffectIndex( "env/med_explode2" ), &org, &dir ); G_PlayEffectID( G_EffectIndex( "blaster/smoke_bolton" ), &org, &dir ); } //G_PlayEffectID( G_EffectIndex("blaster/smoke_bolton"), self->playerModel, bolt, self->s.number); self->count++; // Count of pods blown off }
void Boba_Precache( void ) { G_SoundIndex( "sound/chars/boba/bf_blast-off.wav" ); G_SoundIndex( "sound/chars/boba/bf_jetpack_lp.wav" ); G_SoundIndex( "sound/chars/boba/bf_land.wav" ); G_SoundIndex( "sound/weapons/boba/bf_flame.mp3" ); G_SoundIndex( "sound/player/footsteps/boot1" ); G_SoundIndex( "sound/player/footsteps/boot2" ); G_SoundIndex( "sound/player/footsteps/boot3" ); G_SoundIndex( "sound/player/footsteps/boot4" ); G_EffectIndex( "boba/jetSP" ); G_EffectIndex( "boba/fthrw" ); G_EffectIndex( "volumetric/black_smoke" ); G_EffectIndex( "chunks/dustFall" ); AverageEnemyDirectionSamples = 0; VectorClear(AverageEnemyDirection); BobaHadDeathScript = false; BobaActive = true; BobaFootStepCount = 0; }
/* ------------------------- NPC_Mark1_Part_Explode ------------------------- */ void NPC_Mark1_Part_Explode( gentity_t *self, int bolt ) { if ( bolt >=0 ) { mdxaBone_t boltMatrix; vec3_t org, dir; trap_G2API_GetBoltMatrix( self->ghoul2, 0, bolt, &boltMatrix, self->r.currentAngles, self->r.currentOrigin, level.time, NULL, self->modelScale ); BG_GiveMeVectorFromMatrix( &boltMatrix, ORIGIN, org ); BG_GiveMeVectorFromMatrix( &boltMatrix, NEGATIVE_Y, dir ); G_PlayEffectID( G_EffectIndex("env/med_explode2"), org, dir ); G_PlayEffectID( G_EffectIndex("blaster/smoke_bolton"), org, dir ); } }
void TieBomberThink( gentity_t *self ) { // NOTE: Lerp2Angles will think this thinkfunc if the model is a misc_model_breakable. Watchout // for that in a script (try to just use ROFF's?). // Stop thinking, you're dead. if ( self->health <= 0 ) { return; } // Needed every think... self->nextthink = level.time + FRAMETIME; gentity_t *player = &g_entities[0]; vec3_t playerDir; float playerDist; //use player eyepoint VectorSubtract( player->currentOrigin, self->currentOrigin, playerDir ); playerDist = VectorNormalize( playerDir ); // Time to attack? if ( player->health > 0 && playerDist < MIN_PLAYER_DIST && self->attackDebounceTime < level.time ) { // Doesn't matter what model gets loaded here, as long as it exists. // It's only used as a point on to which the falling effect for the bomb // can be attached to (kinda inefficient, I know). char name1[200] = "models/players/gonk/model.glm"; gentity_t *bomb = G_CreateObject( self, self->s.pos.trBase, self->s.apos.trBase, 0, 0, TR_GRAVITY, 0 ); bomb->s.modelindex = G_ModelIndex( name1 ); gi.G2API_InitGhoul2Model( bomb->ghoul2, name1, bomb->s.modelindex, NULL_HANDLE, NULL_HANDLE, 0, 0); bomb->s.radius = 50; bomb->s.eFlags |= EF_NODRAW; // Make the bombs go forward in the bombers direction a little. vec3_t fwd, rt; AngleVectors( self->currentAngles, fwd, rt, NULL ); rt[2] -= 0.5f; VectorMA( bomb->s.pos.trBase, -30.0, rt, bomb->s.pos.trBase ); VectorScale( fwd, 300, bomb->s.pos.trDelta ); SnapVector( bomb->s.pos.trDelta ); // save net bandwidth // Start the effect. G_PlayEffect( G_EffectIndex( "ships/tiebomber_bomb_falling" ), bomb->playerModel, gi.G2API_AddBolt( &bomb->ghoul2[0], "model_root" ), bomb->s.number, bomb->currentOrigin, 1000, qtrue ); // Set the tie bomb to have a touch function, so when it hits the ground (or whatever), there's a nice 'boom'. bomb->e_TouchFunc = touchF_TouchTieBomb; self->attackDebounceTime = level.time + 1000; } }
//------------------------------------------ void SP_fx_target_beam( gentity_t *ent ) { G_SetOrigin( ent, ent->s.origin ); ent->speed *= 1000; ent->wait *= 1000; ent->random *= 1000; if ( ent->speed < FRAMETIME ) { ent->speed = FRAMETIME; } G_SpawnInt( "damage", "0", &ent->damage ); G_SpawnString( "fxFile", "env/targ_beam", &ent->fxFile ); if ( ent->spawnflags & 16 ) // NO_IMPACT FX { ent->delay = 0; } else { G_SpawnString( "fxFile2", "env/targ_beam_impact", &ent->fullName ); ent->delay = G_EffectIndex( ent->fullName ); } ent->fxID = G_EffectIndex( ent->fxFile ); ent->activator = ent; ent->owner = NULL; ent->e_ThinkFunc = thinkF_fx_target_beam_link; ent->nextthink = level.time + START_TIME_LINK_ENTS; VectorSet( ent->maxs, FX_ENT_RADIUS, FX_ENT_RADIUS, FX_ENT_RADIUS ); VectorScale( ent->maxs, -1, ent->mins ); gi.linkentity( ent ); }
void G_MissileBounceEffect( gentity_t *ent, vector3 *org, vector3 *dir ) { //FIXME: have an EV_BOUNCE_MISSILE event that checks the s.weapon and does the appropriate effect switch ( ent->s.weapon ) { case WP_BOWCASTER: G_PlayEffectID( G_EffectIndex( "bowcaster/deflect" ), &ent->r.currentOrigin, dir ); break; case WP_BLASTER: case WP_BRYAR_PISTOL: G_PlayEffectID( G_EffectIndex( "blaster/deflect" ), &ent->r.currentOrigin, dir ); break; default: { gentity_t *te = G_TempEntity( org, EV_SABER_BLOCK ); VectorCopy( org, &te->s.origin ); VectorCopy( dir, &te->s.angles ); te->s.eventParm = 0; te->s.weapon = 0;//saberNum te->s.legsAnim = 0;//bladeNum } break; } }
void NPC_GM_StartLaser( void ) { if ( !NPC->lockCount ) {//haven't already started a laser attack //warm up for the beam attack TIMER_Set( NPC, "beamDelay", NPC->client->ps.torsoTimer ); TIMER_Set( NPC, "attackDelay", NPC->client->ps.torsoTimer+3000 ); NPC->lockCount = 1; //turn on warmup effect G_PlayEffectID( G_EffectIndex("galak/beam_warmup"), NPC->r.currentOrigin, vec3_origin ); G_SoundOnEnt( NPC, CHAN_AUTO, "sound/weapons/galak/lasercharge.wav" ); } }
void WP_Melee( gentity_t *ent ) //--------------------------------------------------------- { gentity_t *tr_ent; trace_t tr; vec3_t mins, maxs, end; int damage = ent->s.number ? (g_spskill->integer*2)+1 : 3; float range = ent->s.number ? 64 : 32; VectorMA( muzzle, range, forwardVec, end ); VectorSet( maxs, 6, 6, 6 ); VectorScale( maxs, -1, mins ); gi.trace ( &tr, muzzle, mins, maxs, end, ent->s.number, MASK_SHOT, (EG2_Collision)0, 0 ); if ( tr.entityNum >= ENTITYNUM_WORLD ) { return; } tr_ent = &g_entities[tr.entityNum]; if ( ent->client && !PM_DroidMelee( ent->client->NPC_class ) ) { if ( ent->s.number || ent->alt_fire ) { damage *= Q_irand( 2, 3 ); } else { damage *= Q_irand( 1, 2 ); } } if ( tr_ent && tr_ent->takedamage ) { int dflags = DAMAGE_NO_KNOCKBACK; G_PlayEffect( G_EffectIndex( "melee/punch_impact" ), tr.endpos, forwardVec ); //G_Sound( tr_ent, G_SoundIndex( va("sound/weapons/melee/punch%d", Q_irand(1, 4)) ) ); if ( ent->NPC && (ent->NPC->aiFlags&NPCAI_HEAVY_MELEE) ) { //4x damage for heavy melee class damage *= 4; dflags &= ~DAMAGE_NO_KNOCKBACK; dflags |= DAMAGE_DISMEMBER; } G_Damage( tr_ent, ent, ent, forwardVec, tr.endpos, damage, dflags, MOD_MELEE ); } }
void Boba_StopFlameThrower( gentity_t *self ) { if ( self->s.number < MAX_CLIENTS ) { self->client->ps.torsoAnimTimer = 0; G_StopEffect( G_EffectIndex("boba/fthrw"), self->playerModel, self->genericBolt3, self->s.number); return; } if ((NPCInfo->aiFlags&NPCAI_FLAMETHROW)) { self->NPC->aiFlags &= ~NPCAI_FLAMETHROW; self->client->ps.torsoAnimTimer = 0; TIMER_Set( self, "flameTime", 0); TIMER_Set( self, "nextAttackDelay", 0); TIMER_Set( self, "Boba_TacticsSelect", 0); // G_SoundOnEnt( self, CHAN_WEAPON, "sound/effects/flameoff.mp3" ); G_StopEffect( G_EffectIndex("boba/fthrw"), self->playerModel, self->genericBolt3, self->s.number); Boba_Printf("FlameThrower OFF"); } }
//--------------------------------------------------------- void WP_FireDisruptor( gentity_t *ent, qboolean alt_fire ) //--------------------------------------------------------- { if ( alt_fire ) { WP_DisruptorAltFire( ent ); } else { WP_DisruptorMainFire( ent ); } G_PlayEffect( G_EffectIndex( "disruptor/line_cap" ), wpMuzzle, wpFwd ); }
/* ------------------------- NPC_Mark1_Precache ------------------------- */ void NPC_Mark1_Precache(void) { G_SoundIndex( "sound/chars/mark1/misc/mark1_wakeup"); G_SoundIndex( "sound/chars/mark1/misc/shutdown"); G_SoundIndex( "sound/chars/mark1/misc/walk"); G_SoundIndex( "sound/chars/mark1/misc/run"); G_SoundIndex( "sound/chars/mark1/misc/death1"); G_SoundIndex( "sound/chars/mark1/misc/death2"); G_SoundIndex( "sound/chars/mark1/misc/anger"); G_SoundIndex( "sound/chars/mark1/misc/mark1_fire"); G_SoundIndex( "sound/chars/mark1/misc/mark1_pain"); G_SoundIndex( "sound/chars/mark1/misc/mark1_explo"); G_EffectIndex( "env/med_explode2"); G_EffectIndex( "explosions/probeexplosion1"); G_EffectIndex( "blaster/smoke_bolton"); G_EffectIndex( "bryar/muzzle_flash"); G_EffectIndex( "explosions/droidexplosion1" ); RegisterItem( BG_FindItemForAmmo( AMMO_METAL_BOLTS)); RegisterItem( BG_FindItemForAmmo( AMMO_BLASTER )); RegisterItem( BG_FindItemForWeapon( WP_BOWCASTER )); RegisterItem( BG_FindItemForWeapon( WP_BRYAR_PISTOL )); }
//---------------------------------------------------------- void SP_fx_runner( gentity_t *ent ) { char *fxFile; // Get our defaults G_SpawnInt( "delay", "400", &ent->delay ); G_SpawnFloat( "random", "0", &ent->random ); if (!ent->s.angles[0] && !ent->s.angles[1] && !ent->s.angles[2]) { // didn't have angles, so give us the default of up VectorSet( ent->s.angles, -90, 0, 0 ); } // make us useable if we can be targeted if ( ent->targetname ) { ent->use = fx_runner_use; } G_SpawnString( "fxFile", "", &fxFile ); G_SpawnString( "fxTarget", "", &ent->roffname ); if ( !fxFile || !fxFile[0] ) { Com_Printf( S_COLOR_RED"ERROR: fx_runner %s at %s has no fxFile specified\n", ent->targetname, vtos(ent->s.origin) ); G_FreeEntity( ent ); return; } // Try and associate an effect file, unfortunately we won't know if this worked or not // until the CGAME trys to register it... ent->bolt_Head = G_EffectIndex( fxFile ); //It is dirty, yes. But no one likes adding things to the entity structure. // Give us a bit of time to spawn in the other entities, since we may have to target one of 'em ent->think = fx_runner_link; ent->nextthink = level.time + 300; // Save our position and link us up! G_SetOrigin( ent, ent->s.origin ); VectorSet( ent->r.maxs, FX_ENT_RADIUS, FX_ENT_RADIUS, FX_ENT_RADIUS ); VectorScale( ent->r.maxs, -1, ent->r.mins ); trap_LinkEntity( ent ); }
void NPC_GM_StartLaser( void ) { if ( !NPCS.NPC->lockCount ) {//haven't already started a laser attack //warm up for the beam attack #if 0 NPC_SetAnim( NPC, SETANIM_TORSO, TORSO_RAISEWEAP2, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD ); #endif TIMER_Set( NPCS.NPC, "beamDelay", NPCS.NPC->client->ps.torsoTimer ); TIMER_Set( NPCS.NPC, "attackDelay", NPCS.NPC->client->ps.torsoTimer+3000 ); NPCS.NPC->lockCount = 1; //turn on warmup effect G_PlayEffectID( G_EffectIndex("galak/beam_warmup"), NPCS.NPC->r.currentOrigin, vec3_origin ); G_SoundOnEnt( NPCS.NPC, CHAN_AUTO, "sound/weapons/galak/lasercharge.wav" ); } }
//--------------------------------------------------- static void CacheChunkEffects( material_t material ) { switch( material ) { case MAT_GLASS: G_EffectIndex( "chunks/glassbreak" ); break; case MAT_GLASS_METAL: G_EffectIndex( "chunks/glassbreak" ); G_EffectIndex( "chunks/metalexplode" ); break; case MAT_ELECTRICAL: case MAT_ELEC_METAL: G_EffectIndex( "chunks/sparkexplode" ); break; case MAT_METAL: case MAT_METAL2: case MAT_METAL3: case MAT_CRATE1: case MAT_CRATE2: G_EffectIndex( "chunks/metalexplode" ); break; case MAT_GRATE1: G_EffectIndex( "chunks/grateexplode" ); break; case MAT_DRK_STONE: case MAT_LT_STONE: case MAT_GREY_STONE: case MAT_WHITE_METAL: // what is this crap really supposed to be?? G_EffectIndex( "chunks/rockbreaklg" ); G_EffectIndex( "chunks/rockbreakmed" ); break; case MAT_ROPE: G_EffectIndex( "chunks/ropebreak" ); // G_SoundIndex(); // FIXME: give it a sound break; default: break; } }
static void ATST_PlayEffect( gentity_t *self, const int boltID, const char *fx ) { if ( boltID >= 0 && fx && fx[0] ) { mdxaBone_t boltMatrix; vector3 org, dir; trap->G2API_GetBoltMatrix( self->ghoul2, 0, boltID, &boltMatrix, self->r.currentAngles, self->r.currentOrigin, level.time, NULL, self->modelScale ); BG_GiveMeVectorFromMatrix( &boltMatrix, ORIGIN, org ); BG_GiveMeVectorFromMatrix( &boltMatrix, NEGATIVE_Y, dir ); G_PlayEffectID( G_EffectIndex( (char *)fx ), org, dir ); } }
/* ------------------------- NPC_Howler_Precache ------------------------- */ void NPC_Howler_Precache( void ) { int i; //G_SoundIndex( "sound/chars/howler/howl.mp3" ); G_EffectIndex( "howler/sonic" ); G_SoundIndex( "sound/chars/howler/howl.mp3" ); for ( i = 1; i < 3; i++ ) { G_SoundIndex( va( "sound/chars/howler/idle_hiss%d.mp3", i ) ); } for ( i = 1; i < 6; i++ ) { G_SoundIndex( va( "sound/chars/howler/howl_talk%d.mp3", i ) ); G_SoundIndex( va( "sound/chars/howler/howl_yell%d.mp3", i ) ); } }
/* ------------------------- NPC_Howler_Precache ------------------------- */ void NPC_Howler_Precache( void ) { //[CoOp] //added howler precashe from SP int i; G_EffectIndex( "howler/sonic" ); G_SoundIndex( "sound/chars/howler/howl.mp3" ); for ( i = 1; i < 3; i++ ) { G_SoundIndex( va( "sound/chars/howler/idle_hiss%d.mp3", i ) ); } for ( i = 1; i < 6; i++ ) { G_SoundIndex( va( "sound/chars/howler/howl_talk%d.mp3", i ) ); G_SoundIndex( va( "sound/chars/howler/howl_yell%d.mp3", i ) ); } //[/CoOp] }