OrderDatastore sorting

I have two leaderboard scripts which used to how from highest to lowest but because they are deaths and average deaths per stage, I wanted whoever has the lowest to be number one. I change the parameter in the get sorted async to true:

 local Data =WinsLeaderboard2:GetSortedAsync(true, 5)

But now the data is not showing properly. My deaths value is over 50 but it shows something else on the leaderboard.This happens with deaths and average deaths and the average value is rounded so it should be 8 on the leaderboard. Here is a video:


The full script (do not mind the seconds value, it works):

 local DataStoreService = game:GetService("DataStoreService")
local WinsLeaderboard = DataStoreService:GetOrderedDataStore("ObbyData")
local WinsLeaderboard1 = DataStoreService:GetOrderedDataStore("AvgDStore")
local WinsLeaderboard2 = DataStoreService:GetOrderedDataStore("ObbyDatas")

local function updateLeaderboard()
        local success, errorMessage = pcall (function()
                local Data =WinsLeaderboard:GetSortedAsync(false, 5)
                local WinsPage = Data:GetCurrentPage()
                for Rank, data in ipairs(WinsPage) do
                       local userName = game.Players:GetNameFromUserIdAsync(tonumber(data.key))
                       local Name = userName
                       local Seconds = data.value
                       local isOnLeaderboard = false
                       for i, v in pairs(game.Workspace.Locations.Leaderboardarea.LeaderboardArea.Leaderboard.LeaderboardGUI.Holder:GetChildren()) do
                             if v.Name2.Text == Name then
                                  isOnLeaderboard = true
                                  break
                           end
                    end

                     if Seconds and isOnLeaderboard == false then
                            local newLbFrame = game.ReplicatedStorage:WaitForChild("LeaderboardFrame"):Clone()
                            newLbFrame.Name2.Text = Name
                            newLbFrame.TimeSpent.Text = Seconds
                            newLbFrame.Rank.Text = "#"..Rank
                            newLbFrame.Position = UDim2.new(0, 0, newLbFrame.Position.Y.Scale + (.08 * #game.Workspace.Locations.Leaderboardarea.LeaderboardArea.Leaderboard.LeaderboardGUI.Holder:GetChildren()), 0)
                            newLbFrame.Parent = game.Workspace.Locations.Leaderboardarea.LeaderboardArea.Leaderboard.LeaderboardGUI.Holder 
                     end
              end
      end)

      if not success then
            print(errorMessage)
      end
end
local function updateLeaderboard1()
	
        local success, errorMessage = pcall (function()
                local Data =WinsLeaderboard1:GetSortedAsync(true, 5)
                local WinsPage = Data:GetCurrentPage()
                for Rank, data in ipairs(WinsPage) do
                       local userName = game.Players:GetNameFromUserIdAsync(tonumber(data.key))
                       local Name = userName
			                       local AvgD = data.value
		
                       local isOnLeaderboard = false
                       for i, v in pairs(game.Workspace.Locations.Leaderboardarea.LeaderboardArea3.Leaderboard.LeaderboardGUI.Holder:GetChildren()) do
                             if v.Name2.Text == Name then
                                  isOnLeaderboard = true
                                  break
                           end
                    end

                     if AvgD and isOnLeaderboard == false then
                            local newLbFrame = game.ReplicatedStorage:WaitForChild("LeaderboardFrame"):Clone()
                            newLbFrame.Name2.Text = Name
                            newLbFrame.TimeSpent.Text = AvgD 
                            newLbFrame.Rank.Text = "#"..Rank
                            newLbFrame.Position = UDim2.new(0, 0, newLbFrame.Position.Y.Scale + (.08 * #game.Workspace.Locations.Leaderboardarea.LeaderboardArea3.Leaderboard.LeaderboardGUI.Holder:GetChildren()), 0)
                            newLbFrame.Parent = game.Workspace.Locations.Leaderboardarea.LeaderboardArea3.Leaderboard.LeaderboardGUI.Holder 
                     end 
			              end
			
		      end)
		

      if not success then
            print(errorMessage)
      end
end
local function updateLeaderboard2()
        local success, errorMessage = pcall (function()
                local Data =WinsLeaderboard2:GetSortedAsync(true, 5)
                local WinsPage = Data:GetCurrentPage()
                for Rank, data in ipairs(WinsPage) do
                       local userName = game.Players:GetNameFromUserIdAsync(tonumber(data.key))
                       local Name = userName
                       local Deaths = data.value
                       local isOnLeaderboard = false
                       for i, v in pairs(game.Workspace.Locations.Leaderboardarea.LeaderboardArea2.Leaderboard.LeaderboardGUI.Holder:GetChildren()) do
                             if v.Name2.Text == Name then
                                  isOnLeaderboard = true
                                  break
                           end
                    end

                     if Deaths and isOnLeaderboard == false then
                            local newLbFrame = game.ReplicatedStorage:WaitForChild("LeaderboardFrame"):Clone()
                            newLbFrame.Name2.Text = Name
                            newLbFrame.TimeSpent.Text = Deaths
                            newLbFrame.Rank.Text = "#"..Rank
                            newLbFrame.Position = UDim2.new(0, 0, newLbFrame.Position.Y.Scale + (.08 * #game.Workspace.Locations.Leaderboardarea.LeaderboardArea2.Leaderboard.LeaderboardGUI.Holder:GetChildren()), 0)
                            newLbFrame.Parent = game.Workspace.Locations.Leaderboardarea.LeaderboardArea2.Leaderboard.LeaderboardGUI.Holder 
                     end
              end
      end)

      if not success then
            print(errorMessage)
      end
end
local g =0
wait(30)
while true do

	        for _, player in pairs(game.Players:GetPlayers()) do
		local Avg =  math.floor(player.leaderstats["Avg Deaths"].Value + 0.5)
              WinsLeaderboard:SetAsync(player.UserId, player.leaderstats.Seconds.Value,player.UserId, player.leaderstats.Deaths.Value,player.UserId, Avg)
        end

        for _, frame in pairs (game.Workspace.Locations.Leaderboardarea.LeaderboardArea.Leaderboard.LeaderboardGUI.Holder:GetChildren(),game.Workspace.Locations.Leaderboardarea.LeaderboardArea2.Leaderboard.LeaderboardGUI.Holder:GetChildren(),game.Workspace.Locations.Leaderboardarea.LeaderboardArea3.Leaderboard.LeaderboardGUI.Holder:GetChildren()) do
              frame:Destroy()
	        end
        updateLeaderboard()
	updateLeaderboard1()
	updateLeaderboard2()	 
       
	g = g+1
	        print("Updated Seconds Leaderboard!",g)
	print("Updated Deaths Leaderboard!",g)
	print("Updated Avg Deaths Leaderboard!",g)

        wait(60)
end	

	
	
	
	
	
2 Likes

I’m not 100% confident here but I think part of your issue is that you’re not updating the WinsLeaderboard1 or WinsLeaderboard2 ordered data stores when you update the leaderboards so it’s not saving up to date information. Let me know if that helped!

1 Like

At the bottom of the script I have a while loop which saves it.

1 Like

But you only use SetAsync on WinsLeaderboard. I don’t see where you save data to numbers 1 and 2.

2 Likes

oh my god, i am so dumb . it worked!!! You are amazing!!! :grinning::grinning::grinning::grinning::grinning::grinning::grinning::grinning:
Capture

1 Like