From a0ede8101d002cb10162cf754886100c8bf06dd9 Mon Sep 17 00:00:00 2001 From: Eidolon Date: Tue, 10 Jun 2025 16:43:24 -0500 Subject: [PATCH] Use a different voice attentuation distance for teammates Separate cvar to control this. Double the normal distance by default. --- src/cvars.cpp | 4 ++++ src/s_sound.c | 22 ++++++++++++++++++---- src/s_sound.h | 1 + 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/cvars.cpp b/src/cvars.cpp index c74f42254..9bccb47d2 100644 --- a/src/cvars.cpp +++ b/src/cvars.cpp @@ -1409,6 +1409,10 @@ consvar_t cv_voice_distanceattenuation_distance = NetVar("voice_distanceattenuat .floating_point() .description("Voice speaker's distance from listener at which positional voice is fully attenuated"); +consvar_t cv_voice_distanceattenuation_teamdistance = NetVar("voice_distanceattenuation_teamdistance", "8192") + .floating_point() + .description("Teammate voice speaker's distance from listener at which positional voice is fully attenuated"); + // The volume factor (scaled logarithmically, i.e. 0.5 = "half as loud") for voice distance attenuation consvar_t cv_voice_distanceattenuation_factor = NetVar("voice_distanceattenuation_factor", "0.2") .floating_point() diff --git a/src/s_sound.c b/src/s_sound.c index 5b68ea049..2592410f5 100644 --- a/src/s_sound.c +++ b/src/s_sound.c @@ -933,6 +933,7 @@ void S_UpdateVoicePositionalProperties(void) // Positional voice audio boolean voice_proximity_enabled = cv_voice_proximity.value == 1; float voice_distanceattenuation_distance = FixedToFloat(cv_voice_distanceattenuation_distance.value) * FixedToFloat(mapheaderinfo[gamemap-1]->mobj_scale); + float voice_distanceattenuation_teamdistance = FixedToFloat(cv_voice_distanceattenuation_teamdistance.value) * FixedToFloat(mapheaderinfo[gamemap-1]->mobj_scale); float voice_distanceattenuation_factor = FixedToFloat(cv_voice_distanceattenuation_factor.value); float voice_stereopanning_factor = FixedToFloat(cv_voice_stereopanning_factor.value); float voice_concurrentattenuation_min = max(0, min(MAXPLAYERS, cv_voice_concurrentattenuation_min.value)); @@ -946,9 +947,15 @@ void S_UpdateVoicePositionalProperties(void) { if (S_IsPlayerVoiceActive(i)) { - if (voice_distanceattenuation_distance > 0) + float attenuation_distance = voice_distanceattenuation_distance; + if (G_GametypeHasTeams() && players[i].team == players[consoleplayer].team) { - speakingplayers += 1.f - (playerdistances[i] / voice_distanceattenuation_distance); + attenuation_distance = voice_distanceattenuation_teamdistance; + } + + if (attenuation_distance > 0) + { + speakingplayers += 1.f - (playerdistances[i] / attenuation_distance); } else { @@ -1006,10 +1013,17 @@ void S_UpdateVoicePositionalProperties(void) angle = PointIsLeft(ldirx, ldiry, pdirx, pdiry) ? -angle : angle; float plrvolume = 1.0f; - if (voice_distanceattenuation_distance > 0 && voice_distanceattenuation_factor >= 0 && voice_distanceattenuation_factor <= 1.0f) + + float attenuation_distance = voice_distanceattenuation_distance; + if (G_GametypeHasTeams() && players[i].team == players[consoleplayer].team) + { + attenuation_distance = voice_distanceattenuation_teamdistance; + } + + if (attenuation_distance > 0 && voice_distanceattenuation_factor >= 0 && voice_distanceattenuation_factor <= 1.0f) { float invfactor = 1.0f - voice_distanceattenuation_factor; - float distfactor = max(0.f, min(voice_distanceattenuation_distance, pdistance)) / voice_distanceattenuation_distance; + float distfactor = max(0.f, min(attenuation_distance, pdistance)) / attenuation_distance; plrvolume = max(0.0f, min(1.0f, 1.0f - (invfactor * distfactor))); } diff --git a/src/s_sound.h b/src/s_sound.h index f2d9f882a..9b9143bef 100644 --- a/src/s_sound.h +++ b/src/s_sound.h @@ -56,6 +56,7 @@ extern consvar_t cv_voice_inputamp; extern consvar_t cv_voice_activationthreshold; extern consvar_t cv_voice_proximity; extern consvar_t cv_voice_distanceattenuation_distance; +extern consvar_t cv_voice_distanceattenuation_teamdistance; extern consvar_t cv_voice_distanceattenuation_factor; extern consvar_t cv_voice_stereopanning_factor; extern consvar_t cv_voice_concurrentattenuation_factor;