-
What do you want to achieve? Keep it simple and clear!
I want to make a leaderboard that gets past the 9.223 quintillion limit since they are a lot of players that have passed it in my game -
What is the issue? Include screenshots / videos if possible!
I can’t get it to work. -
What solutions have you tried so far? Did you look for solutions on the Developer Hub?
I tried a solution from dev forum but i didn’t understand it. i just want to add only to get past the number limit.
Here is THE SCRIPT:
local LeaderboardService = {}
--// Services
local players = game:GetService("Players")
local Workspace = game:GetService("Workspace")
local ds = game:GetService("DataStoreService")
local ServerStorage = game:GetService("ServerStorage")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
--// Variables
local DataFolder = ServerStorage:WaitForChild("Data")
local leaderboardsFol = game.Workspace:WaitForChild("Leaderboards")
local Stands = leaderboardsFol:WaitForChild("Stands")
local InvisibleBoxes = Stands:WaitForChild("InvisibleBoxes")
local NPCS = Stands:WaitForChild("NPCS")
local RepModules = ReplicatedStorage:WaitForChild("Modules")
local proto = ServerStorage.ItemStorage.Extra.LeaderboardFrame
local overAllVersion = require(DataFolder.UserDataKey).LeaderboardKeyVersion
local waitTimePerLeaderboard = (#leaderboardsFol:GetChildren()) - 1
local UpdateGoalsCounter, UpdateServerMessage = 0, 0
--// Modules
local DataController = require(DataFolder.DataController)
local TimePlayedModule = require(script.Parent.TimePlayed)
local Abbreviate = require(RepModules.Abbreviate)
local timeString = require(RepModules.TimeString)
local notOnLeaderboards = require(script.BannedLeaderboardUsers)
local CommunityGoalsModule = require(script.Parent.CommunityGoals)
local ChestServerController = require(script.Parent.Parent.Chests.ChestServerController)
local ServerChatMessagesModule = require(script.Parent.Parent.Egg.EggServerHandler.ServerChatMessages)
local PetHandler = require(script.Parent.Parent.Pet.PetHandler)
--// Leaderboards
local leaderboards = {}
for _, v in pairs(leaderboardsFol:GetChildren()) do
if v:IsA("Model") then
leaderboards[v.Name] = v
end
end
--// Update Variables
local CAN_RUN_MODULE = true
local UPDATE_TIME = 180
local divider = 10000
local rebirthDivider = 1
local minimalVal = 1
--// DataStores
local Clicks_DataStore = ds:GetOrderedDataStore("Clicks_Leaderboard_"..overAllVersion)
local Gems_DataStore = ds:GetOrderedDataStore("Gems_Leaderboard_"..overAllVersion)
local Rebirths_DataStore = ds:GetOrderedDataStore("Rebirths_Leaderboard_"..overAllVersion)
local Super_Rebirths_DataStore = ds:GetOrderedDataStore("S_Rebirths_Leaderboard_"..overAllVersion)
local TimePlayed_DataStore = ds:GetOrderedDataStore("TimePlayed_Leaderboard_"..overAllVersion)
local TopEggHatch_DataStore = ds:GetOrderedDataStore("TopEggHatch_Leaderboard_"..overAllVersion)
local TopStreaks_DataStore = ds:GetOrderedDataStore("TopStreaks_Leaderboard_"..overAllVersion)
--// Local Functions
local getDataStore = function(name)
if name == "Clicks" then
return Clicks_DataStore
elseif name == "Gems" then
return Gems_DataStore
end
end
function LeaderboardService:GetStat(plr, statName)
return DataController:GetStatFromPlayer(plr, tostring(statName))
end
local getValForDataSet = function(plr, name)
if name == "Clicks" then
local clicks = LeaderboardService:GetStat(plr, "TotalClicks")
return tonumber(clicks), true
elseif name == "Gems" then
local gems = LeaderboardService:GetStat(plr, "TotalGems")
return tonumber(gems), true
elseif name == "Rebirths" then
local rebirths = LeaderboardService:GetStat(plr, "TotalRebirths")
return tonumber(rebirths), true
elseif name == "TopSuperRebirths" then
local superRebirths = LeaderboardService:GetStat(plr, "TotalSuperRebirths")
return tonumber(superRebirths), false
elseif name == "TopTime" then
local timePlayed = TimePlayedModule:UpdateTimePlayed(plr)
return timePlayed, false
elseif name == "TopEggHatch" then
local eggsHatched = LeaderboardService:GetStat(plr, "TotalEggsOpened")
return eggsHatched, false
elseif name == "TopStreaks" then
local currentStreak, last2DayClaim = ChestServerController:GetCurrentStreak(plr, "Daily Chest")
if (os.time() - last2DayClaim) >= (48 * 3600) then
return 0, false
else
return currentStreak, false
end
end
end
local Round_Function = function(n)
return (n + 0.5) - (n + 0.5) % 1
end
local errorMsg = function(msg, name, plrName)
warn("Error For "..tostring(plrName).."'s "..tostring(name).." Leaderboard! Error:", tostring(msg))
end
local cloneUI = function(leaderboardName, rank, name, val, parent)
if leaderboardName and rank and name and val and parent then
if tonumber(val) >= minimalVal then
local clone = proto:Clone()
clone.PlayerName.Text = tostring(name)
clone.Rank.Text = "#"..tostring(rank)
clone.Name = tostring(name)
clone.LayoutOrder = tonumber(rank)
if leaderboardName == "TopTime" then
clone.Amount.Text = timeString(tonumber(val))
elseif leaderboardName == "Clicks" or leaderboardName == "Gems" then
local newVal = tonumber(val) * divider
clone.Amount.Text = Abbreviate:ReturnShort(tonumber(newVal))
elseif leaderboardName == "Rebirths" then
local newVal = tonumber(val) * rebirthDivider
clone.Amount.Text = Abbreviate:ReturnShort(tonumber(newVal))
else
clone.Amount.Text = Abbreviate:ReturnShort(tonumber(val))
end
clone.BackgroundColor3 = Color3.fromRGB(189, 136, 0)
clone.Visible = true
clone.Parent = parent
end
end
end
function LeaderboardService:BanHacker(plrName)
spawn(function()
local plrID = nil
local Success, Err = pcall(function()
plrID = players:GetUserIdFromNameAsync(tostring(plrName))
end)
if plrID ~= nil then
for _, v in pairs(leaderboardsFol:GetChildren()) do
if v:IsA("Model") then
local leaderboardName = v.Name
local set, fail = pcall(function()
local data = getDataStore(leaderboardName)
if data ~= nil then
data:RemoveAsync(plrID)
else
errorMsg("DataStore was nil or not a DataStore", leaderboardName, tostring(plrName))
end
end)
end
end
end
end)
end
function LeaderboardService:GiveTrophyPetToPlayer(PlayerName)
local Player = players:FindFirstChild(tostring(PlayerName))
if Player ~= nil then
spawn(function()
PetHandler:GiveTrophyPet(Player)
end)
end
end
function LeaderboardService:UpdateNumber1Player(leaderboardName, PlayerName, PlayerUserId)
if leaderboardName ~= nil and PlayerName ~= nil and PlayerUserId ~= nil then
if tostring(leaderboardName) == "TopEggHatch" then return end
spawn(function()
local npc = NPCS:FindFirstChild(tostring(leaderboardName))
if npc == nil then
warn("No NPC For "..tostring(leaderboardName).."!")
return
end
local OwnerTag = npc:FindFirstChild("Owner")
if OwnerTag == nil then
OwnerTag = Instance.new("StringValue")
OwnerTag.Name = "Owner"
OwnerTag.Parent = npc
end
if OwnerTag.Value == tostring(PlayerName) then else
local Description
local good, fail = pcall(function()
Description = players:GetHumanoidDescriptionFromUserId(PlayerUserId)
end)
if good and not fail then
if Description ~= nil then
local humanoid = npc:FindFirstChild("Humanoid")
if humanoid ~= nil then
humanoid:ApplyDescription(Description)
OwnerTag.Value = tostring(PlayerName)
end
end
else
warn("Error On Gett Humanoid Description From UserId: ".. tostring(PlayerUserId))
end
end
end)
end
end
local cache = {}
local function GetNameFromUserId(userId)
if userId == nil then
return "[ Name Didn't Load ]"
end
if tonumber(userId) <= 0 then
return "[ Name Didn't Load ]"
end
if cache[userId] then
return cache[userId]
end
local player = players:GetPlayerByUserId(userId)
if player then
cache[userId] = player.Name
return player.Name
end
local name
local set, err = pcall(function()
name = players:GetNameFromUserIdAsync(userId)
end)
if set and not err then
cache[userId] = name
return name
else
warn("Error On Getting Player Name From UserId (".. tostring(userId)..")")
end
return "[ Name Didn't Load ]"
end
function LeaderboardService:UpdateLeaderboard(leaderboardName, data, parent, start)
if leaderboardName ~= nil and data ~= nil and parent ~= nil then
local page = nil
local Success, Err = pcall(function()
local Data = data:GetSortedAsync(false, 100)
page = Data:GetCurrentPage()
end)
if Success and not Err and page ~= nil then
for Rank, Data in ipairs(page) do
local UserId, Value = Data.key, Data.value
local Name = GetNameFromUserId(UserId)
if UserId ~= nil and Value ~= nil and Name ~= nil then
if tonumber(Rank) == 1 then
self:UpdateNumber1Player(leaderboardName, Name, UserId)
if start == false then
self:GiveTrophyPetToPlayer(Name)
end
end
cloneUI(leaderboardName, Rank, Name, Value, parent)
end
end
end
end
end
function LeaderboardService:SetLeaderboardData(plr)
if notOnLeaderboards[plr.UserId] == true or notOnLeaderboards[plr.Name] == true then else
for _, v in pairs(leaderboardsFol:GetChildren()) do
if v:IsA("Model") then
local leaderboardName = v.Name
local set, fail = pcall(function()
local data = getDataStore(leaderboardName)
if data ~= nil then
local amount, divTrue = getValForDataSet(plr, leaderboardName)
if amount ~= nil and type(tonumber(amount)) == "number" then
if tonumber(amount) > 0 then
if divTrue == true then
local divAmount = divider
if leaderboardName == "Rebirths" then
divAmount = rebirthDivider
end
local setAmount = Round_Function(tonumber(amount))
local newAmount = setAmount / divAmount
newAmount = Round_Function(tonumber(newAmount))
data:SetAsync(plr.UserId, tonumber(newAmount))
else
local setAmount = Round_Function(tonumber(amount))
data:SetAsync(plr.UserId, tonumber(setAmount))
end
end
else
errorMsg("The Amount To Set for the DataStore was nil or not a number", leaderboardName, plr.Name)
end
else
errorMsg("DataStore was nil or not a DataStore", leaderboardName, plr.Name)
end
end)
if fail and not set then
errorMsg(fail, leaderboardName, plr.Name)
end
wait(1)
end
end
end
end
function LeaderboardService:LoadAnimations()
spawn(function()
for _, invisibleBox in pairs(InvisibleBoxes:GetDescendants()) do
if invisibleBox:IsA("BasePart") then
invisibleBox.Transparency, invisibleBox.CanCollide = 1, true
end
end
for _, npc in pairs(NPCS:GetChildren()) do
local anim = npc:FindFirstChildWhichIsA("Animation")
if anim ~= nil then
local humanoid = npc:FindFirstChild("Humanoid")
if humanoid ~= nil then
local animLoaded = humanoid:LoadAnimation(anim)
animLoaded:Play()
end
end
end
end)
end
function LeaderboardService:StartLeaderboards(start)
local function updateLeaderboard()
for leaderboardName, leaderboard in pairs(leaderboards) do
if leaderboard:FindFirstChild("Board") ~= nil then
if leaderboard:FindFirstChild("Board"):FindFirstChild("SurfaceGui") ~= nil then
local frameParent = leaderboard.Board.SurfaceGui.ScrollingFrame
for _, v in pairs(frameParent:GetChildren()) do
if v:IsA("Frame") or v:IsA("ImageLabel") or v:IsA("ImageButton") then
v:Destroy()
end
end
local data = getDataStore(leaderboardName)
if data ~= nil then
self:UpdateLeaderboard(leaderboardName, data, frameParent, start) wait()
else
warn(leaderboardName.." does not have a DataStore!")
end
else
warn(leaderboardName.." does not have a leaderboard gui inside!")
end
else
warn(leaderboardName.." does not have a board inside!")
end
end
end
if start == true then
self:LoadAnimations()
updateLeaderboard()
else
for _, plr in pairs(players:GetPlayers()) do
self:SetLeaderboardData(plr)
end
updateLeaderboard()
end
end
function LeaderboardService:CanRun()
return CAN_RUN_MODULE
end
function LeaderboardService:Initialize()
spawn(function()
self:StartLeaderboards(true) wait(1)
while true do
wait(UPDATE_TIME)
spawn(function()
self:StartLeaderboards(false)
end)
local numOfPlrs = #players:GetPlayers()
wait(5 + (numOfPlrs * waitTimePerLeaderboard))
UpdateServerMessage += 1
if UpdateServerMessage >= 2 then
UpdateServerMessage = 0
ServerChatMessagesModule:SpeakMessage(nil, nil)
end
UpdateGoalsCounter += 1
if UpdateGoalsCounter >= 6 then
UpdateGoalsCounter = 0
CommunityGoalsModule:SetBoard()
end
end
end)
end
return LeaderboardService
please help me to fix this problem ASAP.