diff --git a/[gameplay]/internetradio/config/ShRadioConfig.lua b/[gameplay]/internetradio/config/ShRadioConfig.lua index 329dc0ac3..86b5bead2 100644 --- a/[gameplay]/internetradio/config/ShRadioConfig.lua +++ b/[gameplay]/internetradio/config/ShRadioConfig.lua @@ -5,6 +5,7 @@ -- ####################################### RADIO_CREATE_SPEAKER_DELAY = 1000 +RADIO_VOLUME_DELAY = 200 RADIO_TOGGLE_SPEAKER_DELAY = 1500 RADIO_DESTROY_SPEAKER_DELAY = 1500 RADIO_ALLOW_CUSTOM_URLS = true diff --git a/[gameplay]/internetradio/logic/gui/CRadioGUI.lua b/[gameplay]/internetradio/logic/gui/CRadioGUI.lua index 83b633217..82957d00f 100644 --- a/[gameplay]/internetradio/logic/gui/CRadioGUI.lua +++ b/[gameplay]/internetradio/logic/gui/CRadioGUI.lua @@ -20,23 +20,26 @@ local function initializeRadioGUI() RADIO_GUI["Radio window"] = guiCreateWindow(radioWindowPosX, radioWindowPosY, radioWindowSizeX, radioWindowSizeY, "SPEAKER MUSIC (RADIO/MP3)", false) RADIO_GUI["Stream URLs gridlist"] = guiCreateGridList(10, 54, 304, 139, false, RADIO_GUI["Radio window"]) RADIO_GUI["Stream URL edit"] = guiCreateEdit(10, 25, 304, 26, "http://stream.antenne.de:80/80er-kulthits", false, RADIO_GUI["Radio window"]) - RADIO_GUI["Create speaker button"] = guiCreateButton(10, 200, 150, 30, "CREATE SPEAKER", false, RADIO_GUI["Radio window"]) - RADIO_GUI["Destroy speaker button"] = guiCreateButton(162, 200, 150, 30, "DESTROY SPEAKER", false, RADIO_GUI["Radio window"]) - RADIO_GUI["Play/pause button"] = guiCreateButton(10, 235, 150, 30, "Play - Pause", false, RADIO_GUI["Radio window"]) - RADIO_GUI["Close button"] = guiCreateButton(162, 235, 150, 30, "Close", false, RADIO_GUI["Radio window"]) + RADIO_GUI["Volume"] = guiCreateScrollBar(10, 200, 302, 20, true, false, RADIO_GUI["Radio window"]) + RADIO_GUI["Create speaker button"] = guiCreateButton(10, 230, 150, 30, "CREATE SPEAKER", false, RADIO_GUI["Radio window"]) + RADIO_GUI["Destroy speaker button"] = guiCreateButton(162, 230, 150, 30, "DESTROY SPEAKER", false, RADIO_GUI["Radio window"]) + RADIO_GUI["Play/pause button"] = guiCreateButton(10, 265, 150, 30, "Play - Pause", false, RADIO_GUI["Radio window"]) + RADIO_GUI["Close button"] = guiCreateButton(162, 265, 150, 30, "Close", false, RADIO_GUI["Radio window"]) RADIO_GUI["Toggle remote speakers checkbox"] = guiCreateCheckBox(15, 345, 180, 17, "Allow other players speakers", allowRemoteSpeakers, false, RADIO_GUI["Radio window"]) RADIO_GUI["Toggle remote speakers label"] = guiCreateLabel(167, 345, 150, 17, "", false, RADIO_GUI["Radio window"]) RADIO_GUI["Radio station URL column"] = guiGridListAddColumn(RADIO_GUI["Stream URLs gridlist"], "Radio station", 0.8) - + guiSetVisible(RADIO_GUI["Radio window"], false) guiEditSetMaxLength(RADIO_GUI["Stream URL edit"], RADIO_STREAM_URL_MAX_LENGTH) guiWindowSetSizable(RADIO_GUI["Radio window"], false) guiGridListSetSortingEnabled(RADIO_GUI["Stream URLs gridlist"], false) + guiScrollBarSetScrollPosition(RADIO_GUI["Volume"], 100) loadRadioStations() addEventHandler("onClientGUIClick", RADIO_GUI["Stream URLs gridlist"], onClientGUIClickLoadStationStreamURL, false) + addEventHandler("onClientGUIScroll", RADIO_GUI["Volume"], onClientGUIScrollVolume, false) addEventHandler("onClientGUIClick", RADIO_GUI["Create speaker button"], onClientGUIClickCreateSpeaker, false) addEventHandler("onClientGUIClick", RADIO_GUI["Play/pause button"], onClientGUIClickToggleSpeaker, false) addEventHandler("onClientGUIClick", RADIO_GUI["Destroy speaker button"], onClientGUIClickDestroySpeaker, false) diff --git a/[gameplay]/internetradio/logic/handle_radio/CHandleRadio.lua b/[gameplay]/internetradio/logic/handle_radio/CHandleRadio.lua index 1eb28fe94..b30f0948c 100644 --- a/[gameplay]/internetradio/logic/handle_radio/CHandleRadio.lua +++ b/[gameplay]/internetradio/logic/handle_radio/CHandleRadio.lua @@ -91,6 +91,7 @@ function toggleSpeakerSounds(playerElement, toggleOn) local speakerDimension = getElementDimension(speakerBox) local speakerSoundMaxDistance = speakerData.speakerSoundMaxDistance local speakerStreamURL = speakerData.speakerStreamURL + local speakerVolume = speakerData.speakerVolume local speakerNewSound = playSound3D(speakerStreamURL, speakerBoxPosX, speakerBoxPosY, speakerBoxPosZ, true, false) if (not speakerNewSound) then @@ -106,7 +107,7 @@ function toggleSpeakerSounds(playerElement, toggleOn) setSoundPaused(speakerNewSound, speakerPaused) setSoundMaxDistance(speakerNewSound, speakerSoundMaxDistance) - setSoundVolume(speakerNewSound, 1) + setSoundVolume(speakerNewSound, speakerVolume) attachElements(speakerNewSound, speakerBox) end @@ -130,6 +131,7 @@ end function onClientGUIClickCreateSpeaker() local streamURL, errorCode = getStreamURLFromEdit() + local volume = guiScrollBarGetScrollPosition(RADIO_GUI["Volume"]) / 100 if (not streamURL) then local textToDisplay = errorCode or "SPEAKER: Invalid URL, please check your input!" @@ -145,7 +147,18 @@ function onClientGUIClickCreateSpeaker() return false end - triggerServerEvent("onServerCreateSpeaker", localPlayer, streamURL) + triggerServerEvent("onServerCreateSpeaker", localPlayer, streamURL, volume) +end + +function onClientGUIScrollVolume() + local volume = guiScrollBarGetScrollPosition(RADIO_GUI["Volume"]) / 100 + local createDelayPassed = getOrSetPlayerDelay(localPlayer, "volume", RADIO_VOLUME_DELAY) + + if (not createDelayPassed) then + return false + end + + triggerServerEvent("onServerEditVolume", localPlayer, volume) end function onClientGUIClickToggleSpeaker() @@ -208,6 +221,19 @@ function setPlayerSpeakerData(playerElement, speakerData) return true end +function setPlayerSpeakerVolume(playerElement, volume) + local validElement = isElement(playerElement) + local speakerSound = speakerSounds[playerElement] + + if (not validElement or not speakerSound) then + return false + end + + setSoundVolume(speakerSound, volume) + + return true +end + function setPlayerSpeakerPaused(playerElement, pauseState) local playerSpeakerData = getPlayerSpeakerData(playerElement) @@ -319,6 +345,12 @@ end addEvent("onClientCreateSpeaker", true) addEventHandler("onClientCreateSpeaker", root, onClientCreateSpeaker) +function onClientUpdateVolume(volume) + setPlayerSpeakerVolume(source, volume) +end +addEvent("onClientUpdateVolume", true) +addEventHandler("onClientUpdateVolume", root, onClientUpdateVolume) + function onClientToggleSpeaker(pauseState) setPlayerSpeakerPaused(source, pauseState) end diff --git a/[gameplay]/internetradio/logic/handle_radio/SHandleRadio.lua b/[gameplay]/internetradio/logic/handle_radio/SHandleRadio.lua index 76ec70cd3..df50e859d 100644 --- a/[gameplay]/internetradio/logic/handle_radio/SHandleRadio.lua +++ b/[gameplay]/internetradio/logic/handle_radio/SHandleRadio.lua @@ -19,6 +19,17 @@ function setPlayerSpeakerData(playerElement, speakerData) return true end +function updateSpeakerVolume(playerElement, volume) + local playerSpeakerData = getPlayerSpeakerData(playerElement) + + if (not playerSpeakerData) then + return false + end + + playerSpeakerData.speakerVolume = volume + triggerClientEvent(root, "onClientUpdateVolume", playerElement, volume) +end + function getPlayerSpeakerData(playerElement) local validElement = isElement(playerElement) @@ -74,7 +85,7 @@ function isObjectSpeaker(objectElement) return false end -function onServerCreateSpeaker(streamURL) +function onServerCreateSpeaker(streamURL, volume) if (not client) then return false end @@ -91,6 +102,12 @@ function onServerCreateSpeaker(streamURL) return false end + local validVolume = verifyRadioVolume(volume) + + if (not validVolume) then + return false + end + clearPlayerSpeaker(client, true) local playerPosX, playerPosY, playerPosZ = getElementPosition(client) @@ -117,6 +134,7 @@ function onServerCreateSpeaker(streamURL) speakerStreamURL = streamURL, speakerSoundMaxDistance = RADIO_MAX_SOUND_DISTANCE, speakerPaused = false, + speakerVolume = volume } setPlayerSpeakerData(client, speakerData) @@ -124,6 +142,34 @@ end addEvent("onServerCreateSpeaker", true) addEventHandler("onServerCreateSpeaker", root, onServerCreateSpeaker) +function onServerEditVolume(volume) + if (not client or client ~= source) then + return false + end + + local createDelayPassed = getOrSetPlayerDelay(client, "volume", RADIO_VOLUME_DELAY) + + if (not createDelayPassed) then + return false + end + + local validVolume = verifyRadioVolume(volume) + + if (not validVolume) then + return false + end + + local speakerData = playerSpeakers[client] + + if (not speakerData) then + return false + end + + updateSpeakerVolume(client, volume) +end +addEvent("onServerEditVolume", true) +addEventHandler("onServerEditVolume", root, onServerEditVolume) + function onServerToggleSpeaker() if (not client) then return false diff --git a/[gameplay]/internetradio/logic/handle_radio/ShHandleRadio.lua b/[gameplay]/internetradio/logic/handle_radio/ShHandleRadio.lua index bef1b58e9..8bb5adf01 100644 --- a/[gameplay]/internetradio/logic/handle_radio/ShHandleRadio.lua +++ b/[gameplay]/internetradio/logic/handle_radio/ShHandleRadio.lua @@ -127,4 +127,19 @@ end function clearPlayersDelay() playerDelays[source] = nil end -addEventHandler(isServer and "onPlayerQuit" or "onClientPlayerQuit", root, clearPlayersDelay) \ No newline at end of file +addEventHandler(isServer and "onPlayerQuit" or "onClientPlayerQuit", root, clearPlayersDelay) + +function verifyRadioVolume(radioVolume) + local radioVolumeType = type(radioVolume) + local radioVolumeNumber = (radioVolumeType == "number") + + if (not radioVolumeNumber) then + return false + end + + local radioVolumeMin = 0 + local radioVolumeMax = 1 + local radioVolumeInRange = (radioVolume >= radioVolumeMin) and (radioVolume <= radioVolumeMax) + + return radioVolumeInRange +end \ No newline at end of file