Scripting Helpers is winding down operations and is now read-only. More info→
Ad
Log in to vote
0

Why is this bindable function randomly firing?

Asked by 4 years ago

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

Answer this question