Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/hearing radius #5

Open
wants to merge 12 commits into
base: main
Choose a base branch
from
54 changes: 44 additions & 10 deletions lua/autorun/client/proximity_voice_init.lua
Original file line number Diff line number Diff line change
@@ -1,28 +1,62 @@
local convar = CreateClientConVar( "proximity_voice_enabled", "0", true, true )
local convarEnabled = CreateClientConVar( "proximity_voice_enabled", "0", true, true )
cvars.AddChangeCallback( "proximity_voice_enabled", function( name, old, new )
net.Start( "proximity_voice_enabled_changed" )
net.WriteBool( tobool(new) )
net.WriteBool( tobool( new ) )
net.SendToServer()
end)
end )

local convarHearDead = CreateClientConVar( "proximity_voice_hear_dead", "0", true, true )
cvars.AddChangeCallback( "proximity_voice_hear_dead", function( name, old, new )
net.Start( "proximity_voice_hear_dead_changed" )
net.WriteBool( tobool( new ) )
net.SendToServer()
end )

local function populatePanel( form )
local checkbox = form:CheckBox( "Enable Proximity Voice", "proximity_voice_enabled" )
checkbox:SetChecked( convar:GetBool() )
end
local convar3D = CreateClientConVar( "proximity_voice_3D", "0", true, true )
cvars.AddChangeCallback( "proximity_voice_3D", function( name, old, new )
net.Start( "proximity_voice_3D_changed" )
net.WriteBool( tobool( new ) )
net.SendToServer()
end )

local convarRange = CreateClientConVar( "proximity_voice_range", "1000", true, true, "Proximity voice range (500-2500)", 500, 2500 )
cvars.AddChangeCallback( "proximity_voice_range", function( name, old, new )
timer.Create( "cfc_proximity_range_write", 0.5, 1, function()
net.Start( "proximity_voice_range_changed" )
net.WriteInt( new, 13 )
net.SendToServer()
end )
end )

hook.Add( "AddToolMenuCategories", "CFC_OptionalAddons_AddMenuCategory", function()
spawnmenu.AddToolCategory( "Options", "CFC", "Proximity Voice" )
end )

local function populatePanel( form )
local enableCheckbox = form:CheckBox( "Enable Proximity Voice", "proximity_voice_enabled" )
enableCheckbox:SetChecked( convarEnabled:GetBool() )

local hearDeadCheckbox = form:CheckBox( "Hear dead players", "proximity_voice_hear_dead" )
hearDeadCheckbox:SetChecked( convarHearDead:GetBool() )

local checkbox3D = form:CheckBox( "3D Sound", "proximity_voice_3D" )
checkbox3D:SetChecked( convar3D:GetBool() )

local rangeSlider = form:NumSlider( "Voice Range", "proximity_voice_range", 500, 2500, 0 )
rangeSlider:SetValue( convarRange:GetInt() )
end

hook.Add( "PopulateToolMenu", "CFC_OptionalAddons_CreateOptionsMenu", function()
spawnmenu.AddToolMenuOption( "Options", "CFC", "proximity_voice", "Proximity Voice", "", "", function( panel )
populatePanel( panel )
end )
end )

hook.Add( "InitPostEntity", "CFC_ProximityVoice_SendConfigToServer", function()
net.Start( "proximity_voice_enabled_changed" )
net.WriteBool( convar:GetBool() )
net.Start( "proximity_voice_settings_changed" )
net.WriteBool( convarEnabled:GetBool() )
net.WriteBool( convarHearDead:GetBool() )
net.WriteBool( convar3D:GetBool() )
net.WriteInt( convarRange:GetInt(), 13 )
net.SendToServer()
end)
end )
73 changes: 58 additions & 15 deletions lua/autorun/server/toggle_voice_init.lua
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
local forceLocalVoiceConvar = CreateConVar("force_proximity_voice", "0", 0,
"force everyone to use local voice")
local forceLocalVoiceConvar = CreateConVar( "force_proximity_voice", "0", 0,
"force everyone to use local voice" )
forceLocalVoice = forceLocalVoiceConvar:GetBool()

