Basically, this event fires from a server script when a player purchases a product. In my client script, I check if it's the right player by doing if game.Players.LocalPlayer.Name = plr.Name then... It says that the plr value is nil even tho I'm getting it from the OnClientEvent function.
-- Server Script
local MarketplaceService = game:GetService("MarketplaceService")
local event = game.ReplicatedStorage["Music System"].PurchaseMusic
local function processReceipt(receiptInfo)
local player = game:GetService("Players"):GetPlayerByUserId(receiptInfo.PlayerId)
if not player then
return Enum.ProductPurchaseDecision.NotProcessedYet
end
if receiptInfo.ProductId == 655383631 then
event:FireClient(player)
end
return Enum.ProductPurchaseDecision.PurchaseGranted
end
MarketplaceService.ProcessReceipt = processReceipt
And my client script:
-- Client Script/Local Script
local event = game.ReplicatedStorage["Music System"].RequestMusic
local event2 = game.ReplicatedStorage["Music System"].PurchaseMusic
event2.OnClientEvent:Connect(function(plr)
if game.Players.LocalPlayer.Name == plr.Name then
local id = script.Parent.Parent.ChosenID.Value
event:FireServer(id)
script.Parent.Text = "Added To Queue"
end
end)

6 comments
Try event2.OnClientEvent:Connect(function(Rand, plr) for the client script. I really don't know why roblox does this, but I encounter this all the time
what is rand?
A nil value. For some reason, when receiving parameters passed via a remote event, the values are offset by one
also that doesn't work
Players.TypicallyPacific.PlayerGui.ScreenGui.Frame.TextButton.LocalScript:5: attempt to index local 'plr' (a nil value)
Can you test to see if you are getting the player object?