94 lines
2.8 KiB
Lua
Raw Normal View History

2025-04-07 01:41:12 +00:00
local function loadAudioBank(audioBank)
if not audioBank then return end
local timeout = 500
while not RequestScriptAudioBank(audioBank, false) do
if timeout == 0 then
return false
else
timeout -= 1
end
Wait(0)
end
return true
end
local function releaseAudioBank(audioBank)
if not audioBank then return end
ReleaseNamedScriptAudioBank(audioBank)
end
---@class PlaySoundParams
---@field audioBank? string
---@field audioName string|string[]
---@field audioRef string
local function playSound(data)
if type(data.audioName) == 'string' then
data.audioName = {data.audioName}
end
loadAudioBank(data.audioBank)
for i = 1, #data.audioName do
local audioName = data.audioName[i]
local soundId = GetSoundId()
PlaySoundFrontend(soundId, audioName, data.audioRef, false)
ReleaseSoundId(soundId)
end
releaseAudioBank(data.audioBank)
end
exports('PlaySound', playSound)
RegisterNetEvent('mana_audio:client:playSound', playSound)
---@class PlaySoundFromEntityParams: PlaySoundParams
---@field entity number
---@param data PlaySoundFromEntityParams
local function playSoundFromEntity(data)
if not DoesEntityExist(data.entity) then return end
if type(data.audioName) == 'string' then
data.audioName = {data.audioName}
end
loadAudioBank(data.audioBank)
for i = 1, #data.audioName do
local audioName = data.audioName[i]
local soundId = GetSoundId()
PlaySoundFromEntity(soundId, audioName, data.entity, data.audioRef, false, false)
ReleaseSoundId(soundId)
end
releaseAudioBank(data.audioBank)
end
exports('PlaySoundFromEntity', playSoundFromEntity)
RegisterNetEvent('mana_audio:client:playSoundFromEntity', function(data)
if not NetworkDoesEntityExistWithNetworkId(data.netId) then return end
playSoundFromEntity({
audioBank = data.audioBank,
audioName = data.audioName,
audioRef = data.audioRef,
entity = NetworkGetEntityFromNetworkId(data.netId),
})
end)
---@class PlaySoundFromCoordsParams: PlaySoundParams
---@field coords vector3
---@field range number
---@param data PlaySoundFromCoordsParams
local function playSoundFromCoords(data)
if type(data.audioName) == 'string' then
data.audioName = {data.audioName}
end
loadAudioBank(data.audioBank)
for i = 1, #data.audioName do
local audioName = data.audioName[i]
local soundId = GetSoundId()
PlaySoundFromCoord(soundId, audioName, data.coords.x, data.coords.y, data.coords.z, data.audioRef, false, data.range, false)
ReleaseSoundId(soundId)
end
releaseAudioBank(data.audioBank)
end
exports('PlaySoundFromCoords', playSoundFromCoords)
RegisterNetEvent('mana_audio:client:playSoundFromCoords', playSoundFromCoords)