local vrad = true -- Радиус слышимости включён, если true
local dynv = true -- Игроков не слышно, если они за стеной, если true
local voiceDistance = 550 -- Радиус слышимости
local SandBoxCanHear = {}
for _, ply in pairs(player.GetHumans()) do
SandBoxCanHear[ply] = {}
end
local function calcPlyCanHearPlayerVoice(listener)
if not IsValid(listener) then return end
SandBoxCanHear[listener] = SandBoxCanHear[listener] or {}
if listener:IsBot() then return end
local shootPos = listener:GetShootPos()
for _, talker in ipairs(player.GetHumans()) do
local talkerShootPos = talker:GetShootPos()
SandBoxCanHear[listener][talker] = not vrad or
(shootPos:DistToSqr(talkerShootPos) < voiceDistance and -- Игрока слышно, если он находится в радиусе слышимости
(not dynv or IsInRoom(shootPos, talkerShootPos, talker))) -- Игрока не слышно, если он находятся за стеной
end
end
hook.Add("PlayerInitialSpawn", "SandBoxCanHearVoice", function(ply)
calcPlyCanHearPlayerVoice(ply)
if ply:IsBot() then return end
timer.Create(ply:UserID() .. "SandBoxCanHearPlayersVoice", 0.5, 0, fn.Curry(calcPlyCanHearPlayerVoice, 2)(ply))
end)