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() .floating_point()
.description("Voice speaker's distance from listener at which positional voice is fully attenuated"); .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 // 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") consvar_t cv_voice_distanceattenuation_factor = NetVar("voice_distanceattenuation_factor", "0.2")
.floating_point() .floating_point()

View file

@ -933,6 +933,7 @@ void S_UpdateVoicePositionalProperties(void)
// Positional voice audio // Positional voice audio
boolean voice_proximity_enabled = cv_voice_proximity.value == 1; 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_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_distanceattenuation_factor = FixedToFloat(cv_voice_distanceattenuation_factor.value);
float voice_stereopanning_factor = FixedToFloat(cv_voice_stereopanning_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)); 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 (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 else
{ {
@ -1006,10 +1013,17 @@ void S_UpdateVoicePositionalProperties(void)
angle = PointIsLeft(ldirx, ldiry, pdirx, pdiry) ? -angle : angle; angle = PointIsLeft(ldirx, ldiry, pdirx, pdiry) ? -angle : angle;
float plrvolume = 1.0f; 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 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))); 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_activationthreshold;
extern consvar_t cv_voice_proximity; extern consvar_t cv_voice_proximity;
extern consvar_t cv_voice_distanceattenuation_distance; 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_distanceattenuation_factor;
extern consvar_t cv_voice_stereopanning_factor; extern consvar_t cv_voice_stereopanning_factor;
extern consvar_t cv_voice_concurrentattenuation_factor; extern consvar_t cv_voice_concurrentattenuation_factor;