66
77local speakerSounds = {}
88local playerSpeakers = {}
9+ local speakerVolumeSyncTimer = false
910
1011local function getStreamURLFromEdit ()
1112 local streamURL = guiGetText (RADIO_GUI [" Stream URL edit" ])
@@ -46,6 +47,38 @@ local function handleSpeakerOnStreamInOut(speakerElement, toggleOn)
4647 return false
4748end
4849
50+ local function getLocalSpeakerVolume ()
51+ local speakerVolume = guiScrollBarGetScrollPosition (RADIO_GUI [" Volume" ])
52+ local speakerVolumeValue = (speakerVolume / 100 )
53+
54+ return speakerVolumeValue
55+ end
56+
57+ local function syncSpeakerVolume ()
58+ local speakerVolume = getLocalSpeakerVolume ()
59+
60+ triggerServerEvent (" onServerSetSpeakerVolume" , localPlayer , speakerVolume )
61+ speakerVolumeSyncTimer = false
62+
63+ return true
64+ end
65+
66+ local function requestSpeakerVolumeSync ()
67+ local speakerVolume = getLocalSpeakerVolume ()
68+
69+ setPlayerSpeakerVolume (localPlayer , speakerVolume ) -- set volume locally so localPlayer could adjust it without any delay (this will be sanity corrected by server later on)
70+
71+ if (speakerVolumeSyncTimer ) then
72+ resetTimer (speakerVolumeSyncTimer )
73+ else
74+ local speakerTimerInterval = (RADIO_VOLUME_DELAY + 50 ) -- extra time to let server catch up
75+
76+ speakerVolumeSyncTimer = setTimer (syncSpeakerVolume , speakerTimerInterval , 1 )
77+ end
78+
79+ return true
80+ end
81+
4982function loadRadioStations ()
5083 for stationID = 1 , # RADIO_STATIONS do
5184 local radioStationData = RADIO_STATIONS [stationID ]
@@ -91,6 +124,7 @@ function toggleSpeakerSounds(playerElement, toggleOn)
91124 local speakerDimension = getElementDimension (speakerBox )
92125 local speakerSoundMaxDistance = speakerData .speakerSoundMaxDistance
93126 local speakerStreamURL = speakerData .speakerStreamURL
127+ local speakerVolume = speakerData .speakerVolume
94128 local speakerNewSound = playSound3D (speakerStreamURL , speakerBoxPosX , speakerBoxPosY , speakerBoxPosZ , true , false )
95129
96130 if (not speakerNewSound ) then
@@ -106,7 +140,7 @@ function toggleSpeakerSounds(playerElement, toggleOn)
106140
107141 setSoundPaused (speakerNewSound , speakerPaused )
108142 setSoundMaxDistance (speakerNewSound , speakerSoundMaxDistance )
109- setSoundVolume (speakerNewSound , 1 )
143+ setSoundVolume (speakerNewSound , speakerVolume )
110144 attachElements (speakerNewSound , speakerBox )
111145 end
112146
130164
131165function onClientGUIClickCreateSpeaker ()
132166 local streamURL , errorCode = getStreamURLFromEdit ()
167+ local speakerVolume = getLocalSpeakerVolume ()
133168
134169 if (not streamURL ) then
135170 local textToDisplay = errorCode or " SPEAKER: Invalid URL, please check your input!"
@@ -145,7 +180,11 @@ function onClientGUIClickCreateSpeaker()
145180 return false
146181 end
147182
148- triggerServerEvent (" onServerCreateSpeaker" , localPlayer , streamURL )
183+ triggerServerEvent (" onServerCreateSpeaker" , localPlayer , streamURL , speakerVolume )
184+ end
185+
186+ function onClientGUIScrollVolume ()
187+ requestSpeakerVolumeSync ()
149188end
150189
151190function onClientGUIClickToggleSpeaker ()
@@ -194,7 +233,7 @@ function setPlayerSpeakerData(playerElement, speakerData)
194233 local speakerBox = speakerData .speakerBox
195234 local speakerDummy = createObject (1337 , 0 , 0 , 3 )
196235 local speakerBoxDimension = getElementDimension (speakerBox )
197- setElementDimension ( speakerDummy , speakerBoxDimension )
236+
198237
199238 speakerData .speakerDummy = speakerDummy
200239 playerSpeakers [playerElement ] = speakerData
@@ -203,11 +242,25 @@ function setPlayerSpeakerData(playerElement, speakerData)
203242
204243 setElementAlpha (speakerDummy , 0 )
205244 setElementCollisionsEnabled (speakerDummy , false )
245+ setElementDimension (speakerDummy , speakerBoxDimension )
206246 attachElements (speakerDummy , speakerBox , - 0.32 , - 0.22 , 0.8 )
207247
208248 return true
209249end
210250
251+ function setPlayerSpeakerVolume (playerElement , speakerVolume )
252+ local validElement = isElement (playerElement )
253+ local speakerSound = speakerSounds [playerElement ]
254+
255+ if (not validElement or not speakerSound ) then
256+ return false
257+ end
258+
259+ setSoundVolume (speakerSound , speakerVolume )
260+
261+ return true
262+ end
263+
211264function setPlayerSpeakerPaused (playerElement , pauseState )
212265 local playerSpeakerData = getPlayerSpeakerData (playerElement )
213266
319372addEvent (" onClientCreateSpeaker" , true )
320373addEventHandler (" onClientCreateSpeaker" , root , onClientCreateSpeaker )
321374
375+ function onClientSetSpeakerVolume (speakerVolume )
376+ setPlayerSpeakerVolume (source , speakerVolume )
377+ end
378+ addEvent (" onClientSetSpeakerVolume" , true )
379+ addEventHandler (" onClientSetSpeakerVolume" , root , onClientSetSpeakerVolume )
380+
322381function onClientToggleSpeaker (pauseState )
323382 setPlayerSpeakerPaused (source , pauseState )
324383end
@@ -339,4 +398,4 @@ function clearSpeakersOnDestroyQuit()
339398 clearPlayerSpeaker (source )
340399end
341400addEventHandler (" onClientPlayerQuit" , root , clearSpeakersOnDestroyQuit )
342- addEventHandler (" onClientElementDestroy" , resourceRoot , clearSpeakersOnDestroyQuit )
401+ addEventHandler (" onClientElementDestroy" , resourceRoot , clearSpeakersOnDestroyQuit )
0 commit comments