Hello, I'm relatively new to scripting and recently worked out how to use remote events and functions. I have created this music script using bindable functions and remote events. The music script works perfectly until interrupted by someone buying a change song developer product which instantly changes the song to the id they put in a textbox. After that happens, the code keeps randomly firing the bindable function and restarting the music script and I have no clue how to fix it. The song is changed when the length of the song is complete for the main music script and in the developer product script, the bindable function to restart the main music script is fired when the length of the song is done.
I am also using 4 different remote events, functions etc. and I am aware that is bad practice so I would appreciate if someone could help me minimize the amount. The bindable function is called 'MusicBought', the remote events are called 'Bought' and 'MusicChanged' and the bindable event is named 'musicChange'.
Main music script (located in ServerScriptService)
local module = {} local MusicPlayer = game:GetService('ServerScriptService'):WaitForChild('Music System') local folder = MusicPlayer.songs local loop = MusicPlayer.settings.loop.Value local waitbetween = MusicPlayer.settings.waitbetweensongs.Value local sound = game:GetService('Workspace'):WaitForChild('Sound') local songs = folder:GetChildren() local ReplicatedStorage = game:GetService("ReplicatedStorage") local MusicChanged = ReplicatedStorage:WaitForChild('MusicChanged') local be = script.Parent:WaitForChild('musicChange') local function musicEvent() while true do local random = (songs)[ math.random( #songs)].value print(random) sound.SoundId = ('rbxassetid://'.. random) local NowPlaying = game:GetService('ReplicatedStorage'):WaitForChild('Playing') NowPlaying.Value = random local Asset = game:GetService("MarketplaceService"):GetProductInfo(random) local name = Asset.Name MusicChanged:FireAllClients(name) print('Attempting to load song "'..name..'"') sound:Play() while wait(.1) do if sound.IsLoaded == true then print('Loaded Audio Time '..sound.SoundId) break end end if sound.Playing == false then print('Loaded Audio Asset '..sound.SoundId) sound:Play() end wait(sound.TimeLength + 2) end end be.Event:connect(musicEvent) return module
Developer product song script (located in ServerScriptService)
-- this is the script for the developer product song local MusicChanged = ReplicatedStorage:WaitForChild('MusicChanged') local MarketplaceService = game:GetService("MarketplaceService") local sound = game:GetService('Workspace'):WaitForChild('Sound') local be = script.Parent:WaitForChild('musicChange') local function processReceipt(receiptInfo) local player = game:GetService("Players"):GetPlayerByUserId(receiptInfo.PlayerId) if not player then return Enum.ProductPurchaseDecision.NotProcessedYet end print(receiptInfo.PlayerId .. " just bought " .. receiptInfo.ProductId) local MusicBought = ReplicatedStorage:WaitForChild('MusicBought') local Bought = ReplicatedStorage:WaitForChild('Bought') Bought:FireClient(player) MusicBought.OnServerInvoke = function(player, Data) local Asset = game:GetService("MarketplaceService"):GetProductInfo(Data) local name = Asset.Name print(Asset.Name) MusicChanged:FireClient(player, name) print('rbxassetid://'.. Data) sound.SoundId = ('rbxassetid://'.. Data) wait() wait(sound.TimeLength) be:Fire() end return Enum.ProductPurchaseDecision.PurchaseGranted end
Initial setup script (located in ServerScriptService)
-- this is the initial setup local be = script.Parent:WaitForChild('musicChange') local songs = { '3340674075', '1346523498', '639750143', '279206904', '2801252370', '2183613911', '1173506587', '3035657191', '1066042031' } local function createSongValue(songID) local IntValue = Instance.new('IntValue') IntValue.Parent = script.Parent.songs IntValue.Value = songID print('Successfully Added Song '.. songID) end local x = 1 while x <= table.getn(songs) do createSongValue(songs[x]) x = x + 1 end print('Song initilazation complete!') require(script.Parent.Main) be:Fire()
The local that sends the song id to the server (located in a Gui)
-- this is the local script in which the song id is sent to the server local Players = game:GetService("Players") local player = Players.LocalPlayer local ReplicatedStorage = game:GetService("ReplicatedStorage") local Bought = ReplicatedStorage:WaitForChild("Bought") local playerGui = player:WaitForChild("PlayerGui") local music = ReplicatedStorage:WaitForChild('Music') local IDEvent = ReplicatedStorage:WaitForChild("MusicBought") local Song = game:GetService('ReplicatedStorage'):WaitForChild('Playing') local NowPlaying = player.PlayerGui:WaitForChild('NowPlaying').Playing local function onNewPlayerFired() local data = playerGui:WaitForChild('SongID').UI.ID.Text IDEvent:InvokeServer(data) print('data sent') end Bought.OnClientEvent:Connect(onNewPlayerFired)
Thanks to anyone that helps