ACF_CustomMod/lua/weapons/gmod_tool/stools/acfsoundcustom.lua

272 lines
7.9 KiB
Lua

local cat = ((ACFCUSTOM.CustomToolCategory and ACFCUSTOM.CustomToolCategory:GetBool()) and "ACF" or "Construction");
TOOL.Category = cat
TOOL.Name = "#Tool.acfsoundcustom.name"
TOOL.Command = nil
TOOL.ConfigName = ""
TOOL.ClientConVar["pitch"] = "1"
if CLIENT then
language.Add( "Tool.acfsoundcustom.name", "ACF Custom Sound Replacer" )
language.Add( "Tool.acfsoundcustom.desc", "Change sound of customs engines." )
language.Add( "Tool.acfsoundcustom.0", "Left click to apply sound. Right click to copy sound. Reload to set default sound." )
end
ACFCUSTOM.SoundToolSupport = {
acf_supercharger = {
GetSound = function(ent) return {Sound = ent.Sound} end,
SetSound = function(ent, soundData)
ent.Sound = soundData.Sound
ent:SetNWString( "Sound", soundData.Sound )
end,
ResetSound = function(ent)
local Id = ent.Id
local List = list.Get("ACFCUSTOMEnts")
local soundData = {Sound = List["MobilityCustom"][Id]["sound"]}
local setSound = ACFCUSTOM.SoundToolSupport["acf_supercharger"].SetSound
setSound( ent, soundData )
end
},
acf_turbo = {
GetSound = function(ent) return {Sound = ent.Sound} end,
SetSound = function(ent, soundData)
ent.Sound = soundData.Sound
ent:SetNWString( "Sound", soundData.Sound )
end,
ResetSound = function(ent)
local Id = ent.Id
local List = list.Get("ACFCUSTOMEnts")
local soundData = {Sound = List["MobilityCustom"][Id]["sound"]}
local setSound = ACFCUSTOM.SoundToolSupport["acf_turbo"].SetSound
setSound( ent, soundData )
end
},
acf_engine_custom = {
GetSound = function(ent) return {Sound = ent.SoundPath, Pitch = ent.SoundPitch} end,
SetSound = function(ent, soundData)
ent.SoundPath = soundData.Sound
ent.SoundPitch = soundData.Pitch
end,
ResetSound = function(ent)
local Id = ent.Id
local List = list.Get("ACFCUSTOMEnts")
local pitch = List["MobilityCustom"][Id]["pitch"] or 1
local soundData = {Sound = List["MobilityCustom"][Id]["sound"], Pitch = pitch}
local setSound = ACFCUSTOM.SoundToolSupport["acf_engine_custom"].SetSound
setSound( ent, soundData )
end
},
acf_engine_maker = {
GetSound = function(ent) return {Sound = ent.SoundPath, Pitch = ent.SoundPitch} end,
SetSound = function(ent, soundData)
ent.SoundPath = soundData.Sound
ent.SoundPitch = soundData.Pitch
end,
ResetSound = function(ent)
local Id = ent.Id
local List = list.Get("ACFCUSTOMEnts")
local pitch = List["MobilityCustom"][Id]["pitch"] or 1
local soundData = {Sound = List["MobilityCustom"][Id]["sound"], Pitch = pitch}
local setSound = ACFCUSTOM.SoundToolSupport["acf_engine_maker"].SetSound
setSound( ent, soundData )
end
},
acf_gun = {
GetSound = function(ent) return {Sound = ent.Sound} end,
SetSound = function(ent, soundData)
ent.Sound = soundData.Sound
ent:SetNWString( "Sound", soundData.Sound )
end,
ResetSound = function(ent)
local Class = ent.Class
local Classes = list.Get("ACFClasses")
local soundData = {Sound = Classes["GunClass"][Class]["sound"]}
local setSound = ACFCUSTOM.SoundToolSupport["acf_gun"].SetSound
setSound( ent, soundData )
end
},
acf_engine = {
GetSound = function(ent) return {Sound = ent.SoundPath, Pitch = ent.SoundPitch} end,
SetSound = function(ent, soundData)
ent.SoundPath = soundData.Sound
ent.SoundPitch = soundData.Pitch
end,
ResetSound = function(ent)
local Id = ent.Id
local List = list.Get("ACFEnts")
local pitch = List["Mobility"][Id]["pitch"] or 1
local soundData = {Sound = List["Mobility"][Id]["sound"], Pitch = pitch}
local setSound = ACFCUSTOM.SoundToolSupport["acf_engine"].SetSound
setSound( ent, soundData )
end
},
}
local function ReplaceSound( ply , Entity , data)
if !IsValid( Entity ) then return end
local sound = data[1]
local pitch = data[2] or 1
timer.Simple(1, function()
local class = Entity:GetClass()
local support = ACFCUSTOM.SoundToolSupport[class]
if not support then return end
support.SetSound(Entity, {Sound = sound, Pitch = pitch})
end)
duplicator.StoreEntityModifier( Entity, "acf_replacesound", {sound} )
end
duplicator.RegisterEntityModifier( "acf_replacesound", ReplaceSound )
local function IsReallyValid(trace, ply)
local isValid = true
if not trace.Entity:IsValid() then return false end
if trace.Entity:IsPlayer() then return false end
if SERVER and not trace.Entity:GetPhysicsObject():IsValid() then return false end
local class = trace.Entity:GetClass()
if not ACFCUSTOM.SoundToolSupport[class] then
if string.StartWith(class, "acf_") then
ACFCUSTOM_SendNotify( ply, false, class .. " is not supported by the sound tool!" )
else
ACFCUSTOM_SendNotify( ply, false, "Only ACF entities are supported by the ACF sound tool!" )
end
return false
end
return true
end
function TOOL:LeftClick( trace )
if CLIENT then return true end
if not IsReallyValid( trace, self:GetOwner() ) then return false end
local sound = self:GetOwner():GetInfo("wire_soundemitter_sound")
local pitch = self:GetOwner():GetInfo("acfsoundcustom_pitch")
ReplaceSound( self:GetOwner(), trace.Entity, {sound, pitch} )
return true
end
function TOOL:RightClick( trace )
if CLIENT then return true end
if not IsReallyValid( trace, self:GetOwner() ) then return false end
local class = trace.Entity:GetClass()
local support = ACFCUSTOM.SoundToolSupport[class]
if not support then return false end
local soundData = support.GetSound(trace.Entity)
self:GetOwner():ConCommand("wire_soundemitter_sound "..soundData.Sound);
if soundData.Pitch then
self:GetOwner():ConCommand("acfsoundcustom_pitch "..soundData.Pitch);
end
return true
end
function TOOL:Reload( trace )
if CLIENT then return true end
if not IsReallyValid( trace, self:GetOwner() ) then return false end
local class = trace.Entity:GetClass()
local support = ACFCUSTOM.SoundToolSupport[class]
if not support then return false end
support.ResetSound(trace.Entity)
return true
end
function TOOL.BuildCPanel(panel)
local wide = panel:GetWide()
local SoundNameText = vgui.Create("DTextEntry", ValuePanel)
SoundNameText:SetText("")
SoundNameText:SetWide(wide)
SoundNameText:SetTall(20)
SoundNameText:SetMultiline(false)
SoundNameText:SetConVar("wire_soundemitter_sound")
SoundNameText:SetVisible(true)
panel:AddItem(SoundNameText)
local SoundBrowserButton = vgui.Create("DButton")
SoundBrowserButton:SetText("Open Sound Browser")
SoundBrowserButton:SetWide(wide)
SoundBrowserButton:SetTall(20)
SoundBrowserButton:SetVisible(true)
SoundBrowserButton.DoClick = function()
RunConsoleCommand("wire_sound_browser_open",SoundNameText:GetValue())
end
panel:AddItem(SoundBrowserButton)
local SoundPre = vgui.Create("DPanel")
SoundPre:SetWide(wide)
SoundPre:SetTall(20)
SoundPre:SetVisible(true)
local SoundPreWide = SoundPre:GetWide()
local SoundPrePlay = vgui.Create("DButton", SoundPre)
SoundPrePlay:SetText("Play")
SoundPrePlay:SetWide(SoundPreWide / 2)
SoundPrePlay:SetPos(0, 0)
SoundPrePlay:SetTall(20)
SoundPrePlay:SetVisible(true)
SoundPrePlay.DoClick = function()
RunConsoleCommand("play",SoundNameText:GetValue())
end
local SoundPreStop = vgui.Create("DButton", SoundPre)
SoundPreStop:SetText("Stop")
SoundPreStop:SetWide(SoundPreWide / 2)
SoundPreStop:SetPos(SoundPreWide / 2, 0)
SoundPreStop:SetTall(20)
SoundPreStop:SetVisible(true)
SoundPreStop.DoClick = function()
RunConsoleCommand("play", "common/NULL.WAV") //Playing a silent sound will mute the preview but not the sound emitters.
end
panel:AddItem(SoundPre)
SoundPre:InvalidateLayout(true)
SoundPre.PerformLayout = function()
local SoundPreWide = SoundPre:GetWide()
SoundPrePlay:SetWide(SoundPreWide / 2)
SoundPreStop:SetWide(SoundPreWide / 2)
SoundPreStop:SetPos(SoundPreWide / 2, 0)
end
panel:AddControl("Slider", {
Label = "Pitch:",
Command = "acfsoundcustom_pitch",
Type = "Float",
Min = "0.1",
Max = "2",
}):SetTooltip("Works only for engines.")
end