Files
wnsrc/lua/entities/lvs_soundemitter.lua
lifestorm 9c918c46e5 Upload
2024-08-04 23:12:27 +03:00

229 lines
5.0 KiB
Lua

--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
AddCSLuaFile()
ENT.Type = "anim"
ENT.Spawnable = false
ENT.AdminSpawnable = false
ENT.DoNotDuplicate = true
ENT._LVS = true
function ENT:SetupDataTables()
self:NetworkVar( "Entity",0, "Base" )
self:NetworkVar( "Bool",0, "Active" )
self:NetworkVar( "Bool",1, "ActiveVisible" )
self:NetworkVar( "Bool",2, "Doppler" )
self:NetworkVar( "String",1, "Sound")
self:NetworkVar( "String",2, "SoundInterior")
self:NetworkVar( "Int",0, "SoundLevel" )
if SERVER then
self:SetSoundLevel( 110 )
self:SetActiveVisible( true )
end
end
if SERVER then
util.AddNetworkString( "lvs_soundemitter_playonce" )
function ENT:Initialize()
self:SetMoveType( MOVETYPE_NONE )
self:SetSolid( SOLID_NONE )
self:DrawShadow( false )
debugoverlay.Cross( self:GetPos(), 50, 5, Color( 150, 150, 150 ) )
end
function ENT:Think()
return false
end
function ENT:UpdateTransmitState()
return TRANSMIT_ALWAYS
end
function ENT:PlayOnce( pitch, volume )
net.Start( "lvs_soundemitter_playonce", true )
net.WriteEntity( self )
net.WriteInt( pitch or 100, 9 )
net.WriteFloat( volume or 1 )
net.SendPVS( self:GetPos() )
end
function ENT:Play()
self:SetActive( true )
end
function ENT:Stop()
self:SetActive( false )
end
return
end
net.Receive( "lvs_soundemitter_playonce", function( len )
local ent = net.ReadEntity()
if not IsValid( ent ) or not ent.PlayOnce then return end
ent:PlayOnce( net.ReadInt( 9 ), net.ReadFloat() )
end )
function ENT:PlayOnce( pitch, volume )
local ply = LocalPlayer()
local veh = ply:lvsGetVehicle()
local snd = self:GetSound()
local snd_int = self:GetSoundInterior()
if snd == snd_int then self:EmitSound( snd, self:GetSoundLevel(), pitch, volume, CHAN_WEAPON ) return end
if IsValid( veh ) and veh == self:GetBase() and ply:GetViewEntity() == ply then
local pod = ply:GetVehicle()
if IsValid( pod ) then
if pod:GetThirdPersonMode() then
self:EmitSound( snd, self:GetSoundLevel(), pitch, volume, CHAN_WEAPON )
else
self:EmitSound( snd_int, self:GetSoundLevel(), pitch, volume, CHAN_WEAPON )
end
else
self:EmitSound( snd, self:GetSoundLevel(), pitch, volume, CHAN_WEAPON )
end
else
self:EmitSound( snd, self:GetSoundLevel(), pitch, volume, CHAN_WEAPON )
end
end
function ENT:Initialize()
end
function ENT:RemoveSounds()
if self.snd then
self.snd:Stop()
self.snd = nil
end
if self.snd_int then
self.snd_int:Stop()
self.snd_int = nil
end
end
function ENT:HandleSounds()
local ply = LocalPlayer()
local veh = ply:lvsGetVehicle()
local base = self:GetBase()
if self:GetDoppler() and IsValid( base ) then
local Doppler = base:CalcDoppler( ply )
if self.snd then self.snd:ChangePitch( 100 * Doppler, 0.5 ) end
if self.snd_int then self.snd_int:ChangePitch( 100 * Doppler, 0.5 ) end
end
if not self.snd_int then return end
if IsValid( veh ) and veh == base and ply:GetViewEntity() == ply then
local pod = ply:GetVehicle()
if IsValid( pod ) then
if pod:GetThirdPersonMode() then
if self.snd then self.snd:ChangeVolume( 1 ) end
if self.snd_int then self.snd_int:ChangeVolume( 0 ) end
else
if self.snd then self.snd:ChangeVolume( 0 ) end
if self.snd_int then self.snd_int:ChangeVolume( 1 ) end
end
else
if self.snd then self.snd:ChangeVolume( 1 ) end
if self.snd_int then self.snd_int:ChangeVolume( 0 ) end
end
else
if self.snd then self.snd:ChangeVolume( 1 ) end
if self.snd_int then self.snd_int:ChangeVolume( 0 ) end
end
end
function ENT:StartSounds()
local snd = self:GetSound()
local snd_int = self:GetSoundInterior()
if snd ~= "" then
self.snd = CreateSound( self, snd )
self.snd:SetSoundLevel( self:GetSoundLevel() )
self.snd:PlayEx(0,100)
end
if snd == snd_int or snd_int == "" or LocalPlayer():lvsGetVehicle() ~= self:GetBase() then
if self.snd then self.snd:ChangeVolume( 1, 0 ) end
return
end
self.snd_int = CreateSound( self, snd_int )
self.snd_int:SetSoundLevel( self:GetSoundLevel() )
self.snd_int:PlayEx(0,100)
end
function ENT:StopSounds()
self.NextActive = CurTime() + 0.12
if self.snd then
self.snd:ChangeVolume( 0, 0.1 )
end
if self.snd_int then
self.snd_int:ChangeVolume( 0, 0.1 )
end
timer.Simple(0.11, function()
if not IsValid( self ) then return end
self:RemoveSounds()
end)
end
function ENT:OnActiveChanged( Active )
if Active then
self:StartSounds()
else
self:StopSounds()
end
end
ENT._oldActive = false
function ENT:Think()
local Active = self:GetActive() and (self.NextActive or 0) < CurTime()
if self._oldActive ~= Active then
self._oldActive = Active
self:OnActiveChanged( Active )
end
if Active then
self:HandleSounds()
end
end
function ENT:OnRemove()
self:RemoveSounds()
end
function ENT:Draw()
end
function ENT:DrawTranslucent()
end