Use a different voice attentuation distance for teammates

Separate cvar to control this. Double the normal distance by default.
This commit is contained in:
Eidolon 2025-06-10 16:43:24 -05:00
parent 23b4b83c7c
commit a0ede8101d
3 changed files with 23 additions and 4 deletions

View file

@ -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()

View file

@ -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)));
}

View file

@ -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;