cvars.AddChangeCallback("force_proximity_voice", function(convarName, valueOld, valueNew)
cvars.AddChangeCallback( "force_proximity_voice", function( convarName, valueOld, valueNew )
forceLocalVoice = forceLocalVoiceConvar:GetBool()
if forceLocalVoice then
msg = "Forced proximity voice enabled!"
Expand All @@ -13,25 +13,21 @@ cvars.AddChangeCallback("force_proximity_voice", function(convarName, valueOld,
for _, ply in ipairs( player.GetAll() ) do
ply:ChatPrint( msg )
end
end, "force_proximity_voice_callback")

local config = {
CHAT_DISTANCE = 1000,
VOICE_3D = true
}
end, "force_proximity_voice_callback" )

local playerConfig = {}
local playerConfigOverride = {}

local function canHear( listener, speaker )
if not listener:Alive() or not speaker:Alive() then
if not playerConfig[listener].hearDead and ( not listener:Alive() or not speaker:Alive() ) then
return false
end

local speakerPos = speaker:GetPos()
local listenerPos = listener:GetPos()
local playerRange = playerConfig[listener].range or 1000

if listenerPos:DistToSqr( speakerPos ) > config.CHAT_DISTANCE ^ 2 then
if listenerPos:DistToSqr( speakerPos ) > playerRange ^ 2 then
return false
end

Expand All @@ -46,19 +42,66 @@ function ProximityVoiceOverridePlayerConfig( ply, enabled )
end

hook.Add( "PlayerCanHearPlayersVoice", "CFC_ToggleLocalVoice_CanHear", function( listener, speaker )
local shouldUseLocal = forceLocalVoice or playerConfig[listener] or playerConfig[speaker] or playerConfigOverride[listener] or playerConfigOverride[speaker]
local cfgListener = playerConfig[listener] or {}
local cfgSpeaker = playerConfig[listener] or {}
local isPlayerConfig = cfgListener.enabled or cfgSpeaker.enabled
local isOverrideConfig = playerConfigOverride[listener] or playerConfigOverride[speaker]

local shouldUseLocal = forceLocalVoice or isPlayerConfig or isOverrideConfig
if not shouldUseLocal then return end

return canHear( listener, speaker ), config.VOICE_3D
return canHear( listener, speaker ), playerConfig[listener].hear3D
end, HOOK_LOW )

hook.Add( "PlayerDisconnected", "CFC_ProximityVoice_CleanupTables", function(ply)
hook.Add( "PlayerDisconnected", "CFC_ProximityVoice_CleanupTables", function( ply )
playerConfig[ply] = nil
playerConfigOverride[ply] = nil
end )

util.AddNetworkString( "proximity_voice_settings_changed" )
net.Receive( "proximity_voice_settings_changed", function( len, ply )
local enabled = net.ReadBool()
local hearDead = net.ReadBool()
local hear3D = net.ReadBool()
local range = net.ReadInt( 13 )

playerConfig[ply] = playerConfig[ply] or {}
playerConfig[ply] = {
enabled = enabled,
hearDead = hearDead,
hear3D = hear3D,
range = range or 1000,
}
end )

util.AddNetworkString( "proximity_voice_enabled_changed" )
net.Receive( "proximity_voice_enabled_changed", function( len, ply )
local enabled = net.ReadBool()
playerConfig[ply] = enabled or nil

playerConfig[ply] = playerConfig[ply] or {}
playerConfig[ply].enabled = enabled or nil
end )

util.AddNetworkString( "proximity_voice_hear_dead_changed" )
net.Receive( "proximity_voice_hear_dead_changed", function( len, ply )
local hearDead = net.ReadBool()

playerConfig[ply] = playerConfig[ply] or {}
playerConfig[ply].hearDead = hearDead or nil
end )

util.AddNetworkString( "proximity_voice_3D_changed" )
net.Receive( "proximity_voice_3D_changed", function( len, ply )
local hear3D = net.ReadBool()

playerConfig[ply] = playerConfig[ply] or {}
playerConfig[ply].hear3D = hear3D or nil
end )

util.AddNetworkString( "proximity_voice_range_changed" )
net.Receive( "proximity_voice_range_changed", function( len, ply )
local range = net.ReadInt( 13 )

playerConfig[ply] = playerConfig[ply] or {}
playerConfig[ply].range = range or 1000
end )
14 changes: 7 additions & 7 deletions lua/ulx/modules/sh/proximity_voice_commands.lua
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
local function forceProximityVoice( caller, disabled )
if disabled then
RunConsoleCommand("force_proximity_voice", "0")
RunConsoleCommand( "force_proximity_voice", "0" )
ulx.fancyLogAdmin( caller, "#A disabled proximity voice globally" )
else
RunConsoleCommand("force_proximity_voice", "1")
ulx.fancyLogAdmin( caller, "#A enabled proximity voice globally")
RunConsoleCommand( "force_proximity_voice", "1" )
ulx.fancyLogAdmin( caller, "#A enabled proximity voice globally" )
end
end
local proximityGlobal = ulx.command( CATEGORY_NAME, "ulx enableproximityvoice", forceProximityVoice )
proximityGlobal:addParam{ type=ULib.cmds.BoolArg, invisible=true }
proximityGlobal:addParam{ type = ULib.cmds.BoolArg, invisible = true }
proximityGlobal:defaultAccess( ULib.ACCESS_ADMIN )
proximityGlobal:help( "Enable proximity voice for everyone" )
proximityGlobal:setOpposite( "ulx disableproximityvoice", {nil, true} )
proximityGlobal:setOpposite( "ulx disableproximityvoice", { nil, true } )


local function proximityVoiceOverride( caller, targets, enabled )
Expand All @@ -23,7 +23,7 @@ local function proximityVoiceOverride( caller, targets, enabled )
ulx.fancyLogAdmin( caller, "#A #s proximity voice for #T", word, targets )
end
local proximityOverride = ulx.command( CATEGORY_NAME, "ulx overrideproximityvoice", proximityVoiceOverride )
proximityOverride:addParam{ type=ULib.cmds.PlayersArg }
proximityOverride:addParam{ type=ULib.cmds.BoolArg }
proximityOverride:addParam{ type = ULib.cmds.PlayersArg }
proximityOverride:addParam{ type = ULib.cmds.BoolArg }
proximityOverride:defaultAccess( ULib.ACCESS_ADMIN )
proximityOverride:help( "Enable proximity voice for specific players" )