152 lines
		
	
	
		
			No EOL
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			152 lines
		
	
	
		
			No EOL
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
globalOptionsCache = {}
 | 
						|
isPlayerCloseToMusic = false
 | 
						|
disableMusic = false
 | 
						|
 | 
						|
function getDefaultInfo()
 | 
						|
    return {
 | 
						|
        volume = 1.0,
 | 
						|
        url = "",
 | 
						|
        id = "",
 | 
						|
        position = nil,
 | 
						|
        distance = 10,
 | 
						|
        playing = false,
 | 
						|
        paused = false,
 | 
						|
        loop = false,
 | 
						|
        isDynamic = false,
 | 
						|
        timeStamp = 0,
 | 
						|
        maxDuration = 0,
 | 
						|
        destroyOnFinish = true,
 | 
						|
    }
 | 
						|
end
 | 
						|
 | 
						|
function UpdatePlayerPositionInNUI()
 | 
						|
    local ped = PlayerPedId()
 | 
						|
    local pos = GetEntityCoords(ped)
 | 
						|
 | 
						|
    SendNUIMessage({
 | 
						|
        status = "position",
 | 
						|
        x = pos.x,
 | 
						|
        y = pos.y,
 | 
						|
        z = pos.z
 | 
						|
    })
 | 
						|
end
 | 
						|
 | 
						|
function CheckForCloseMusic()
 | 
						|
    local ped = PlayerPedId()
 | 
						|
    local playerPos = GetEntityCoords(ped)
 | 
						|
    isPlayerCloseToMusic = false
 | 
						|
    for k, v in pairs(soundInfo) do
 | 
						|
        if v.position ~= nil and v.isDynamic then
 | 
						|
            if #(v.position - playerPos) < v.distance + config.distanceBeforeUpdatingPos then
 | 
						|
                isPlayerCloseToMusic = true
 | 
						|
                break
 | 
						|
            end
 | 
						|
        end
 | 
						|
    end
 | 
						|
end
 | 
						|
 | 
						|
-- updating position on html side so we can count how much volume the sound needs.
 | 
						|
CreateThread(function()
 | 
						|
    local refresh = config.RefreshTime
 | 
						|
    local ped = PlayerPedId()
 | 
						|
    local pos = GetEntityCoords(ped)
 | 
						|
    local lastPos = pos
 | 
						|
    local changedPosition = false
 | 
						|
    while true do
 | 
						|
        Wait(refresh)
 | 
						|
        if not disableMusic and isPlayerCloseToMusic then
 | 
						|
            ped = PlayerPedId()
 | 
						|
            pos = GetEntityCoords(ped)
 | 
						|
 | 
						|
            -- we will update position only when player have moved
 | 
						|
            if #(lastPos - pos) >= 0.1 then
 | 
						|
                lastPos = pos
 | 
						|
                UpdatePlayerPositionInNUI()
 | 
						|
            end
 | 
						|
 | 
						|
            if changedPosition then
 | 
						|
                UpdatePlayerPositionInNUI()
 | 
						|
                SendNUIMessage({ status = "unmuteAll" })
 | 
						|
            end
 | 
						|
            changedPosition = false
 | 
						|
        else
 | 
						|
            if not changedPosition then
 | 
						|
                changedPosition = true
 | 
						|
                SendNUIMessage({ status = "position", x = -900000, y = -900000, z = -900000 })
 | 
						|
                SendNUIMessage({ status = "muteAll" })
 | 
						|
            end
 | 
						|
            Wait(1000)
 | 
						|
        end
 | 
						|
    end
 | 
						|
end)
 | 
						|
 | 
						|
-- checking if player is close to sound so we can switch bool value to true.
 | 
						|
CreateThread(function()
 | 
						|
    while true do
 | 
						|
        Wait(500)
 | 
						|
        CheckForCloseMusic()
 | 
						|
    end
 | 
						|
end)
 | 
						|
 | 
						|
-- updating timeStamp
 | 
						|
CreateThread(function()
 | 
						|
    Wait(1100)
 | 
						|
 | 
						|
    while true do
 | 
						|
        Wait(1000)
 | 
						|
        for k, v in pairs(soundInfo) do
 | 
						|
            if v.playing or v.wasSilented then
 | 
						|
                if getInfo(v.id).timeStamp ~= nil and getInfo(v.id).maxDuration ~= nil then
 | 
						|
                    if getInfo(v.id).timeStamp < getInfo(v.id).maxDuration then
 | 
						|
                        getInfo(v.id).timeStamp = getInfo(v.id).timeStamp + 1
 | 
						|
                    end
 | 
						|
                end
 | 
						|
            end
 | 
						|
        end
 | 
						|
    end
 | 
						|
end)
 | 
						|
 | 
						|
function PlayMusicFromCache(data)
 | 
						|
    local musicCache = soundInfo[data.id]
 | 
						|
    if musicCache then
 | 
						|
        musicCache.SkipEvents = true
 | 
						|
        musicCache.SkipTimeStamp = true
 | 
						|
 | 
						|
        PlayUrlPosSilent(data.id, data.url, data.volume, data.position, data.loop)
 | 
						|
        onPlayStartSilent(data.id, function()
 | 
						|
            if getInfo(data.id).maxDuration then
 | 
						|
                setTimeStamp(data.id, data.timeStamp or 0)
 | 
						|
            end
 | 
						|
            Distance(data.id, data.distance)
 | 
						|
        end)
 | 
						|
    end
 | 
						|
end
 | 
						|
 | 
						|
-- If player is far away from music we will just delete it.
 | 
						|
CreateThread(function()
 | 
						|
    local ped = PlayerPedId()
 | 
						|
    local playerPos = GetEntityCoords(ped)
 | 
						|
    local destroyedMusicList = {}
 | 
						|
    while true do
 | 
						|
        Wait(500)
 | 
						|
        ped = PlayerPedId()
 | 
						|
        playerPos = GetEntityCoords(ped)
 | 
						|
        for k, v in pairs(soundInfo) do
 | 
						|
            if v.position ~= nil and v.isDynamic then
 | 
						|
                if #(v.position - playerPos) < (v.distance + config.distanceBeforeUpdatingPos) then
 | 
						|
                    if destroyedMusicList[v.id] then
 | 
						|
                        destroyedMusicList[v.id] = nil
 | 
						|
                        v.wasSilented = true
 | 
						|
                        PlayMusicFromCache(v)
 | 
						|
                    end
 | 
						|
                else
 | 
						|
                    if not destroyedMusicList[v.id] then
 | 
						|
                        destroyedMusicList[v.id] = true
 | 
						|
                        v.wasSilented = false
 | 
						|
                        DestroySilent(v.id)
 | 
						|
                    end
 | 
						|
                end
 | 
						|
            end
 | 
						|
        end
 | 
						|
    end
 | 
						|
end) |