[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)