In my game I have a concert stage that plays a random song from a table of different sound IDs. I also have a bell that, when clicked, should cancel/start the music.
function stopMusic()
playingMusic = false
music_file:Stop()
task.wait(math.random(5,15))
playMusic()
end
function playMusic()
playingMusic = true
local value = math.random(1,#music_list)
local pickedSong = music_list[value]
local waitTime = time_list[value]
music_file.SoundId = pickedSong
music_file:Play()
task.wait(waitTime)
stopMusic()
end
function clickedBell()
if playingMusic == true then
stopMusic()
else
playMusic()
end
end
remoteEvent.OnServerEvent:Connect(clickedBell)
When a player clicks the bell, the music correctly stops and starts - but the functions continue to run because they were called previously and the songs start and stop abruptly. I need to find a way to cancel out playMusic() and stopMusic() entirely, if that’s even possible. I saw information regarding the Disconnect() function and task.spawn/task.cancel but wasn’t sure how to implement them into my code…
Let me know if I need to provide more info, thanks for any help!
Yes, if you were to use threads such as task.spawn and then cancel it would stop the entire function from yielding, however here I think you don’t need to handle all that work and can just use the sound’s respected methods.
example of threads
local thread = task.spawn(function()
for i=1,10 do
print(1)
task.wait(1)
end
end)
task.wait(3)
task.cancel(thread)
What you should be doing however
local sound = script.Parent
local chosen
local function play()
repeat id = music_list[math.random(1,#music_list)] until id ~= chosen
chosen = id
sound.SoundId = chosen
sound:Play()
end
local function pause() -- this is the function you're probably looking for
sound:Pause()
end
local function resume() -- this is the function you're probably looking for
sound:Resume()
end
local function stop()
sound:Stop()
end
play() -- will play a sound
pause() -- will pause the sound
resume() -- will resume the sound
stop() -- will stop the sound