45 lines
1.2 KiB
Lua
45 lines
1.2 KiB
Lua
local meta = FindMetaTable( "Entity" )
|
|
|
|
if not meta then return end
|
|
|
|
function meta:SetDamageOwner(ply)
|
|
self.dmg_owner = {ply = ply, t = CurTime()}
|
|
end
|
|
|
|
function meta:GetDamageOwner()
|
|
if self.dmg_owner then
|
|
return self.dmg_owner.ply, self.dmg_owner.t
|
|
end
|
|
end
|
|
|
|
function meta:IsExplosive()
|
|
local kv = self:GetKeyValues()["ExplodeDamage"]
|
|
return self:Health() > 0 and kv and kv > 0
|
|
end
|
|
|
|
-- Some sounds are important enough that they shouldn't be affected by CPASAttenuationFilter
|
|
function meta:BroadcastSound(snd, lvl, pitch, vol, channel, flags, dsp)
|
|
lvl = lvl or 75
|
|
|
|
local rf = RecipientFilter()
|
|
|
|
if lvl == 0 then
|
|
rf:AddAllPlayers()
|
|
else
|
|
-- Overriding the PAS filter means this will no longer check if players
|
|
-- are within audible range before sending them the sound message.
|
|
-- Instead, we reimplement this check in lua.
|
|
local pos = self:GetPos()
|
|
|
|
local attenuation = lvl > 50 and 20.0 / (lvl - 50) or 4.0
|
|
local maxAudible = math.min(2500, 2000 / attenuation)
|
|
|
|
for _, ply in player.Iterator() do
|
|
if (ply:EyePos() - pos):Length() > maxAudible then continue end
|
|
|
|
rf:AddPlayer(ply)
|
|
end
|
|
end
|
|
|
|
self:EmitSound(snd, lvl, pitch, vol, channel, flags, dsp, rf)
|
|
end |