So I’m making a global leaderboard using Profile Service, but I don’t really know how to access everyone’s profiles. So far my script only accesses the servers players and makes a leaderboard that way. When the player in the server leaves the leaderboard gets readjusted. However I want to make a global leaderboard using profile service and I don’t know how to do that.
My leaderboard Module Script:
local Players = game:GetService("Players")
local ServerScriptService = game:GetService("ServerScriptService")
local Manager = require(ServerScriptService.PlayerData.Manager)
local leaderboard = {}
local FRAME_SPACING = 0.5
leaderboard.sort = function()
local Coins = {}
print(Manager.Profiles)
for player, profile in pairs(Manager.Profiles) do
if profile and profile.Data and type(profile.Data.Coins) == "number" then
table.insert(Coins, { UserId = player.UserId, Value = profile.Data.Coins })
end
end
table.sort(Coins, function(a, b) return a.Value > b.Value end)
local playerFrame = game.Workspace.LeaderBoardCoins.SurfaceGui.ScrollingFrame.PlayerFrame
for _, v in pairs(playerFrame:GetChildren()) do
v:Destroy()
end
for rank, data in ipairs(Coins) do
local userId = data.UserId
local playerName = "Unknown"
local player = Players:GetPlayerByUserId(userId)
if player then
playerName = player.Name
else
local success, result = pcall(function()
return Players:GetNameFromUserIdAsync(userId)
end)
if success then
playerName = result
else
warn("Failed to retrieve player name for userId:", userId)
end
end
print("Rank:", rank, "UserId:", userId, "PlayerName:", playerName, "Coins:", data.Value)
local newrank = game.ReplicatedStorage.LeaderboardFrame:Clone()
newrank.Ranking.Text = tostring(rank)
newrank.Players.Text = playerName
newrank.Amount.Text = tostring(data.Value)
local yPos = (rank - 1) * FRAME_SPACING
newrank.Position = UDim2.new(0, 0, yPos, 0)
newrank.Parent = playerFrame
end
end
return leaderboard
DataStore Script:
local Players = game:GetService("Players")
local ServerScriptService = game:GetService("ServerScriptService")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Template = require(ServerScriptService.PlayerData.Template)
local Manager = require(ServerScriptService.PlayerData.Manager)
local ProfileService = require(ServerScriptService.Libs.ProfileService)
local ProfileStore = ProfileService.GetProfileStore("Production", Template)
local Remotes = ReplicatedStorage.Remotes
local KICK_MESSAGE = "There was an issue loading your data, try again later"
local function CreateLeaderstats(player: Player)
local profile = Manager.Profiles[player]
if not profile then return end
local leaderstats = Instance.new("Folder", player)
leaderstats.Name = "leaderstats"
local Coins = Instance.new("NumberValue", leaderstats)
Coins.Name = "Coins"
local rebirths = Instance.new("NumberValue", leaderstats)
rebirths.Name = "Rebirths"
rebirths.Value = profile.Data.Rebirths
if type(profile.Data.Coins) == "number" then
Coins.Value = profile.Data.Coins
else
warn("Coins value is not a number for player:", player.Name, "Value:", profile.Data.Coins)
Coins.Value = 0
end
Remotes.UpdateClick:FireClient(player, Coins.Value)
end
local function LoadProfile(player: Player)
local profile = ProfileStore:LoadProfileAsync("Player_".. player.UserId)
if not profile then
player:Kick(KICK_MESSAGE)
return
end
profile:AddUserId(player.UserId)
profile:Reconcile()
profile:ListenToRelease(function()
Manager.Profiles[player] = nil
player:Kick(KICK_MESSAGE)
end)
if player:IsDescendantOf(Players) then
Manager.Profiles[player] = profile
CreateLeaderstats(player)
else
profile:Release()
end
end
Players.PlayerAdded:Connect(LoadProfile)
Players.PlayerRemoving:Connect(function(player)
local profile = Manager.Profiles[player]
if profile then
profile:Release()
end
end)
I’m looking, but I don’t see any major flaws or anything standing out. I recommend using module scripts to handle data, but you are doing that. Can you explain a bit more in detail what is wrong or what you’re trying to achieve?
Yeah well it works, but the problem is im trying to create a GLOBAL leaderboard. This script creates a leaderboard. My problem is I have no Idea how to access everyone’s profiles globally using profile service. I just know how to do so locally. When I print “Manager.Profiles” I only get my profiles as I am the only one in the server. However when I am in a different server with people I get all our profiles. But I want to be able to get all our profiles regardless of the server. I want to globally access all data profiles in my game.
I am still a bit confused; I barely understand what you are trying to achieve.
When you say this I imagine you are asking how to make the data accessible via all servers
which you could do using messaging Service - which lets servers communicate with each other
I personally would have just made a datastore and if the player is high to some degree to anyone on the leaderboard I’ d adjust accordingly
You mention doing it locally I assume you meant retrieving the data from the server via remote function.
Towards the end you seem as if you want to list out all data profiles ever made in your game. I will just browse ProfileService API to see If its possible to do that. I doubt it…
If you want to make a Global leaderboard you just need save a table of the TOP whatever 10-20 in a table with there Amount there high in as well as there ID to retrieve that data that way you can access it regardless by calling on there profile using the ID’s on the GLOBAL leaderboard
Yeah thats the thing I have no Idea how to retrieve the data of the top whatever 10-20 there is. I’m not too familiar with Profile Service API so I don’t even know if its possible or not. If so, how would I retrieve the data of the top 10-20? So far the scripts I have gathers the top 10-20 of the people in THE SERVER not the whole game.
Okay Now I understand you want a global leaderboard, then all you gotta do is just make it
By make-it I mean make a datastore for the TOP Whatever it is you want
that would be checking at intervals at all players on the server functions LeaderBoard.Check()
By looping thru the current Global Leaderboard
and Looping the players
This function will check if the player is on it or can be placed on it If Player can be added Leaderboard.Add_Player()
This function will find the placement for the player then add them to that slot
while saving who was in the spot or under and moving that person below them
Currently I think that’s all you would needstarting off atleast
The thing is, the leaderboard script I sent also accesses the data of people in the server. So it makes a leaderboard of the people in the server. Not a global leaderboard having the true top 10 or 20. I have no Idea how to grab the data/profiles of all my players rather than the ones just in a server.
I was letting you know what is needed. How much experience do you have scripting? I could type out a lengthy example of what the code would look like, but then how would you grow?
I am aware of the scripts you sent the thing is, you need to create a new script or new code maybe a new module called ‘GlobalLeaderstats’ that will have the functions I described to handle the new datastore for… global leaderboard
It would not be possible to do anything other than grab the current players on the server check if they fit the requirements to be a TOP leader board member then adding them to the leaderboard via a new datastore (doesn’t even have to be profile service since it wouldn’t be a player but just a data table you access not related to a player)
aswell as adding all the logic and conditions to make sure the leaderboard is fixed properly each addition
So your suggesting I create a new data store to save purely the leaderstats. Then use roblox’s ordered datastores to globally order the leaderboard as such? Thats what I did for my old game using roblox datastore. I just didnt know how to do it with profile service api as i am new to it. As for my scripting experience I’ve scripted for around 1 - 2 years so far.
Profile service was made by a very skilled fellow Robloxian, but it doesn’t upend Roblox systems and has magical new Roblox systems. It utilizes datastore service and has countless usability features here and there for data-saving
On Profile Sevice API ProfileService is a stand-alone ModuleScript that specialises in loading and auto-saving DataStore profiles.
and ProfileService is striving to be a DataStore solution that is the most accurate implementation of data storage following the development guidelines and practices provided in the official Roblox API.
Yeah and thus I decided to give it a try. It’s been great to use but when it comes to accessing all the players data/profiles I just don’t know how to do it… I have been looking through there documentation and all I was able to find is how to globally update everyone’s profiles. I fixed the problem though, it may not be the best but I created another datastore using roblox to just purely save the players leaderstats. Then I was able to use ordered datastores to get everyones leaderstat data and accordingly make the top 20.