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
