I’ve been using some free modeled global leaderboard for a while, and it worked fine at first when the game didn’t have many players, however as more people have played, it seems to get buggy, and doesn’t always update/show the correct top 50 players.
Here’s the script:
local ds = game:GetService("DataStoreService")
local ODS = ds:GetOrderedDataStore("StrengthLb")
function comma(amount)
local formatted = amount
while true do
formatted, k = string.gsub(formatted, "^(-?%d+)(%d%d%d)", '%1,%2')
if (k==0) then
break
end
end
return formatted
end
local function formatnum(number)
local suffixes = {"", "K", "M", "B", "T","Qa","Qi"}
local suffixIndex = 1
while number >= 1000 and suffixIndex < #suffixes do
number = number / 1000
suffixIndex = suffixIndex + 1
end
number = math.floor(number * 100 + 0.5) / 100
return tostring(number) .. suffixes[suffixIndex]
end
local function updateLeaderboard()
for i, plr in pairs(game.Players:GetPlayers()) do
ODS:SetAsync(plr.UserId, math.round(plr.leaderstats.Strength.Value))
end
for i, leaderboardRank in pairs(script.Parent:GetChildren()) do
if leaderboardRank.ClassName == "Frame" then
leaderboardRank:Destroy()
end
end
local success, errorMsg = pcall(function()
local data = ODS:GetSortedAsync(false, 50)
local coinsPage = data:GetCurrentPage()
for rankInLB, dataStored in ipairs(coinsPage) do
if rankInLB <= 50 then -- show top 50 players
local name = game.Players:GetNameFromUserIdAsync(tonumber(dataStored.key))
local userid = game.Players:GetUserIdFromNameAsync(name)
local coins = dataStored.value
local template = script.Template:Clone()
template.Name = name .. "Leaderboard"
template.PlrName.Text = name
template.Rank.Text = "#" .. rankInLB
template.Coins.Text = formatnum(coins)
template.Parent = script.Parent
template.Thumbnail.Image = game.Players:GetUserThumbnailAsync(userid, Enum.ThumbnailType.HeadShot, Enum.ThumbnailSize.Size420x420)
end
end
end)
end
while task.wait(60) do
updateLeaderboard()
end
There are no errors or anything in the output.
Any help would be appreciated!