I have a data saving script which I don't whats wrong with it

  1. What do you want to achieve? I am trying to have three values (stage, deaths and time spent).

  2. What is the issue? My stages are not saving, the seconds are not going up and the deaths are not saving. These are my checkpoints : (they have teamchangeontouch off) Capture

  3. What solutions have you tried so far? I have tried the scripting helpers website but it was quite confusing.

This is my code:

local dss = game:GetService("DataStoreService")
local Datastore = dss:GetDataStore("ObbyData")
local checkpoints = workspace.Checkpoints
print("Checkpoints leaderstats working")
print("Deaths leaderstats working")
print("Time leaderstats working")
game.Players.PlayerAdded:Connect(function(plr)
	local obbyData = Datastore:GetAsync(plr.UserId .. "-obbyStageProgress")
	local stats = Instance.new("Folder")
	stats.Name = "leaderstats"
	stats.Parent = plr
	local stage = Instance.new("StringValue")
	stage.Name = "Stage"
	stage.Value = obbyData or 1
	stage.Parent = stats
	local wipeouts = Instance.new("IntValue")
	wipeouts.Name = "Deaths"
	wipeouts.Value = 0
	wipeouts.Parent = stats
	local Data = Datastore:GetAsync(plr.UserId)
	if Data then
		wipeouts.Value = Data
	end
	local second = Instance.new("IntValue")
	second.Name = "Seconds"
	second.Value = stats
	local Dat = Datastore:GetAsync(plr.UserId)
	if Dat then
		second.Value = Data
	end
	game.Players.PlayerRemoving:Connect(function(Player)
	Datastore:SetAsync(Player.UserId, Player.leaderstats.Seconds.Value,Player.leaderstats.Deaths.Value) -- Change "Money" with your currency.
end)

	local char = plr.Character or plr.CharacterAdded:Wait()
	char:WaitForChild("HumanoidRootPart").CFrame = checkpoints[stage.Value].CFrame
	char.Humanoid.Touched:Connect(function(touch)
		if touch.Parent == checkpoints then 
			if (tonumber(touch.Name)and tonumber(touch.Name)>tonumber(stage.Value))or touch.Name == "End" then
				stage.Value = touch.Name
				pcall(function()
					Datastore:SetAsync(plr.UserId.. "-obbyStageProgress", plr.leaderstats.Stage.Value,plr.leaderstats.Deaths.Value,plr.leaderstats.Seconds.Value)
					
				end)
			end
		end
	end)
	plr.CharacterAdded:Connect(function(char)
		local hrp = char:WaitForChild("HumanoidRootPart")
		local humanoid = char:WaitForChild("Humanoid")
		hrp:GetPropertyChangedSignal("CFrame"):Wait()
		hrp.CFrame = checkpoints[stage.Value].CFrame
			
					
		humanoid.Died:Connect(function(touch)
				wipeouts.Value = wipeouts.Value +1
		
			if touch.Parent == checkpoints then
				if (tonumber(touch.Name)and tonumber(touch.Name)>tonumber(stage.Value))or touch.Name == "End"then
					stage.Value = touch.Name
while true do
						wait(2)
						
						wipeout.Value = wipeout.Value + 1	
					end
					pcall(function()
													
						game.Players.PlayerRemoving:Connect(function(player)
							Datastore:SetAsync(plr.UserId.. "-obbyStageProgress", plr.leaderstats.Stage.Value,plr.leaderstats.Deaths.Value,plr.leaderstats.Seconds.Value)
					
						end)
					end)
									
										
			end
		end
			

				end
			end
		end)
	end)
end)

Also the script is in server script service.

For the points going up system:

while wait(2) do
wipeout.Value = wipeout.Value + 1
end

For the data store, I would do:

local file = Datastore:GetAsync(plr.UserId)

if file then
stage.Value = file[1]
wipeouts.Value = file[2]
end
end) -- This is the end for the PlayerAdded event

