Help with removing data

hi, i need help real quick with a thing that is probably really easy but i’m not that brilliant so i will ask for help

  1. What do you want to achieve? I want to turn my global leaderboard into a server leaderboard

  2. What is the issue? i know the solution would be removing the datastore, but this script (not mine) is all about the datastore, and if i remove it, it automatically removes important variables, so i don’t know how to remove the data without affecting the mechanism of the script

  3. What solutions have you tried so far? i looked around on the forum and tried myself to remove the datastore, but as i said i couldn’t fix it

here is the script

-- [ SETTINGS ] --

local statsName = "Kills" -- Your stats name
local maxItems = 100 -- Max number of items to be displayed on the leaderboard
local minValueDisplay = 1 -- Any numbers lower than this will be excluded
local maxValueDisplay = 10e15 -- (10 ^ 15) Any numbers higher than this will be excluded
local abbreviateValue = true -- The displayed number gets abbreviated to make it "human readable"
local updateEvery = 30 -- (in seconds) How often the leaderboard has to update

-- [ END SETTINGS ] --




-- Don't edit if you don't know what you're doing --

local DataStoreService = game:GetService("DataStoreService")
local Players = game:GetService("Players")
local DataStore = DataStoreService:GetOrderedDataStore("GlobalLeaderboard_" .. statsName)
local Frame = script.Parent.Frame
local Contents = Frame.Contents
local Template = script.objTemplate

local COLORS = {
	Default = Color3.fromRGB(255,255,255),
	Gold = Color3.fromRGB(255, 215, 0),
	Silver = Color3.fromRGB(192, 192, 192),
	Bronze = Color3.fromRGB(205, 127, 50)
}
local ABBREVIATIONS = { "K", "M", "B", "T" }


local function toHumanReadableNumber(num)
	if num < 1000 then
		return tostring(num)
	end
	
	local digits = math.floor(math.log10(num)) + 1
	local index = math.min(#ABBREVIATIONS, math.floor((digits - 1) / 3))
	local front = num / math.pow(10, index * 3)
	
	return string.format("%i%s+", front, ABBREVIATIONS[index])
end

local function getItems()
	local data = DataStore:GetSortedAsync(false, maxItems, minValueDisplay, maxValueDisplay)
	local topPage = data:GetCurrentPage()

	Contents.Items.Nothing.Visible = #topPage == 0 and true or false

	for position, v in ipairs(topPage) do
		local userId = v.key
		local value = v.value
		local username = "[Not Available]"
		local color = COLORS.Default

		local success, err = pcall(function()
			username = Players:GetNameFromUserIdAsync(userId)
		end)

		if position == 1 then
			color = COLORS.Gold
		elseif position == 2 then
			color = COLORS.Silver
		elseif position == 3 then
			color = COLORS.Bronze
		end

		local item = Template:Clone()
		item.Name = username
		item.LayoutOrder = position
		item.Values.Number.TextColor3 = color
		item.Values.Number.Text = position
		item.Values.Username.Text = username
		item.Values.Value.Text = abbreviateValue and toHumanReadableNumber(value) or value
		item.Parent = Contents.Items
	end
end

while true do
	for _, player in pairs(Players:GetPlayers()) do
		local leaderstats = player:FindFirstChild("leaderstats")

		if not leaderstats then
			warn("Couldn't find leaderstats!")
			break
		end

		local statsValue = leaderstats:FindFirstChild(statsName)

		if not statsValue then
			warn("Couldn't find " .. statsName .. " in leaderstats!")
			break
		end

		pcall(function()
			DataStore:UpdateAsync(player.UserId, function()
				return tonumber(statsValue.Value)
			end)
		end)
	end

	for _, item in pairs(Contents.Items:GetChildren()) do
		if item:IsA("Frame") then
			item:Destroy()
		end
	end

	getItems()

	wait()
	Contents.GuideTopBar.Value.Text = statsName
	wait(updateEvery)
end

thank you in advance ;D

1 Like

The simplest thing to do would be to create a server-side module and essentially use that as a replica of the datastore you’re using. You’d then obviously need to get rid of some of the datastore-oriented code (pcalls etc.).

1 Like

i tried, but as i said if i remove the lines of the datastore lots of variables will be removed

local data_store_service = game:GetService("DataStoreService")
local data_store_page = data_store_service:GetOrderedDataStore("GlobalLeaderboard_" .. statsName)
local data_store_server = data_store_service:GetDataStore("GlobalLeaderboard_" .. statsName)

if data_store_page then

for _, player in pairs(game:GetPlayers()) do

local key = player.UserId --datastore saving key

local success, failure = pcall(function()

data_store_server:GetAsync(key) -- got key for player

end)

if success then 

print(key) --here you can change the values of the stats instead of printing the key

else

warn(failure)

end

end

end

where should i write that? sorry

try in the same script at the bottom, you could also just create a PlayerAdded event and do :GetAsync(player.UserId)