From 99d0187651a6a6fcaad08889305102be9f00e0bc Mon Sep 17 00:00:00 2001 From: BjossiAlfreds Date: Thu, 29 Apr 2021 22:37:18 +0000 Subject: [PATCH] Fix for some player sound bugs --- src/header/local.h | 2 +- src/player/client.c | 13 ++++++++----- src/player/view.c | 20 +++++++++++++++++--- 3 files changed, 26 insertions(+), 9 deletions(-) diff --git a/src/header/local.h b/src/header/local.h index b00d3f5..350aff9 100644 --- a/src/header/local.h +++ b/src/header/local.h @@ -1067,7 +1067,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 3b2cb2e..5339674 100644 --- a/src/player/client.c +++ b/src/player/client.c @@ -663,9 +663,8 @@ player_die(edict_t *self, edict_t *inflictor, edict_t *attacker, if (self->health < -40) { - /* gib */ - gi.sound(self, CHAN_BODY, gi.soundindex("misc/udeath.wav"), - 1, ATTN_NORM, 0); + /* gib (sound played at end of server frame) */ + self->sounds = gi.soundindex("misc/udeath.wav"); for (n = 0; n < 4; n++) { @@ -713,8 +712,12 @@ player_die(edict_t *self, edict_t *inflictor, edict_t *attacker, } } - gi.sound(self, CHAN_VOICE, gi.soundindex(va("*death%i.wav", - (rand() % 4) + 1)), 1, ATTN_NORM, 0); + /* sound played 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 d19c4fd..b9664db 100644 --- a/src/player/view.c +++ b/src/player/view.c @@ -63,6 +63,13 @@ P_DamageFeedback(edict_t *player) return; } + /* death/gib sound is 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 */ @@ -132,7 +139,8 @@ P_DamageFeedback(edict_t *player) /* play an apropriate pain sound */ if ((level.time > player->pain_debounce_time) && !(player->flags & FL_GODMODE) && - (client->invincible_framenum <= level.framenum)) + (client->invincible_framenum <= level.framenum) && + player->health > 0) { r = 1 + (rand() & 1); player->pain_debounce_time = level.time + 0.7; @@ -908,7 +916,8 @@ 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) { @@ -1033,6 +1042,11 @@ G_SetClientEvent(edict_t *ent) return; } + if (ent->health <= 0) + { + return; + } + if (g_footsteps->value == 1) { if (ent->groundentity && (xyspeed > 225)) @@ -1043,7 +1057,7 @@ G_SetClientEvent(edict_t *ent) } } } - if (g_footsteps->value == 2) + else if (g_footsteps->value == 2) { if ((int)(current_client->bobtime + bobmove) != bobcycle) {