-- src/ServerScriptService/LeaderboardManager.server.lua local Players = game:GetService("Players") local ReplicatedStorage = game:GetService("ReplicatedStorage") local GameConfig = require(ReplicatedStorage:WaitForChild("Shared"):WaitForChild("GameConfig")) -- Create global leaderboard SurfaceGui on a part in the world local leaderboardFolder = Instance.new("Folder") leaderboardFolder.Name = "Leaderboard" leaderboardFolder.Parent = workspace local function createLeaderboardDisplay() local board = Instance.new("Part") board.Name = "LeaderboardBoard" board.Size = Vector3.new(12, 8, 0.5) board.Position = Vector3.new(-10, 8, -80) board.Anchored = true board.Material = Enum.Material.SmoothPlastic board.BrickColor = BrickColor.new("Really black") board.Parent = leaderboardFolder local surfaceGui = Instance.new("SurfaceGui") surfaceGui.Name = "LeaderboardGui" surfaceGui.Face = Enum.NormalId.Front surfaceGui.SizingMode = Enum.SurfaceGuiSizingMode.PixelsPerStud surfaceGui.PixelsPerStud = 50 surfaceGui.Parent = board -- Title local title = Instance.new("TextLabel") title.Name = "Title" title.Size = UDim2.new(1, 0, 0.15, 0) title.Position = UDim2.new(0, 0, 0, 0) title.BackgroundColor3 = Color3.fromRGB(40, 80, 40) title.BorderSizePixel = 0 title.Text = "TOP LUMBERJACKS" title.TextColor3 = Color3.new(1, 1, 1) title.TextScaled = true title.Font = Enum.Font.GothamBold title.Parent = surfaceGui -- Entries container local entriesFrame = Instance.new("Frame") entriesFrame.Name = "Entries" entriesFrame.Size = UDim2.new(1, 0, 0.85, 0) entriesFrame.Position = UDim2.new(0, 0, 0.15, 0) entriesFrame.BackgroundColor3 = Color3.fromRGB(20, 20, 20) entriesFrame.BorderSizePixel = 0 entriesFrame.Parent = surfaceGui local listLayout = Instance.new("UIListLayout") listLayout.SortOrder = Enum.SortOrder.LayoutOrder listLayout.Parent = entriesFrame return entriesFrame end local entriesFrame = createLeaderboardDisplay() local function updateLeaderboard() -- Clear existing entries for _, child in pairs(entriesFrame:GetChildren()) do if child:IsA("TextLabel") then child:Destroy() end end -- Collect player data local playerStats = {} for _, player in ipairs(Players:GetPlayers()) do local leaderstats = player:FindFirstChild("leaderstats") if leaderstats then local cash = leaderstats:FindFirstChild("Cash") if cash then table.insert(playerStats, { name = player.Name, cash = cash.Value, }) end end end -- Sort by cash descending table.sort(playerStats, function(a, b) return a.cash > b.cash end) -- Display top 10 local maxEntries = math.min(#playerStats, 10) for i = 1, maxEntries do local entry = Instance.new("TextLabel") entry.Name = "Entry_" .. i entry.Size = UDim2.new(1, 0, 0, 30) entry.LayoutOrder = i entry.BackgroundTransparency = 0.5 entry.BackgroundColor3 = i % 2 == 0 and Color3.fromRGB(30, 30, 30) or Color3.fromRGB(40, 40, 40) entry.BorderSizePixel = 0 entry.Text = string.format(" #%d %s - $%s", i, playerStats[i].name, tostring(playerStats[i].cash)) entry.TextColor3 = i == 1 and Color3.fromRGB(255, 215, 0) or Color3.new(1, 1, 1) entry.TextXAlignment = Enum.TextXAlignment.Left entry.TextScaled = true entry.Font = Enum.Font.GothamMedium entry.Parent = entriesFrame end end -- Update periodically task.spawn(function() while true do updateLeaderboard() task.wait(15) end end) print("Leaderboard Manager initialized")