diff --git a/src/header/local.h b/src/header/local.h index 9c353cc..9a09739 100644 --- a/src/header/local.h +++ b/src/header/local.h @@ -1164,7 +1164,7 @@ struct edict_s int dmg; int radius_dmg; float dmg_radius; - int sounds; //make this a spawntemp var? + int sounds; // now also used for player death sound aggregation int count; edict_t *chain; diff --git a/src/player/client.c b/src/player/client.c index d1455f0..99706ab 100644 --- a/src/player/client.c +++ b/src/player/client.c @@ -610,8 +610,8 @@ void player_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damag memset(self->client->pers.inventory, 0, sizeof(self->client->pers.inventory)); if (self->health < -40) - { // gib - gi.sound (self, CHAN_BODY, gi.soundindex ("misc/udeath.wav"), 1, ATTN_NORM, 0); + { // gib (play sound at end of server frame) + self->sounds = gi.soundindex ("misc/udeath.wav"); for (n= 0; n < 4; n++) ThrowGib (self, "models/objects/gibs/sm_meat/tris.md2", damage, GIB_ORGANIC); ThrowClientHead (self, damage); @@ -647,7 +647,10 @@ void player_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damag self->client->anim_end = FRAME_death308; break; } - gi.sound (self, CHAN_VOICE, gi.soundindex(va("*death%i.wav", (rand()%4)+1)), 1, ATTN_NORM, 0); + + // play sound at end of server frame + if (!self->sounds) + self->sounds = gi.soundindex(va("*death%i.wav", (rand()%4)+1)); } } diff --git a/src/player/view.c b/src/player/view.c index de87ed0..af68a1c 100644 --- a/src/player/view.c +++ b/src/player/view.c @@ -65,6 +65,13 @@ void P_DamageFeedback (edict_t *player) return; } + // death/gib sound is now aggregated and played here + if (player->sounds) + { + gi.sound (player, CHAN_VOICE, player->sounds, 1, ATTN_NORM, 0); + player->sounds = 0; + } + client = player->client; // flash the backgrounds behind the status numbers @@ -116,7 +123,7 @@ void P_DamageFeedback (edict_t *player) count = 10; // always make a visible effect // play an apropriate pain sound - if ((level.time > player->pain_debounce_time) && !(player->flags & FL_GODMODE) && (client->invincible_framenum <= level.framenum)) + if ((level.time > player->pain_debounce_time) && !(player->flags & FL_GODMODE) && (client->invincible_framenum <= level.framenum) && player->health > 0) { r = 1 + (rand()&1); player->pain_debounce_time = level.time + 0.7; @@ -787,7 +794,8 @@ void P_WorldEffects (void) { if (current_player->health > 0 && current_player->pain_debounce_time <= level.time - && current_client->invincible_framenum < level.framenum) + && current_client->invincible_framenum < level.framenum + && !(current_player->flags & FL_GODMODE)) { if (rand()&1) gi.sound (current_player, CHAN_VOICE, gi.soundindex("player/burn1.wav"), 1, ATTN_NORM, 0); @@ -895,6 +903,9 @@ void G_SetClientEvent (edict_t *ent) if (ent->s.event) return; + if (ent->health <= 0) + return; + if ( ent->groundentity && xyspeed > 225) { if ( (int)(current_client->bobtime+bobmove) != bobcycle )