Greetings,
I've been making a shop gui with some gamepasses in, and it should detect if it's a gamepass or not. The problem is that I get an error and I don't know how to solve it. Here are the scripts:
Leaderstats & Events script
local MarketPlaceService = game:GetService("MarketplaceService") local player = game.Players.LocalPlayer local HasGamepass game.Players.PlayerAdded:Connect(function(plr) local leaderstats = Instance.new("Folder",plr) leaderstats.Name = "leaderstats" local Coins = Instance.new("IntValue",leaderstats) Coins.Name = "Coins" Coins.Value = 10000 end) game.ReplicatedStorage.GetInfo.OnServerInvoke = function(player,name) return game.ServerStorage.ShopItems[name].Coins.Value,game.ServerStorage.ShopItems[name].IsGamepass.Value,game.ServerStorage.ShopItems[name].GamepassID.Value end game.ReplicatedStorage.CheckSale.OnServerInvoke = function(player,name,boolGamepass,gamepassId) local price = game.ServerStorage.ShopItems[name].Coins.Value if player.leaderstats.Coins.Value >= price then if boolGamepass == true then local Pass,Error = pcall(function() HasGamepass = MarketPlaceService:UserOwnsGamePassAsync(player.UserId,gamepassId) end) if not Pass then error("Failed while checking if player owned gamepass: "..Error) end if HasGamepass == false then print(player.UserId,gamepassId) MarketPlaceService:PromptGamePassPurchase(player.UserId,gamepassId) elseif HasGamepass == true then game.ServerStorage.ShopItems[name][name]:Clone().Parent = player.Backpack game.ServerStorage.ShopItems[name][name]:Clone().Parent = player.StarterGear end elseif boolGamepass == false then game.ServerStorage.ShopItems[name][name]:Clone().Parent = player.Backpack end return true else return false end end
Select Gun Script
local MarketPlaceService = game:GetService("MarketplaceService") local ReplicatedStorage = game:GetService("ReplicatedStorage") local ServerStorage = game:GetService("ServerStorage") local ToolNameText = script.Parent.ToolName local ToolNameDesc = script.Parent.Description local Information = script.Parent.Parent.Parent.Parent.Information ToolNameText.Text = tostring(ToolNameText.ToolName.Value) ToolNameDesc.Text = "Description: " .. tostring(ToolNameDesc.Description.Value) script.Parent.MouseButton1Click:Connect(function(player) local Price,BoolGamepass,GamepassID = ReplicatedStorage.GetInfo:InvokeServer(tostring(ToolNameText.ToolName.Value)) if Price ~= nil then Information.ToolName.Text = tostring(ToolNameText.ToolName.Value) if BoolGamepass == true then Information.ToolPrice.Text = "Gamepass: " .. Price .. " R$" ReplicatedStorage.BuyProcess:Fire(ToolNameText.ToolName.Value,Price,BoolGamepass,GamepassID) elseif BoolGamepass == false then Information.ToolPrice.Text = tonumber(Price) ReplicatedStorage.BuyProcess:Fire(ToolNameText.ToolName.Value,Price,BoolGamepass) end end end)
Buy with Rubles Script
local MarketPlaceService = game:GetService("MarketplaceService") local ReplicatedStorage = game:GetService("ReplicatedStorage") local ServerStorage = game:GetService("ServerStorage") local Information = script.Parent.Parent local ToolNameText = Information.ToolName.ProductName local ToolNameDesc = Information.ToolPrice.ProductPrice ReplicatedStorage.BuyProcess.Event:Connect(function(name,price) repeat wait(0.1) until script.Parent.MouseButton1Click script.Parent.MouseButton1Click:Connect(function(player) local Success = ReplicatedStorage.CheckSale:InvokeServer(name,nil,nil) if Success == true then print("Purchase success!") elseif Success == false then print("Not enough money!") end end) end)
Buy with Robux script
local MarketPlaceService = game:GetService("MarketplaceService") local ReplicatedStorage = game:GetService("ReplicatedStorage") local ServerStorage = game:GetService("ServerStorage") local Information = script.Parent.Parent local ToolNameText = Information.ToolName.ProductName local ToolNameDesc = Information.ToolPrice.ProductPrice local player = game.Players.LocalPlayer local HasGamepass = false ReplicatedStorage.BuyProcess.Event:Connect(function(toolName,price,boolGamepass,gamepassId) repeat wait(0.1) until script.Parent.MouseButton1Click script.Parent.MouseButton1Click:Connect(function() if gamepassId == nil then local Success = ReplicatedStorage.CheckSale:InvokeServer(toolName) if Success == true then player.leaderstats.Coins.Value = player.leaderstats.Coins.Value - price ServerStorage.ShopItems[toolName][toolName]:Clone().Parent = player.Backpack elseif Success == false then print("Not enough money!") end elseif gamepassId ~= nil then print(player.UserId.." - "..gamepassId) local Pass,Error = pcall(function() HasGamepass = MarketPlaceService:UserOwnsGamePassAsync(player.UserId,gamepassId) end) if not Pass then error("Failed while checking if player owned gamepass: "..Error) end print(toolName,boolGamepass,gamepassId) local Success = ReplicatedStorage.CheckSale:InvokeServer(toolName,boolGamepass,gamepassId) if Success == true then print("Purchase success!") elseif Success == false then print("Not enough money!") end end end) end)
If you need the hierarchy of the gui and everything, ask me in the comments.
MarketplaceService:PromptGamePassPurchase, this function takes Player Object as an argument and GamepassId, which means, that you should not pass UserId, instead you should just pass Player. like that
MarketPlaceService:PromptGamePassPurchase(player,gamepassId)