game.Players.PlayerRemoving:Connect(function(player)
Datastore:SetAsync(plr.UserId, {player.leaderstats.Stage.Value, player.Deaths.Value})

-- This goes after your leaderstats part

This may work out for you

I don’'t know how to change this. I got this error: [14:58:08.484 - ServerScriptService.Checkpoints Script:82: Expected ‘)’ (to close ‘(’ at line 67), got ‘end’

And this is the code :

local dss = game:GetService("DataStoreService")
local Datastore = dss:GetDataStore("ObbyData")
local checkpoints = workspace.Checkpoints
print("Checkpoints leaderstats working")
print("Deaths leaderstats working")
print("Time leaderstats working")
game.Players.PlayerAdded:Connect(function(plr)
	local obbyData = Datastore:GetAsync(plr.UserId .. "-obbyStageProgress")
	local stats = Instance.new("Folder")
	stats.Name = "leaderstats"
	stats.Parent = plr
	local stage = Instance.new("StringValue")
	stage.Name = "Stage"
	stage.Value = obbyData or 1
	stage.Parent = stats
	local wipeouts = Instance.new("IntValue")
	wipeouts.Name = "Deaths"
	wipeouts.Value = 0
	wipeouts.Parent = stats
	
	local second = Instance.new("IntValue")
	second.Name = "Seconds"
	second.Value = stats
	local file = Datastore:GetAsync(plr.UserId)

if file then
stage.Value = file[1]
		wipeouts.Value = file[2]
	second.Value = file[3]
end
end)
game.Players.PlayerRemoving:Connect(function(player)
Datastore:SetAsync(plr.UserId, {player.leaderstats.Stage.Value, player.Deaths.Value}) -- Change "Money" with your currency.
end)

	local char = plr.Character or plr.CharacterAdded:Wait()
	char:WaitForChild("HumanoidRootPart").CFrame = checkpoints[stage.Value].CFrame
	char.Humanoid.Touched:Connect(function(touch)
		if touch.Parent == checkpoints then 
			if (tonumber(touch.Name)and tonumber(touch.Name)>tonumber(stage.Value))or touch.Name == "End" then
				stage.Value = touch.Name
				pcall(function()
					Datastore:SetAsync(plr.UserId.. "-obbyStageProgress", plr.leaderstats.Stage.Value,plr.leaderstats.Deaths.Value,plr.leaderstats.Seconds.Value)
					
				end)
			end
		end
	end)
	plr.CharacterAdded:Connect(function(char)
		local hrp = char:WaitForChild("HumanoidRootPart")
		local humanoid = char:WaitForChild("Humanoid")
		hrp:GetPropertyChangedSignal("CFrame"):Wait()
		hrp.CFrame = checkpoints[stage.Value].CFrame
			
					
		humanoid.Died:Connect(function(touch)
				wipeouts.Value = wipeouts.Value +1
		
			if touch.Parent == checkpoints then
				if (tonumber(touch.Name)and tonumber(touch.Name)>tonumber(stage.Value))or touch.Name == "End"then
					stage.Value = touch.Name
while true do
						wait(2)
						
						wipeout.Value = wipeout.Value + 1	
					end
					pcall(function()
						
						game.Players.PlayerRemoving:Connect(function(player)
							Datastore:SetAsync(plr.UserId.. "-obbyStageProgress", plr.leaderstats.Stage.Value,plr.leaderstats.Deaths.Value,plr.leaderstats.Seconds.Value)		
						end)
					end
						
						
					
					
					
		
	
			

				end)
			end)
		end)
	end)
end)

Change that end to end) [sljdsjsjsd]

Just add in the amount of ends necessary.

I tried that but the bracket at the end of the end you told me is now red. I tried adding more but then the last bracket turns red.

replace the bottom one with this:

plr.CharacterAdded:Connect(function(char)
	humanoid.Died:Connect(function(touch)
		wipeouts.Value = wipeouts.Value +1
		if touch.Parent == checkpoints then
			if (tonumber(touch.Name)and tonumber(touch.Name)>tonumber(stage.Value))or touch.Name == "End"then
				stage.Value = touch.Name
				while wait(2) do	
					wipeout.Value = wipeout.Value + 1	
				end
				pcall(function()
					game.Players.PlayerRemoving:Connect(function(player)
					Datastore:SetAsync(plr.UserId.. "-obbyStageProgress", plr.leaderstats.Stage.Value,plr.leaderstats.Deaths.Value,plr.leaderstats.Seconds.Value)		
				end)
			end				
		end
	end)
end)