--// SERVICES \\--
local Players = game:GetService("Players")
local DataStore = game:GetService("DataStoreService")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
--// OBJECTS TO CLONE \\--
local objectsToClone = ReplicatedStorage:WaitForChild("ObjectsToClone")
local template = objectsToClone:WaitForChild("Template")
local levelsODS = DataStore:GetOrderedDataStore("Level")
--// VARIABLES \\--
local coinPusher = workspace.CoinPusher
local screens = coinPusher.Screens
local leaderboardScreen = screens.LeaderboardScreen.Display.SurfaceGui.List
local lobby = coinPusher.Lobby
local statuePositions = lobby.StatuePositions
local firstPlace = statuePositions.FirstPlace
local secondPlace = statuePositions.SecondPlace
local thirdPlace = statuePositions.ThirdPlace
local statueHolder = lobby.StatueHolders
--// CONFIGS \\--
local refreshRate = 120
--// FUNCTIONS \\--
local function CreatePlayerStatue(playerUserId, placePosition)
local playerStatue = Players:CreateHumanoidModelFromUserId(playerUserId)
playerStatue.Name = Players:GetNameFromUserIdAsync(playerUserId)
playerStatue:SetPrimaryPartCFrame(placePosition.CFrame * CFrame.new(0,playerStatue.Humanoid.HipHeight * 2.25,0))
playerStatue.Parent = statueHolder
playerStatue.PrimaryPart.Anchored = true
end
local function updateLeaderboards()
local success, errorMessage = pcall(function()
local Data = levelsODS:GetSortedAsync(false, 20)
local LevelsPage = Data:GetCurrentPage()
for rank, data in ipairs(LevelsPage) do
if tonumber(data.key) > 0 then
local userName = Players:GetNameFromUserIdAsync(tonumber(data.key))
local userId = Players:GetUserIdFromNameAsync(userName)
local level = data.value
local isOnLeaderboard = false
if level > 0 and isOnLeaderboard == false and userId > 0 then
local NewLBFrame = template:Clone()
local PlayerName = NewLBFrame:FindFirstChild("PlayerName")
local CurrentLevel = NewLBFrame:FindFirstChild("Levels")
local Rank = NewLBFrame:FindFirstChild("Rank")
PlayerName.Text = userName
CurrentLevel.Text = level
Rank.Text = "#"..rank
print("Created "..tostring(userName).." "..tostring(rank))
NewLBFrame.Parent = leaderboardScreen
if rank == 1 then
PlayerName.TextColor3 = Color3.new(1, 0.705882, 0.227451)
CurrentLevel.TextColor3 = Color3.new(1, 0.705882, 0.227451)
Rank.TextColor3 = Color3.new(1, 0.705882, 0.227451)
CreatePlayerStatue(userId, firstPlace)
elseif rank == 2 then
PlayerName.TextColor3 = Color3.new(0.721294, 0.721279, 0.721279)
CurrentLevel.TextColor3 = Color3.new(0.721294, 0.721279, 0.721279)
Rank.TextColor3 = Color3.new(0.721294, 0.721279, 0.721279)
CreatePlayerStatue(userId, secondPlace)
elseif rank == 3 then
PlayerName.TextColor3 = Color3.new(0.736507, 0.487678, 0.259174)
CurrentLevel.TextColor3 = Color3.new(0.736507, 0.487678, 0.259174)
Rank.TextColor3 = Color3.new(0.736507, 0.487678, 0.259174)
CreatePlayerStatue(userId, thirdPlace)
elseif rank == 6 then
print(userName)
end
end
end
end
end)
if not success then
warn(errorMessage)
end
end
while true do
for _, player in pairs(Players:GetPlayers()) do
local stat = player.leaderstats.Level
levelsODS:SetAsync(player.UserId, stat.Value)
end
for _, frame in pairs(leaderboardScreen:GetChildren()) do
if frame:IsA("Frame") and frame.Name ~= "Title" then
frame:Destroy()
frame = nil
end
end
for _, statue in pairs(statueHolder:GetChildren()) do
statue:Destroy()
statue = nil
end
updateLeaderboards()
print("Updating leaderboard")
task.wait(refreshRate)
end
I followed a tutorial on global leaderboards as DataStores are something I don’t do well with. The global leaderboard works fine until the 5th player. It displays the players from Rank 1 to Rank 5 but then it jumps to Rank 9. What could be causing the issue and how could I fix this?
Thank you!