engine/bin/data/entities/scripts/ambient_generic.lua

68 lines
1.7 KiB
Lua

local ent = ent
local metadata = ent:getComponent("Metadata")
local metadataVale = metadata["valve"] or {}
local soundFile = metadataVale["message"] or ""
local flags = metadataVale["spawnflags"] or 0
local volume = tonumber(metadataVale["health"]) or 10.0
volume = volume / 10.0
local playEverywhere = (math.floor(flags / 1) % 2) ~= 0
local startSilent = (math.floor(flags / 16) % 2) ~= 0
local isNotLooped = (math.floor(flags / 32) % 2) ~= 0
local isPlaying = false
local function playSound()
if isPlaying or soundFile == "" then return end
isPlaying = true
local url = "valve://sound/" .. soundFile
local payload = {
filename = string.resolveURI(url, metadata["system"]["root"]),
spatial = not playEverywhere,
streamed = true,
volume = volume,
unique = true
}
payload["wants loops"] = not isNotLooped
ent:callHook("sound:Emit.%UID%", payload)
end
local function stopSound()
if not isPlaying or soundFile == "" then return end
isPlaying = false
local url = "valve://sound/" .. soundFile
ent:callHook("sound:Stop.%UID%", {
filename = string.resolveURI(url, metadata["system"]["root"])
})
end
ent:addHook("io:Input.%UID%", function(payload)
local input = payload.input
if input == "PlaySound" then
playSound()
elseif input == "StopSound" then
stopSound()
elseif input == "ToggleSound" then
if isPlaying then
stopSound()
else
playSound()
end
elseif input == "Volume" then
local newVol = tonumber(payload.parameter)
if newVol then
volume = newVol / 10.0
-- to-do: update volume of currently playing sound
end
end
end)
if not startSilent then
playSound()
end