Hey, I have a issue with making global leaderboard for this script:
local datastores = game:GetService("DataStoreService")
local datastore = datastores:GetDataStore("DataStore1")
local function serializeData(player)
local data = {}
local leaderstats = player.Records
for i, v in ipairs(leaderstats:GetChildren()) do
table.insert(data, {name = v.Name, value = v.Value})
end
return data
end
game.Players.PlayerAdded:Connect(function(plr)
local itemsfolder = Instance.new("Folder", plr)
itemsfolder.Name = "Records"
for i,v in pairs(game:GetService("ReplicatedStorage"):WaitForChild("Levels"):GetChildren()) do
local e = Instance.new("IntValue", itemsfolder)
e.Name = v.Name
e.Value = 0
end
if datastore:GetAsync("Stats_"..plr.UserId) then -- found data loading it
for i,v in pairs(datastore:GetAsync("Stats_"..plr.UserId)) do
if itemsfolder:FindFirstChild(v.name) then
itemsfolder:FindFirstChild(v.name).Value = v.value
end
end
else -- didn't found data making new one
local e = serializeData(plr)
datastore:SetAsync("Stats_"..plr.UserId, e)
end
end)
game.Players.PlayerRemoving:Connect(function(plr)
local e = serializeData(plr)
if datastore:GetAsync("Stats_"..plr.UserId) then -- found data saving it
datastore:SetAsync("Stats_"..plr.UserId, e)
else
datastore:SetAsync("Stats_"..plr.UserId, e) -- didn't found data saving anyway
end
end)
How can I make a leaderboard for that?
Thanks for any help!
Create a separate script that retrieves data from the DS, sorts it based on the desired values, and updates a GUI element representing the leaderboard with the sorted data.
I already have a script that continuously updates the leaderboard GUI by retrieving the sorted data from the DS, creating GUI elements, and displaying the top 10 players based on the specified values, here you go, change whatever you need to Xx
Put this in serverscriptservice:
local leaderboardGui = -- Replace this with the code to reference your leaderboard GUI
local function updateLeaderboard()
-- Clear the existing leaderboard entries
for _, child in ipairs(leaderboardGui:GetChildren()) do
child:Destroy()
end
local sortedData = datastore:GetSortedAsync(false, 10) -- Sort in descending order, limit to top 10 players
for rank, entry in ipairs(sortedData) do
local playerName = entry.key
local value = entry.value
local entryFrame = Instance.new("Frame")
entryFrame.Size = UDim2.new(1, 0, 0, 30)
entryFrame.Parent = leaderboardGui
local rankLabel = Instance.new("TextLabel")
rankLabel.Size = UDim2.new(0, 30, 1, 0)
rankLabel.Position = UDim2.new(0, 0, 0, 0)
rankLabel.Text = tostring(rank)
rankLabel.Parent = entryFrame
local nameLabel = Instance.new("TextLabel")
nameLabel.Size = UDim2.new(0.6, -30, 1, 0)
nameLabel.Position = UDim2.new(0, 30, 0, 0)
nameLabel.Text = playerName
nameLabel.Parent = entryFrame
local valueLabel = Instance.new("TextLabel")
valueLabel.Size = UDim2.new(0.4, 0, 1, 0)
valueLabel.Position = UDim2.new(0.6, 0, 0, 0)
valueLabel.Text = tostring(value)
valueLabel.Parent = entryFrame
end
end
updateLeaderboard()
while true do
wait(60) -- Wait for 60 seconds
updateLeaderboard()
end