I asked this question before but it was not answered so I am just going to ask again. I am making an obby and I need checkpoints. I am creating my checkpoints using the character's Torso and the leaderboard stats. If the player's leaderboard "Stage" stat is 1, then when they die, they will be teleported to Checkpoint 1. To do this, I added a script inside each checkpoint and used functions. The problem is, the player isn't being spawned on the checkpoint. The output shows no errors so I don't know what to do. My script is being shown below and help is much appreciated. Thank you in advanced.
local checkpoint = script.Parent checkpoint.Touched:Connect(function(hit) if hit.Parent:FindFirstChild('Humanoid') then local plr = game.Players:GetPlayerFromCharacter(hit.Parent) plr.leaderstats.Stage.Value = 1 end end) game.Players.PlayerAdded:connect(function(plr) plr.CharacterAdded:connect(function(char) if plr.leaderstats.Stage.Value == 1 then char.Torso.CFrame = game.Workspace.Checkpoint1.CFrame + Vector3.new(0, 10, 0) end end) end)
Use MoveTo and ensure the HumanoidRootPart Exists
example:
game.Players.PlayerAdded:connect(function(Player) Player.CharacterAdded:connect(function(Character) repeat wait() until Character.HumanoidRootPart Character:MoveTo(workspace.Part.Position + Vector3.new(0,5,0)) end) end)
The likely reason that your script was not working is because the player's character is not fully loaded.
ServerScriptService
game.Players.PlayerAdded:Connect(function(player) local ls = Instance.new("Folder") ls.Name = "leaderstats" ls.Parent = player local stage = Instance.new("NumberValue") stage.Name = "Stage" stage.Value = 1 -- or ds3:get(player,'stage') stage.Parent = ls player.CharacterAdded:Connect(function() local part = game.Workspace:FindFirstChild(("Checkpoint%s"):format(tostring(stage.Value))) if not part then print("Part not found") return end -- No part found, can't set CFrame while not player:HasAppearanceLoaded() do wait() end player.Character:SetPrimaryPartCFrame(part.CFrame + Vector3.new(0,3,0)) end) end)
On line 8 when I mention 'ds3' in a comment, that is my own datastore module. It signifies loading a saved stage value from the DataStoreService or a custom datastore module.
On line 15, a loop is created that waits until the system registers that the character has been fully loaded.
This script also handles the teleportation for all checkpoints rather than having a group of redundant scripts.
In each checkpoint
local checkpoint = script.Parent checkpoint.Touched:Connect(function(hit) local plr = game:GetService("Players"):GetPlayerFromCharacter(hit.Parent) -- This method has a possibility for fail, but is good enough for your purposes local stageNum,_ = checkpoint.Name:gsub("Checkpoint","") -- replace Checkpoint with "" stageNum = tonumber(stageNum) if plr and stageNum then -- player and stage number found plr.leaderstats.Stage.Value = stageNum end end)
As it looks like you are naming each checkpoint 'Checkpoint#' (ie. Checkpoint1), this will get the checkpoint number and set the player's stage number in the leaderstats folder accordingly.
As always, if this solves your problem, make sure to accept the answer to further help others with the same/similar issues.