Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --[[
- Made by Tweakified, Neonblox Games
- Video Obby Checkpoints: https://youtu.be/WRXBa8AwoXo
- Video DataStore Addon: https://youtu.be/k_SGagxVOmc
- Video SkipStage Addon: https://youtu.be/Yki2Y-IuNnA
- Video ResetStage Addon: https://youtu.be/IkLQHJOKwDU
- Discord Support: https://discord.com/invite/JdaFf7p
- Script Type: Regular Script
- Script Parent: ServerScriptService
- --]]
- local Players = game:GetService("Players")
- local MarketplaceService = game:GetService("MarketplaceService")
- local DataStoreService = game:GetService("DataStoreService")
- local ObbyDataStore = DataStoreService:GetDataStore("ObbyDataStore")
- local ReplicatedStorage = game:GetService("ReplicatedStorage")
- local SkipStage = ReplicatedStorage:WaitForChild("SkipStage")
- local ResetStage = ReplicatedStorage:WaitForChild("ResetStage")
- local Checkpoints = workspace:WaitForChild("Checkpoints")
- local inGameStartupPlayers = {}
- local CurrentStage = {}
- local TouchDb = {}
- local ProductId = 1135733177 -- Change to your developer product id
- 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)
- local success, stage = pcall(function()
- return (ObbyDataStore:GetAsync(player.UserId)) or 1
- end)
- CurrentStage[player.UserId] = stage
- local leaderstats = Instance.new("Folder", player)
- leaderstats.Name = "leaderstats"
- local Stage = Instance.new("IntValue", leaderstats)
- Stage.Name = "Stage"
- Stage.Value = stage
- 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)
- local success = pcall(function()
- ObbyDataStore:SetAsync(player.UserId, CurrentStage[player.UserId])
- end)
- 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 reached the highest stage!"
- end
- end
- end
- end
- ResetStage.OnServerEvent:Connect(function(player)
- CurrentStage[player.UserId] = 1
- local TempLeaderstats = player:FindFirstChild("leaderstats")
- if TempLeaderstats ~= nil then
- local TempStage = TempLeaderstats:FindFirstChild("Stage")
- if TempStage ~= nil then
- TempStage.Value = 1
- end
- end
- NewCharacter(player, player.Character)
- end)
- MarketplaceService.ProcessReceipt = function(recieptInfo)
- if recieptInfo.ProductId == ProductId then
- local player = Players:GetPlayerByUserId(recieptInfo.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
- 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
- game:BindToClose(function()
- for i,v in pairs(Players:GetPlayers()) do
- ObbyDataStore:SetAsync(v.UserId, CurrentStage[v.UserId])
- end
- wait(1)
- end)
- inGameStartupPlayers = {}
Advertisement
Comments
-
- no work
-
- Hey, if you’re having any trouble setting up the script please seak support in my discord server. The code definitely works :) https://discord.gg/FfPJtBxQmM
Add Comment
Please, Sign In to add comment
Advertisement