/* ============== alarmbox_die ============== */ void alarmbox_die( gentity_t *ent, gentity_t *inflictor, gentity_t *attacker, int damage, int mod ) { alarmExplosion( ent ); ent->s.frame = 2; ent->active = qfalse; ent->takedamage = qfalse; alarmbox_updateparts( ent, qtrue ); }
/* ============== alarmbox_die ============== */ void alarmbox_die(gentity_t *ent, gentity_t *inflictor, gentity_t *attacker, int damage, int mod) { gentity_t *t; alarmExplosion(ent); ent->s.frame = 2; ent->active = qfalse; ent->takedamage = qfalse; alarmbox_updateparts(ent, qtrue); // fire 'death' targets if(ent->targetdeath) { t = NULL; while((t = G_Find(t, FOFS(targetname), ent->targetdeath)) != NULL) { if(t == ent) { G_Printf("WARNING: Entity used itself.\n"); } else { // fire target t->use(t, ent, attacker); } } } }
/* ============== alarmbox_use ============== */ void alarmbox_use(gentity_t *ent, gentity_t *other, gentity_t *foo) { if(!(ent->active)) { return; } if(ent->s.frame) { ent->s.frame = 0; } else { ent->s.frame = 1; } alarmbox_updateparts(ent, qtrue); if(other->client) { G_AddEvent(ent, EV_GENERAL_SOUND, ent->soundPos3); } // G_Printf("touched alarmbox\n"); }
/* ============== alarmbox_updateparts ============== */ void alarmbox_updateparts(gentity_t *ent, qboolean matestoo) { gentity_t *t, *mate; qboolean alarming = (ent->s.frame == 1); // update teammates if (matestoo) { for (mate = ent->teammaster; mate; mate = mate->teamchain) { if (mate == ent) { continue; } if (!(mate->active)) { // don't update dead alarm boxes, they stay dead continue; } if (!(ent->active)) { // destroyed, so just turn teammates off mate->s.frame = 0; } else { mate->s.frame = ent->s.frame; } alarmbox_updateparts(mate, qfalse); } } // update lights if (!ent->target) { return; } t = NULL; while ((t = G_FindByTargetname(t, ent->target)) != NULL) { if (t == ent) { G_DPrintf("WARNING: Entity used itself.\n"); } else { // give the dlight the sound if (!Q_stricmp(t->classname, "dlight")) { t->soundLoop = ent->soundLoop; if (alarming) { if (!(t->r.linked)) { G_UseEntity(t, ent, 0); } } else { if (t->r.linked) { G_UseEntity(t, ent, 0); } } } // alarmbox can tell script_trigger about activation // (but don't trigger if dying, only activation) else if (!Q_stricmp(t->classname, "target_script_trigger") && ent->active) { // not dead G_UseEntity(t, ent, 0); } } } }
/* ============== alarmbox_finishspawning ============== */ void alarmbox_finishspawning( gentity_t *ent ) { gentity_t *mate; // make sure they all have the same master (picked arbitrarily. last spawned) for ( mate = ent; mate; mate = mate->teamchain ) mate->teammaster = ent->teammaster; // find lights and set their state alarmbox_updateparts( ent, qtrue ); }
/* ============== alarmbox_die ============== */ void alarmbox_die(gentity_t *ent, gentity_t *inflictor, gentity_t *attacker, int damage, int mod) { // Nico, silent GCC (void)inflictor; (void)attacker; (void)damage; (void)mod; propExplosion(ent); ent->s.frame = 2; ent->active = qfalse; ent->takedamage = qfalse; alarmbox_updateparts(ent, qtrue); }
/* ============== alarmbox_use ============== */ void alarmbox_use(gentity_t *ent, gentity_t *other, gentity_t *foo) { // Nico, silent GCC (void)foo; if (!(ent->active)) { return; } if (ent->s.frame) { ent->s.frame = 0; } else { ent->s.frame = 1; } alarmbox_updateparts(ent, qtrue); if (other->client) { G_AddEvent(ent, EV_GENERAL_SOUND, ent->soundPos3); } }