Simple Roblox Checkpoint Script for Your Obby

If you're building an obby, setting up a reliable roblox checkpoint script is probably the single most important thing you can do to keep people playing. There is nothing more frustrating for a player than getting through fifteen difficult jumps, falling on the sixteenth, and being sent all the way back to the start of the game. Most people will just leave at that point, and I don't blame them.

Checkpoints give your players a sense of progress. It lets them know that their hard work is being saved and that they're actually getting somewhere. In this post, I want to walk you through how to set up a clean, functional checkpoint system using a script that tracks a player's stage through leaderstats. This is the classic "Stage 1, Stage 2" counter you see in almost every popular obstacle course on the platform.

Why Leaderstats Are Better for Checkpoints

You might have seen some older tutorials where people use the Teams service to handle checkpoints. While that works, it can get a bit cluttered if you have fifty different levels. Using a leaderstats-based roblox checkpoint script is much cleaner. It puts a little counter in the top right corner of the screen so everyone can see who's in the lead, which adds a nice competitive element to your game.

Plus, it's just easier to manage. You can name your parts "1", "2", "3", and so on, and the script will automatically handle the rest. It keeps your Explorer window organized and makes it way simpler to add new levels later on without having to mess with team colors or complicated settings.

Setting Up Your Checkpoint Parts

Before we even touch the code, you need some physical parts for the players to step on. In your Workspace, it's a good idea to create a Folder and name it something like Checkpoints. This keeps everything neat.

Inside that folder, place a bunch of Parts (or SpawnLocations, though Parts are often easier to customize). Name the first one 1, the second one 2, and just keep going until you have enough for your levels. Make sure they are Anchored and that CanTouch is turned on. You can make them look like glowing neon pads or just simple tiles—the script doesn't care about the visuals, only the names.

The Core Roblox Checkpoint Script

Now for the actual coding. You'll want to create a Script (not a LocalScript) inside ServerScriptService. This ensures the server is the one keeping track of progress, which prevents players from easily cheating their stage number.

Here's a solid, reliable script you can drop in:

```lua local Players = game:GetService("Players")

Players.PlayerAdded:Connect(function(player) local leaderstats = Instance.new("Folder") leaderstats.Name = "leaderstats" leaderstats.Parent = player

local stage = Instance.new("IntValue") stage.Name = "Stage" stage.Value = 1 -- Everyone starts at level 1 stage.Parent = leaderstats player.CharacterAdded:Connect(function(character) task.wait(0.1) -- Give the character a moment to load local checkpointFolder = workspace:FindFirstChild("Checkpoints") if checkpointFolder then local currentCheckpoint = checkpointFolder:FindFirstChild(tostring(stage.Value)) if currentCheckpoint then character:MoveTo(currentCheckpoint.Position + Vector3.new(0, 3, 0)) end end end) 

end)

-- Handling the touch event for all checkpoints local checkpoints = workspace:WaitForChild("Checkpoints"):GetChildren()

for _, checkpoint in pairs(checkpoints) do checkpoint.Touched:Connect(function(hit) local character = hit.Parent local player = Players:GetPlayerFromCharacter(character)

 if player then local stage = player.leaderstats.Stage local checkpointNumber = tonumber(checkpoint.Name) if checkpointNumber == stage.Value + 1 then stage.Value = checkpointNumber -- You could add a sound effect or a particle here! end end end) 

end ```

Breaking Down How It Works

I know some people just like to copy and paste, but it's actually pretty helpful to understand what's going on under the hood if something breaks.

The first half of the script handles the Leaderstats. When a player joins, it creates a folder and an IntValue. We set that value to 1 by default. The CharacterAdded part is what actually teleports the player. Every time they respawn (like after they fall into the "lava"), the script looks at their current Stage value, finds the part in the Checkpoints folder with that name, and moves their character there.

The second half handles the Touch Detection. We loop through every part in your Checkpoints folder. If a player touches a part named "2" and they are currently on Stage 1, it bumps them up to Stage 2. Notice that I added a check: if checkpointNumber == stage.Value + 1. This is important because it prevents players from skipping levels by jumping ahead to a later checkpoint. They have to hit them in order.

Making the Checkpoints Feel Good

Having a functional roblox checkpoint script is a great start, but you want it to feel rewarding. When a player hits a new stage, give them some feedback.

One simple trick is to change the color of the checkpoint once it's been activated. You can do this by adding a line inside the Touched function like checkpoint.Color = Color3.fromRGB(0, 255, 0). However, since this script runs on the server, it would change the color for everyone.

If you want the color change to be unique for each player, you'd actually want to handle the visual side of things in a LocalScript. But let's keep it simple for now. A loud "ding" sound or some sparkly particles are usually enough to make the player feel like they've achieved something. You can just put a Sound object into the checkpoint part and use :Play() in the script whenever the stage value increases.

Common Issues and Troubleshooting

If your roblox checkpoint script isn't working, the first thing to check is the names of your parts. Computers are incredibly picky. If your folder is named "Checkpoints" but your script says "checkpoints" (lowercase), it won't work. Same goes for the numbers. Make sure your parts are named "1", "2", and "3" exactly, with no extra spaces.

Another common headache is the teleportation. Sometimes the player might spawn slightly inside the part and get stuck, or they might spawn and immediately fall over. That's why I added + Vector3.new(0, 3, 0) to the teleport position. It drops them just a little bit above the pad so they land cleanly.

Also, make sure your checkpoints are Anchored. If they aren't, they'll just fall through the floor as soon as the game starts, and your script won't be able to find them because they'll be sitting in the void at the bottom of the map.

Adding a "Skip Stage" Button (If You're Feeling Capitalistic)

If you're planning on making your game a bit more "pro," you might want to add a way for players to skip a level they're stuck on. This is usually done with a Developer Product. You don't need to rewrite your whole roblox checkpoint script for this. You just need a separate script that listens for a purchase and then simply adds 1 to the player's stage.Value.

Because our teleport logic is tied to the CharacterAdded event, as soon as their stage value goes up and they reset (or you force them to reset), they will automatically spawn at the next checkpoint. It's a very flexible system.

Final Thoughts on Obby Design

A script is just a tool; the way you use it is what makes your game fun. When placing your checkpoints, think about the difficulty curve. Early on, you should probably have a checkpoint after every two or three jumps. As the game gets harder, you can space them out more to increase the tension.

Just remember: the roblox checkpoint script is there to help the player, not frustrate them. Keep your stages clearly numbered and make sure the pads are big enough that players don't accidentally miss them while they're running.

Once you have this basic system down, you can start getting fancy—maybe add a "Total Deaths" counter or a timer to see who can finish the whole obby the fastest. The possibilities are pretty much endless once you have a solid foundation for tracking progress. Happy building!