Roblox Studio - How To Handle Data #3 [Global Leaderboard]

Опубликовано: 06 Май 2026
на канале: Kinfolk Studio
323
10

Today we gonna cover how to create a global leaderboard in Roblox Studio, with the use of Surface GUI and a Ordered Data Store.

Link to pervious How To Handle Data videos:
#1 [In-Game Leaderboard]    • Roblox Studio - How To Handle Data #1 [In-...  
#2 [DataStoreService]    • Roblox Studio - How To Handle Data #2 [Dat...  

GlobalLeaderboardModule module script:
local module = {}

local DataStoreService = game:GetService("DataStoreService")
local GlobalLevelLeaders = DataStoreService:GetOrderedDataStore("GlobalLevelLeaders")

function module.SaveLevelData (Player, PlayerLevel)
local Key = Player.UserId
local Success, ErrMsg = pcall(function()
GlobalLevelLeaders:UpdateAsync(Key, function(oldValue)
if PlayerLevel and oldValue and PlayerLevel ⋗ oldValue then
return PlayerLevel
else
return oldValue or 0
end
end)
end)
if not Success then
print("Datastore failed to save")
end
end
function module.LoadLevelData()
local Pages
local Success, ErrMsg = pcall(function()
Pages = GlobalLevelLeaders:GetSortedAsync(false, 10)
end)
if not Success then
print("Datastore failed to load")
return
end

local TopTen = Pages:GetCurrentPage()
local LevelLeaderBoard = workspace:WaitForChild("LevelLeaderboard"):WaitForChild("Leaderboard"):WaitForChild("SurfaceGui"):WaitForChild("Container")
for i, v in ipairs(LevelLeaderBoard:GetChildren()) do
if v:isA("Frame") then
v:Destroy()
end
end

for rank, data in ipairs(TopTen) do
local Sample = script.LevelRankSample:Clone()
Sample.Rank.Text = rank
Sample.PlayerName.Text = game.Players:GetNameFromUserIdAsync(data.key)
Sample.Level.Text = data.value
Sample.LayoutOrder = rank
Sample.Parent = LevelLeaderBoard
end
end
return module

CreatePlayerData script: [Updated from last video]
local Players = game:GetService("Players")

local ServerScriptService = game:GetService("ServerScriptService")
local DataStoreModule = require(ServerScriptService:WaitForChild("DataStoreModule"))
local GlobalLeaderboardModule = require(ServerScriptService:WaitForChild("GlobalLeaderboardModule"))


local function NewGameSetup(Player)

local InGameData = Instance.new("Folder", Player)
InGameData.Name = "InGameData"

local SavedData = Instance.new("Folder", Player)
SavedData.Name = "SavedData"

local leaderstats = Instance.new("Folder", Player)
leaderstats.Name = "leaderstats"

local Level = Instance.new("IntValue", SavedData)
Level.Name = "Level"

local Exp = Instance.new("IntValue", SavedData)
Exp.Name = "Exp"

local Gold = Instance.new("IntValue", SavedData)
Gold.Name = "Gold"

local SessionPlayedTime = Instance.new("IntValue", InGameData)
SessionPlayedTime.Name = "SessionPlayedTime"

local LevelLS = Instance.new("IntValue", leaderstats)
LevelLS.Name = "Level"

local GoldLS = Instance.new("IntValue", leaderstats)
GoldLS.Name = "Gold"
end

Players.PlayerAdded:Connect(function(Player)
NewGameSetup(Player)

Player.SavedData.Level:GetPropertyChangedSignal("Value"):Connect(function()
Player.leaderstats.Level.Value = Player.SavedData.Level.Value
GlobalLeaderboardModule.SaveLevelData(Player, Player.SavedData.Level.Value)
end)

Player.SavedData.Gold:GetPropertyChangedSignal("Value"):Connect(function()
Player.leaderstats.Gold.Value = Player.SavedData.Gold.Value
end)

DataStoreModule.LoadData(Player)

end)

Players.PlayerRemoving:Connect(function(Player)
DataStoreModule.SaveData(Player)
end)

game:BindToClose(function()
for _, plr in ipairs(Players:GetPlayers()) do
coroutine.wrap(function()
DataStoreModule.SaveData(plr)
end)
end
end)

-- AutoSave and Leaderboard update
while true do
GlobalLeaderboardModule.LoadLevelData()
task.wait(300) -- 5 mins
for _, plr in ipairs(Players:GetPlayers()) do
coroutine.wrap(function()
DataStoreModule.SaveData(plr)
end)
end
end