In this video, we are going to create a checkpoint system that has a GUI button for the player to skip stage. We also slightly touched the concept of remote functions between server and clients.
We are re-using some of the scripts we made in our pervious videos, and if you want to review them, here are the links:
How To Make Teleporters • Roblox Studio - How To Make Teleporters [F...
How To Handle Data #1 • Roblox Studio - How To Handle Data #1 [In-...
How To Handle Data #2 • Roblox Studio - How To Handle Data #2 [Dat...
How To Handle Data #3 • Roblox Studio - How To Handle Data #3 [Glo...
Script under each Checkpoint part:
script.Parent.Touched:Connect(function(hit)
if hit and hit.Parent and hit.Parent:FindFirstChild("Humanoid") then
local Player = game.Players:GetPlayerFromCharacter(hit.Parent)
if Player then
Player.SavedData.CurrentCheckPoint.Value = script.Parent.Name
end
end
end)
Local Script under SkipStage Button:
local Player = game.Players.LocalPlayer
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local ClientToServerRemotes = ReplicatedStorage:WaitForChild("ClientToServerRemotes")
local function onSkipStage(Player)
local SkipResult = ClientToServerRemotes:WaitForChild("SkipStage"):InvokeServer(Player)
if SkipResult == false then
print("Skip failed")
else
print("Skip success")
end
end
script.Parent.Activated:Connect(onSkipStage)
Checkpoints Script in ServerScriptService:
local ServerScriptService = game:GetService("ServerScriptService")
local TeleportModule = require(ServerScriptService:WaitForChild("TeleportModule"))
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local ClientToServerRemotes = ReplicatedStorage:WaitForChild("ClientToServerRemotes")
local Checkpoints = workspace:WaitForChild("Checkpoints")
local CheckpointsSequence = {
"CP001",
"CP002",
"CP003",
"CP004",
"CP005",
}
local function onSkipStage(Player)
if Player.SavedData.CurrentCheckPoint.Value == "" then
return false
end
local NewCheckPoint = ""
for i, v in ipairs(CheckpointsSequence) do
if v == Player.SavedData.CurrentCheckPoint.Value then
if i == #CheckpointsSequence then -- Already at last checkpoint
return false
end
NewCheckPoint = CheckpointsSequence[i+1]
break
end
end
if NewCheckPoint == "" then
return false
end
for i, v in ipairs(Checkpoints:GetChildren()) do
if v.Name == NewCheckPoint then
TeleportModule.TeleportPlayer(Player, v.Position)
return true
end
end
return false -- Error Catch
end
ClientToServerRemotes.SkipStage.OnServerInvoke = onSkipStage