I think I may have a typo somewhere in here which may be causing the problem because the stage system works fine. It just does not teleport the character once the prompt is purchased.
*The first is the local script.
local TextButton = script.Parent
local Checkpoints = workspace:WaitForChild("Checkpoints")
local Players = game:GetService("Players")
local player = Players.LocalPlayer
local StageLeaderstat = player:WaitForChild("leaderstats"):WaitForChild("Stage")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SkipStage = ReplicatedStorage:WaitForChild("SkipStage")
TextButton.MouseButton1Click:Connect(function()
if TextButton.Text == "Skip Stage" then
if #Checkpoints:GetChildren() ~= StageLeaderstat.Value then
TextButton.Text = "Purchasing..."
local Response = SkipStage:InvokeServer()
TextButton.Text = Response
else
TextButton.Text = "You have finished!" --"You have reached the highest stage!"
end
wait(2)
TextButton.Text = "Skip Stage"
end
end)
local Players = game:GetService("Players")
local MarketplaceService = game:GetService("MarketplaceService")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SkipStage = ReplicatedStorage:WaitForChild("SkipStage")
local Checkpoints = workspace:WaitForChild("Checkpoints")
local inGameStartupPlayers = {}
local CurrentStage = {}
local TouchDb = {}
local ProductId = 1309039236
local function NewCharacter(player, char)
local TempCurrentStage = CurrentStage[player.UserId]
if TempCurrentStage ~= nil then
local TempCheckpoint = Checkpoints:FindFirstChild(TempCurrentStage)
if TempCheckpoint ~= nil then
repeat wait(0.1) until char.PrimaryPart ~= nil
char:SetPrimaryPartCFrame(CFrame.new(TempCheckpoint.Position + Vector3.new(0, 3, 0)) * CFrame.Angles(0, math.rad(TempCheckpoint.Orientation.Y) + math.rad(90), 0))
end
end
end
local function NewPlayer (player)
CurrentStage[player.UserId] = 1
local leaderstats = Instance.new("Folder", player)
leaderstats.Name = "leaderstats"
local Stage = Instance.new("IntValue", leaderstats)
Stage.Name = "Stage"
Stage.Value = 1
local TempChar = player.Character
if TempChar ~= nil then
NewCharacter(player, TempChar)
end
player.CharacterAdded:Connect(function(char)
NewCharacter(player, char)
end)
end
Players.PlayerAdded:Connect(function(player)
if inGameStartupPlayers[player] == nil then
NewPlayer(player)
end
end)
Players.PlayerRemoving:Connect(function(player)
CurrentStage[player.UserId] = nil
end)
SkipStage.OnServerInvoke = function(player)
local connection
local leaderstats = player:FindFirstChild("leaderstats")
if leaderstats ~= nil then
local Stage = leaderstats:FindFirstChild("Stage")
if Stage ~= nil then
if #Checkpoints:GetChildren() ~= Stage.Value then
local PurchaseResult = "Purchase Failed"
connection = MarketplaceService.PromptProductPurchaseFinished:Connect(function(userId, productId, purchased)
if player.UserId == userId and productId == ProductId then
if purchased == true then
PurchaseResult = "Success"
end
end
connection:Disconnect()
end)
MarketplaceService:PromptProductPurchase(player, ProductId)
repeat wait(0.1) until connection.Connected == false or Players:GetPlayerByUserId(player.UserId) == nil
return PurchaseResult
else
return ("You have finished!")
end
end
end
end
MarketplaceService.ProcessReceipt = function(receiptInfo)
if receiptInfo.Product == ProductId then
local player = Players:GetPlayerByUserId(receiptInfo.PlayerId)
if player ~= nil then
CurrentStage[player.UserId] = CurrentStage[player.UserId] + 1
local leaderstats = player:FindFirstChild("leaderstats")
if leaderstats ~= nil then
local Stage = leaderstats:FindFirstChild("Stage")
if Stage ~= nil then
Stage.Value = CurrentStage[player.UserId]
end
end
local TempChar = player.Character
if TempChar ~= nil then
NewCharacter(player, TempChar)
end
return Enum.ProductPurchaseDecision.PurchaseGranted
end
end
return Enum.ProductPurchaseDecision.NotProcessedYet
end
for i,v in pairs (Checkpoints:GetChildren() ) do
local StageNum = tonumber(v.Name)
v.Touched:Connect(function(hit)
local char = hit.Parent
if char ~= nil then
local Humanoid = char:FindFirstChildOfClass("Humanoid")
if Humanoid ~= nil and Humanoid.Health > 0 then -- does not need but if the player just dies and hits the point, do you want stage?
local player = Players:GetPlayerFromCharacter(char)
if player ~= nil and (TouchDb[player.UserId] or 0) + 1 <= os.time() then
TouchDb[player.UserId] = os.time()
local TempCurrentStage = CurrentStage[player.UserId]
if TempCurrentStage == StageNum - 1 then
CurrentStage[player.UserId] = StageNum
local TempLeaderstats = player:FindFirstChild("leaderstats")
if TempLeaderstats ~= nil then
local TempStage = TempLeaderstats:FindFirstChild("Stage")
if TempStage ~= nil then
TempStage.Value = StageNum
end
end
end
end
end
end
end)
end
inGameStartupPlayers = Players:GetPlayers()
for i, v in pairs(inGameStartupPlayers) do
spawn(function()
NewPlayer(v)
end)
end
inGameStartupPlayers = {}