Теперь сделаем новую валюту такую же как Money. А именно - Stars. Она будет желтым цветом. Она будет над Multiplayer. Изначально у игрока ее будет 0. для роблокс игры. Говори мне тип файла, и где он должен лежать. Если что, stars должен быть реализован в другом месте.

local Players = game:GetService("Players")
local DataStoreService = game:GetService("DataStoreService")
local MoneyStore = DataStoreService:GetDataStore("PlayerMoney")

-- Функция форматирования чисел
local function formatNumber(number)
	local suffixes = {"", "K", "M", "B", "T", "Qa", "Qi"}
	local index = 1
	while number >= 1000 and index < #suffixes do
		number = number / 1000
		index += 1
	end
	if number < 1000 then
		return string.format("%d%s", number, suffixes[index])
	else
		return string.format("%.2f%s", number, suffixes[index])
	end
end

-- Функции управления деньгами
local function resetMoney(player)
	player:SetAttribute("Money", 0)
end

local function addMoney(player, amount)
	local currentMoney = player:GetAttribute("Money") or 0
	player:SetAttribute("Money", currentMoney + amount)
end

local function subtractMoney(player, amount)
	local currentMoney = player:GetAttribute("Money") or 0
	player:SetAttribute("Money", math.max(currentMoney - amount, 0))
end

-- Обработка сохранения данных при выходе игрока
local function savePlayerData(player)
	local success, err = pcall(function()
		MoneyStore:SetAsync(player.UserId, player:GetAttribute("Money"))
	end)
	if not success then
		warn("Не удалось сохранить данные для игрока " .. player.Name .. ": " .. err)
	end
end

-- Обработка загрузки данных при входе игрока
local function loadPlayerData(player)
	local success, data = pcall(function()
		return MoneyStore:GetAsync(player.UserId)
	end)
	if success then
		player:SetAttribute("Money", data or 0)
	else
		warn("Не удалось загрузить данные для игрока " .. player.Name .. ": " .. data)
		player:SetAttribute("Money", 0)
	end
end

-- Обновление лидерборда
local function updateLeaderboard(player)
	player.leaderstats.Money.Value = formatNumber(player:GetAttribute("Money"))
end

-- Создание текста над головой игрока
local function createOverheadText(player)
	local billboardGui = Instance.new("BillboardGui")
	billboardGui.Name = "OverheadGui"
	billboardGui.Parent = player.Character.Head
	billboardGui.Adornee = player.Character.Head
	billboardGui.Size = UDim2.new(4, 0, 1, 0)
	billboardGui.StudsOffset = Vector3.new(0, 2, 0)
	billboardGui.AlwaysOnTop = true

	local textLabel = Instance.new("TextLabel")
	textLabel.Name = "OverheadText"
	textLabel.Parent = billboardGui
	textLabel.Size = UDim2.new(1, 0, 1, 0)
	textLabel.BackgroundTransparency = 1
	textLabel.TextColor3 = Color3.fromRGB(34, 177, 76) -- Зеленый цвет
	textLabel.Font = Enum.Font.FredokaOne -- Мультяшный шрифт
	textLabel.TextScaled = true
	textLabel.Text = "Money: " .. formatNumber(player:GetAttribute("Money"))

	player:GetAttributeChangedSignal("Money"):Connect(function()
		textLabel.Text = "Money: " .. formatNumber(player:GetAttribute("Money"))
	end)
end

-- Создание лидерборда при входе игрока
Players.PlayerAdded:Connect(function(player)
	local leaderstats = Instance.new("Folder")
	leaderstats.Name = "leaderstats"
	leaderstats.Parent = player

	local moneyValue = Instance.new("StringValue")
	moneyValue.Name = "Money"
	moneyValue.Value = "0"
	moneyValue.Parent = leaderstats

	player:SetAttribute("Money", 0)

	loadPlayerData(player)
	updateLeaderboard(player)

	player:GetAttributeChangedSignal("Money"):Connect(function()
		updateLeaderboard(player)
	end)

	player.CharacterAdded:Connect(function()
		createOverheadText(player)
	end)
end)

-- Сохранение данных при выходе игрока
Players.PlayerRemoving:Connect(function(player)
	savePlayerData(player)
end)