[2022-06-11 15:18:43] WARNING: radio\cVehRadio3D.lua:67: Bad argument @ 'stopSound' [Expected sound at argument 1, got nil] 
	 
	``` 
	client: 
	 
 
	radioSound = { }
 
	addEventHandler("onClientResourceStart", resourceRoot, 
	    function() 
	        bindKey("r", "down", clientToggleRadio) 
	        bindKey("mouse_wheel_up", "down", volumeUp) 
	        bindKey("mouse_wheel_down", "down", volumeDown) 
	    end 
	)
 
	addEventHandler("onClientVehicleEnter", root, 
	    function(thePlayer, seat) 
	        if thePlayer == getLocalPlayer() then 
	            local msg = "Aperte 'R' para ligar a Radio." 
	            if radioSound[source] == nil then 
	                outputChatBox(msg, 124, 252, 0) 
	            else 
	                if radioSound[source].soundElement == nil then 
	                    outputChatBox(msg, 124, 252, 0) 
	                end 
	            end 
	        end 
	    end 
	)
 
	addEventHandler("onClientSoundStream", root, 
	    function(success, length, streamName) 
	        if streamName then 
	            local veh = getPedOccupiedVehicle(getLocalPlayer()) 
	            if veh then 
	                if radioSound[veh] == nil then return end 
	                if radioSound[veh].soundElement == source then 
	                    outputChatBox("#696969Rádio: #22AA22 " .. streamName, 0, 0, 0, true) 
	                end 
	            end 
	        end 
	    end 
	) 
	addEventHandler("onClientSoundChangedMeta", root, 
	    function(streamTitle) 
	        if streamTitle then 
	            local veh = getPedOccupiedVehicle(getLocalPlayer()) 
	            if veh then 
	                if radioSound[veh] == nil then return end 
	                if radioSound[veh].soundElement == source then 
	                    outputChatBox("#696969Música: #AA2222 " .. streamTitle, 0, 0, 0, true) 
	                end 
	            end 
	        end 
	    end 
	)
 
	addEvent("onServerToggleRadio", true) 
	addEventHandler("onServerToggleRadio", getLocalPlayer(),  
	    function(toggle, url, veh, volume)     
	        if not isElement(veh) then 
	            if radioSound[veh] ~= nil then 
	                stopSound(radioSound[veh].soundElement) 
	                radioSound[veh].soundElement = nil 
	            end 
	            return 
	        end 
	         
	        if toggle == true then 
	            local x, y, z = getElementPosition(veh) 
	            if radioSound[veh] ~= nil then 
	                stopSound(radioSound[veh].soundElement)
 
	                local sound = playSound3D(url, x, y, z) 
	                if volume ~= nil then 
	                    setSoundVolume(sound, volume) 
	                end 
	                setSoundMinDistance(sound, 6.0) 
	                setSoundMaxDistance(sound, 75.0) 
	                attachElements(sound, veh) 
	                 
	                radioSound[veh] = { } 
	                radioSound[veh].soundElement = sound 
	            else 
	                local sound = playSound3D(url, x, y, z) 
	                if volume ~= nil then 
	                    setSoundVolume(sound, volume) 
	                end 
	                setSoundMinDistance(sound, 6.0) 
	                setSoundMaxDistance(sound, 75.0) 
	                attachElements(sound, veh) 
	                 
	                radioSound[veh] = { } 
	                radioSound[veh].soundElement = sound 
	            end 
	        else 
	            if radioSound[veh] ~= nil then 
	                stopSound(radioSound[veh].soundElement) 
	                radioSound[veh].soundElement = nil 
	            end 
	        end 
	    end 
	)
 
	addEvent("onServerRadioURLChange", true) 
	addEventHandler("onServerRadioURLChange", getLocalPlayer(),  
	    function(newurl, veh, volume) 
	        if radioSound[veh] ~= nil then 
	            stopSound(radioSound[veh].soundElement) 
	         
	            local x, y, z = getElementPosition(veh) 
	            local sound = playSound3D(newurl, x, y, z) 
	            if volume ~= nil then 
	                setSoundVolume(sound, volume) 
	            end 
	            setSoundMinDistance(radioSound, 6.) 
	            setSoundMaxDistance(radioSound, 75.0) 
	            attachElements(sound, veh) 
	         
	            radioSound[veh] = { } 
	            radioSound[veh].soundElement = sound 
	        end 
	    end 
	)
 
	addEvent("onServerVolumeChangeAccept", true) 
	addEventHandler("onServerVolumeChangeAccept", getLocalPlayer(),  
	    function(veh, newVolume) 
	        if veh then 
	            if radioSound[veh] ~= nil then 
	                setSoundVolume(radioSound[veh].soundElement, newVolume) 
	            end 
	        end 
	    end 
	)
 
	function clientToggleRadio() 
	    triggerServerEvent("onPlayerToggleRadio", getLocalPlayer()) 
	end
 
	function volumeUp() 
	    local veh = getPedOccupiedVehicle(getLocalPlayer()) 
	    if veh then 
	        if radioSound[veh] ~= nil then 
	            local volume = getSoundVolume(radioSound[veh].soundElement) 
	            if volume ~= false then 
	                triggerServerEvent("onPlayerRadioVolumeChange", getLocalPlayer(), volume, true) 
	            end 
	        end 
	    end 
	end
 
	function volumeDown() 
	    local veh = getPedOccupiedVehicle(getLocalPlayer()) 
	    if veh then 
	        if radioSound[veh] ~= nil then 
	            local volume = getSoundVolume(radioSound[veh].soundElement) 
	            if volume ~= false then 
	                triggerServerEvent("onPlayerRadioVolumeChange", getLocalPlayer(), volume, false) 
	            end 
	        end 
	    end 
	end 
	 
	 
	 
	 
	 
	Server: 
	 
 
	g_VehicleList = {}
 
	local radioStreams = 0 
	local defaultRadio = "http://173.208.166.12:8056/" 
	local defaultRadio = "http://173.208.166.12:8056/"
 
	addEventHandler("onResourceStart", resourceRoot, 
	    function()     
	        for i,veh in ipairs(getElementsByType("vehicle")) do 
	            g_VehicleList[veh] = { } 
	            g_VehicleList[veh].radio = false 
	            g_VehicleList[veh].radioStation = defaultRadio 
	            g_VehicleList[veh].volume = 4.0 
	        end 
	    end 
	)
 
	addEventHandler("onPlayerJoin", root, 
	    function()         
	        for i,veh in ipairs(getElementsByType("vehicle")) do 
	            if g_VehicleList[veh] ~= nil then 
	                if g_VehicleList[veh].radio == true then 
	                    triggerClientEvent(source, "onServerToggleRadio", root, true, g_VehicleList[veh].radioStation, veh, g_VehicleList[veh].volume) 
	                end 
	            end 
	        end 
	    end 
	)
 
	addEventHandler("onVehicleExplode", root, 
	    function() 
	        if g_VehicleList[source] ~= nil then 
	            if g_VehicleList[source].radio == true then 
	                triggerClientEvent("onServerToggleRadio", root, false, nil, source) 
	                g_VehicleList[source].radio = false 
	                destroyElement(g_VehicleList[source].radioMarker) 
	                killTimer(g_VehicleList[source].idleTimer) 
	                if radioStreams ~= 0 then 
	                    radioStreams = radioStreams - 1 
	                end 
	            end 
	        end 
	    end 
	)
 
	addEventHandler("onElementDestroy", root, 
	    function() 
	        if g_VehicleList[source] ~= nil then 
	            if g_VehicleList[source].radio == true then 
	                triggerClientEvent("onServerToggleRadio", root, false, nil, source) 
	                g_VehicleList[source].radio = false 
	                destroyElement(g_VehicleList[source].radioMarker) 
	                killTimer(g_VehicleList[source].idleTimer) 
	                if radioStreams ~= 0 then 
	                    radioStreams = radioStreams - 1 
	                end 
	            end 
	        end 
	    end 
	)
 
	addEvent("onPlayerToggleRadio", true) 
	addEventHandler("onPlayerToggleRadio", root, 
	    function() 
	        if source and getElementType(source) == "player" then 
	            toggleRadio(source) 
	        end 
	    end 
	)
 
	function toggleRadio(player) 
	    local veh = getPedOccupiedVehicle(player) 
	    if veh then 
	        local occupants = getVehicleOccupants(veh) 
	        local seats = getVehicleMaxPassengers(veh) 
	         
	        local playerSeat = getPedOccupiedVehicleSeat(player) 
	        if playerSeat ~= 0 and playerSeat ~= 1 then 
	            outputChatBox("Voce nao pode mudar a radio.", player, 255, 255, 255) 
	            return 
	        end
 
	        if g_VehicleList[veh] == nil then 
	            g_VehicleList[veh] = { } 
	            g_VehicleList[veh].radio = false 
	            g_VehicleList[veh].radioStation = defaultRadio 
	            g_VehicleList[veh].volume = 1.0 
	        end 
	         
	        if g_VehicleList[veh].radio == false then 
	            if not get("toggleAntifloodTick") or not get("streamLimit") or not get("radioEnabledIdleTime") then return end
 
	            local settingToggleAntifloodTick = get("toggleAntifloodTick") 
	            local settingStreamLimit = get("streamLimit") 
	            local idleTime = get("radioEnabledIdleTime") 
	             
	            if g_VehicleList[veh].lastTick and (getTickCount() - g_VehicleList[veh].lastTick) <= settingToggleAntifloodTick then return end
 
	            if radioStreams >= settingStreamLimit then 
	                outputChatBox("Limite de ouvintes chegou ao maximo (" .. settingStreamLimit .. ")", player, 255, 255, 255) 
	                return 
	            end 
	             
	            local x, y, z = getElementPosition(veh) 
	            g_VehicleList[veh].radio = true 
	            g_VehicleList[veh].lastTick = getTickCount() 
	            g_VehicleList[veh].turnedOnBy = getPlayerName(player) 
	            g_VehicleList[veh].radioMarker = createMarker(x, y, z, "corona", 0.05, 255, 0, 0) 
	            attachElements(g_VehicleList[veh].radioMarker, veh) 
	            g_VehicleList[veh].idleTimer = setTimer(radioIdleTimer, idleTime, 0, veh) 
	             
	            radioStreams = radioStreams + 1 
	            outputServerLog(getPlayerName(player) .. " Ligou o rádio em seu veículo (streams: " .. radioStreams .. ")")
 
	            for seat = 0, seats do 
	                local occupant = occupants[seat] 
	                if occupant and getElementType(occupant) == "player" then 
	                    triggerClientEvent("onServerToggleRadio", root, true, g_VehicleList[veh].radioStation, veh, g_VehicleList[veh].volume) 
	                     
	                    local r, g, b = getPlayerNametagColor(player) 
	                    colorHex = string.format("%02X%02X%02X", r, g, b) 
	                    outputChatBox("#" .. colorHex .. "" .. getPlayerName(player) .. " #696969Rádio: [#54FF9FLIGADO#696969]", occupant, 0, 0, 0, true) 
	                end 
	            end 
	        else         
	            g_VehicleList[veh].radio = false 
	            destroyElement(g_VehicleList[veh].radioMarker) 
	            killTimer(g_VehicleList[veh].idleTimer) 
	             
	            radioStreams = radioStreams - 1 
	            outputServerLog(getPlayerName(player) .. " desligou o rádio em seu veículo (streams: " .. radioStreams .. ")") 
	             
	            for seat = 0, seats do 
	                local occupant = occupants[seat] 
	                if occupant and getElementType(occupant) == "player" then 
	                    triggerClientEvent("onServerToggleRadio", root, false, nil, veh, g_VehicleList[veh].volume) 
	                     
	                    local r, g, b = getPlayerNametagColor(player) 
	                    colorHex = string.format("%02X%02X%02X", r, g, b) 
	                    outputChatBox("#" .. colorHex .. "" .. getPlayerName(player) .. " #696969Rádio: [#54FF9FDESLIGADO#696969]", occupant, 0, 0, 0, true) 
	                end 
	            end 
	        end 
	    end 
	end
 
	function radioIdleTimer(veh) 
	    if not get("radioIdlePlayerDistanceCheck") then return end 
	    local settingDist = get("radioIdlePlayerDistanceCheck") 
	     
	    if veh then         
	        if g_VehicleList[veh] ~= nil then 
	            if g_VehicleList[veh].radio == true then 
	                local playerInRange = false
 
	                local vx, vy, vz = getElementPosition(veh) 
	                for i,player in ipairs(getElementsByType("player")) do 
	                    local px, py, pz = getElementPosition(player) 
	                    local distance = getDistanceBetweenPoints3D(vx, vy, vz, px, py, pz) 
	                    if distance ~= false and distance < settingDist then 
	                        playerInRange = true 
	                    end 
	                end 
	                 
	                if playerInRange == false then 
	                    triggerClientEvent("onServerToggleRadio", root, false, nil, veh) 
	                    g_VehicleList[veh].radio = false 
	                    destroyElement(g_VehicleList[veh].radioMarker) 
	                    killTimer(g_VehicleList[veh].idleTimer) 
	                    if radioStreams ~= 0 then 
	                        radioStreams = radioStreams - 1 
	                    end 
	                 
	                    outputServerLog("An " .. getVehicleName(veh) .. "'s radio has been idled (streams: " .. radioStreams .. ")") 
	                end 
	            end 
	        end 
	    end 
	end
 
	addEvent("onPlayerRadioVolumeChange", true) 
	addEventHandler("onPlayerRadioVolumeChange", root, 
	    function(currentVol, volumeUp) 
	        local veh = getPedOccupiedVehicle(source) 
	        if veh then 
	            local playerSeat = getPedOccupiedVehicleSeat(source) 
	            if playerSeat == 0 or playerSeat == 1 then 
	                if volumeUp == true then 
	                    g_VehicleList[veh].volume = currentVol + 0.05 
	                    if g_VehicleList[veh].volume >= 1.00 then 
	                        g_VehicleList[veh].volume = 1.00 
	                    end 
	                else 
	                    g_VehicleList[veh].volume = currentVol - 0.05 
	                    if g_VehicleList[veh].volume <= 0.00 then 
	                        g_VehicleList[veh].volume = 0.00 
	                    end 
	                end 
	                triggerClientEvent("onServerVolumeChangeAccept", root, veh, g_VehicleList[veh].volume) 
	            end 
	        end 
	    end 
	)
 
	function cmdChangeRadioURL(source, commandName, url) 
	    if not url then 
	        outputChatBox("Usage: /setradio newurl", source, 255, 255, 255) 
	        return 
	    end
 
	    local veh = getPedOccupiedVehicle(source) 
	    if veh then 
	        local occupants = getVehicleOccupants(veh) 
	        local seats = getVehicleMaxPassengers(veh) 
	         
	        if g_VehicleList[veh] == nil then 
	            local x, y, z = getElementPosition(veh) 
	            g_VehicleList[veh] = { } 
	            g_VehicleList[veh].radio = true 
	            g_VehicleList[veh].lastTick = getTickCount() 
	            g_VehicleList[veh].radioStation = defaultRadio 
	            g_VehicleList[veh].volume = 1.0 
	            g_VehicleList[veh].radioMarker = createMarker(x, y, z, "corona", 0.1, 255, 0, 0) 
	            attachElements(g_VehicleList[veh].radioMarker, veh) 
	            g_VehicleList[veh].idleTimer = setTimer(radioIdleTimer, idleTime, 0, veh) 
	        end
 
	        local playerSeat = getPedOccupiedVehicleSeat(source) 
	        if playerSeat ~= 0 and playerSeat ~= 1 then 
	            outputChatBox("Você não pode mudar a estação de rádio.", source, 255, 255, 255) 
	            return 
	        end 
	         
	        for seat = 0, seats do 
	            local occupant = occupants[seat] 
	            if occupant and getElementType(occupant) == "player" then 
	                g_VehicleList[veh].radioStation = url 
	                g_VehicleList[veh].changedBy = getPlayerName(source) 
	                 
	                if g_VehicleList[veh].radio == true then 
	                    triggerClientEvent("onServerRadioURLChange", root, g_VehicleList[veh].radioStation, veh, g_VehicleList[veh].volume) 
	                end 
	                 
	                local r, g, b = getPlayerNametagColor(source) 
	                colorHex = string.format("%02X%02X%02X", r, g, b) 
	                outputChatBox("#" .. colorHex .. "" .. getPlayerName(source) .. " #FFFFFFMudou a estação de rádio.", occupant, 0, 0, 0, true) 
	                outputConsole(getPlayerName(source) .. " Mudou a estação de rádio em seu veículo: " .. url, occupant) 
	            end 
	        end 
	        outputServerLog(getPlayerName(source) .. " Mudou a estação de rádio em seu veículo: " .. url) 
	    end 
	end
 
	function cmdDumpVehRadioInfo(source, commandName) 
	    for i,veh in ipairs(getElementsByType("vehicle")) do 
	        if g_VehicleList[veh] ~= nil then 
	            if g_VehicleList[veh].radio == true then 
	                local strOut 
	                if g_VehicleList[veh].changedBy ~= nil then 
	                    strOut = "Vehicle: " .. getVehicleName(veh) .. ", URL = " .. g_VehicleList[veh].radioStation .. ", Ligada ao: " .. g_VehicleList[veh].turnedOnBy .. ", URL changed by: " .. g_VehicleList[veh].changedBy 
	                else 
	                    strOut = "Vehicle: " .. getVehicleName(veh) .. ", URL = " .. g_VehicleList[veh].radioStation .. ", Ligada ao: " .. g_VehicleList[veh].turnedOnBy 
	                end 
	                 
	                if getElementType(source) == "console" then 
	                    outputServerLog(strOut) 
	                elseif getElementType(source) == "player" then 
	                    outputChatBox(strOut, source, 255, 255, 255) 
	                end 
	            end 
	        end 
	    end 
	end
 
	addCommandHandler("setradio", cmdChangeRadioURL) 
	addCommandHandler("dumpradio", cmdDumpVehRadioInfo)