User: Сделай, что когда на счет игрока, прибавляеться валюта Multiplayer, то мы проверяем так-же валюту Stars. Например, если у человека 90,000 Stars. Ему пришло 1 Multiplayer. Учитываем что каждый Stars = x2. 90000 x 2 = 180000. После чего 180000 x 1 = 180000. Скрипт где это нужно сделать:

local part = script.Parent -- Указываем, что текущий парент - это сам парт
local Players = game:GetService("Players")

-- Переменная для отслеживания игрока на парте
local playerOnPart = nil

local function checkStandingOnPart(player)
	while playerOnPart == player do
		wait(0.2) -- Каждые 0.2 секунды проверяем

		-- Получаем атрибут Money
		local currentMoney = player:GetAttribute("Money") or 0

		if currentMoney >= 10 then
			-- Убираем 10 Money у игрока
			player:SetAttribute("Money", currentMoney - 10)

			-- Прибавляем +1 к Multiplayer
			local currentMultiplier = player:GetAttribute("Multiplayer") or 2
			player:SetAttribute("Multiplayer", currentMultiplier + 1)

			-- Обновляем значение Multiplayer сразу после изменения
			print(player.Name .. " забрал 10 Money и получил +1 Multiplayer. Теперь у них " .. (currentMultiplier + 1) .. " Multiplier.")
		end
	end
end

local function onTouch(otherPart)
	-- Проверяем, является ли касающийся объект игроком
	local player = Players:GetPlayerFromCharacter(otherPart.Parent)
	if player then
		if not playerOnPart then
			playerOnPart = player
			checkStandingOnPart(player) -- Начинаем проверку
		end
	end
end

local function onTouchEnded(otherPart)
	local player = Players:GetPlayerFromCharacter(otherPart.Parent)
	if player == playerOnPart then
		playerOnPart = nil -- Игрок покинул парт
	end
end

-- Подключаем события Touched и TouchEnded к функциям
part.Touched:Connect(onTouch)
part.TouchEnded:Connect(onTouchEnded)Multiplayer:

local Players = game:GetService("Players")
local DataStoreService = game:GetService("DataStoreService")
local MultiplayerStore = DataStoreService:GetDataStore("PlayerMultiplayer")

local function formatNumber(number)
	local suffixes = {"", "K", "M", "B", "T", "Qd", "Qn", "Sx", "Sp", "Oc", "No"}
	local index = 1

	while number >= 1000 and index < #suffixes do
		number = number / 1000
		index += 1
	end

	if index == #suffixes and number >= 1000 then
		return "999No"
	end

	if number >= 100 then
		return string.format("%d%s", number, suffixes[index]) -- Для целых чисел
	else
		return string.format("%.2f%s", number, suffixes[index]):gsub("%.00", "") -- Удаляем .00 для целых чисел
	end
end

-- Функции управления Multiplayer
local function resetMultiplayer(player)
	player:SetAttribute("Multiplayer", 2) -- Устанавливаем начальное значение Multiplayer на 2
end

local function addMultiplayer(player, amount)
	local currentMultiplayer = player:GetAttribute("Multiplayer") or 2 -- Изменяем значение по умолчанию на 2
	player:SetAttribute("Multiplayer", currentMultiplayer + amount)
end

local function subtractMultiplayer(player, amount)
	local currentMultiplayer = player:GetAttribute("Multiplayer") or 2 -- Изменяем значение по умолчанию на 2
	player:SetAttribute("Multiplayer", math.max(currentMultiplayer - amount, 2)) -- Заменяем 1 на 2
end

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

-- Обработка загрузки данных при входе игрока
local function loadPlayerMultiplayer(player)
	local success, data = pcall(function()
		return MultiplayerStore:GetAsync(player.UserId)
	end)
	if success then
		player:SetAttribute("Multiplayer", data or 2) -- Изменяем значение по умолчанию на 2
	else
		warn("Не удалось загрузить Multiplayer для игрока " .. player.Name .. ": " .. data)
		player:SetAttribute("Multiplayer", 2) -- Значение по умолчанию
	end
end

-- Создание текста Multiplayer над головой игрока
local function createMultiplayerOverheadText(player)
	local billboardGui = Instance.new("BillboardGui")
	billboardGui.Name = "MultiplayerOverheadGui"
	billboardGui.Parent = player.Character.Head
	billboardGui.Adornee = player.Character.Head
	billboardGui.Size = UDim2.new(4, 0, 1, 0)
	billboardGui.StudsOffset = Vector3.new(0, 3, 0) -- Над текстом Money, но под Stars
	billboardGui.AlwaysOnTop = true

	local textLabel = Instance.new("TextLabel")
	textLabel.Name = "MultiplayerOverheadText"
	textLabel.Parent = billboardGui
	textLabel.Size = UDim2.new(1, 0, 1, 0)
	textLabel.BackgroundTransparency = 1
	textLabel.TextStrokeTransparency = 0 -- Добавляет черную обводку
	textLabel.TextColor3 = Color3.fromRGB(255, 0, 0) -- Красный цвет
	textLabel.Font = Enum.Font.FredokaOne
	textLabel.TextScaled = true
	textLabel.Text = "Multiplier: " .. formatNumber(player:GetAttribute("Multiplayer"))

	-- Обновление текста при изменении атрибута Multiplayer
	player:GetAttributeChangedSignal("Multiplayer"):Connect(function()
		textLabel.Text = "Multiplier: " .. formatNumber(player:GetAttribute("Multiplayer"))
	end)
end

-- Обработка при добавлении игрока
Players.PlayerAdded:Connect(function(player)
	player:SetAttribute("Multiplayer", 2) -- Значение по умолчанию теперь 2
	loadPlayerMultiplayer(player)

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

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

Stars:
local Players = game:GetService("Players")
local DataStoreService = game:GetService("DataStoreService")
local StarsStore = DataStoreService:GetDataStore("PlayerStars")

-- Функция форматирования числа
local function formatNumber(number)
	local suffixes = {"", "K", "M", "B", "T", "Qd", "Qn", "Sx", "Sp", "Oc", "No"}
	local index = 1

	while number >= 1000 and index < #suffixes do
		number = number / 1000
		index += 1
	end

	if index == #suffixes and number >= 1000 then
		return "999No"
	end

	-- Измененный вывод форматирования
	if number >= 100 then
		return string.format("%d%s", number, suffixes[index]) -- Для целых чисел
	else
		return string.format("%.2f%s", number, suffixes[index]):gsub("%.00", "") -- Удаляем .00 для целых чисел
	end
end

-- Функции управления Stars
local function resetStars(player)
	player:SetAttribute("Stars", 0)
end

local function addStars(player, amount)
	local currentStars = player:GetAttribute("Stars") or 0
	player:SetAttribute("Stars", currentStars + amount)
end

local function subtractStars(player, amount)
	local currentStars = player:GetAttribute("Stars") or 0
	player:SetAttribute("Stars", math.max(currentStars - amount, 0))
end

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

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

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

	local textLabel = Instance.new("TextLabel")
	textLabel.Name = "StarsOverheadText"
	textLabel.Parent = billboardGui
	textLabel.Size = UDim2.new(1, 0, 1, 0)
	textLabel.BackgroundTransparency = 1
	textLabel.TextStrokeTransparency = 0 -- Добавляет черную обводку
	textLabel.TextColor3 = Color3.fromRGB(255, 215, 0) -- Желтый цвет
	textLabel.Font = Enum.Font.FredokaOne
	textLabel.TextScaled = true
	textLabel.Text = "Stars: " .. formatNumber(player:GetAttribute("Stars"))

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

-- Обработка при добавлении игрока
Players.PlayerAdded:Connect(function(player)
	player:SetAttribute("Stars", 0) -- Начальное значение Stars

	loadPlayerStars(player)

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

-- Сохранение данных при выходе игрока
Players.PlayerRemoving:Connect(function(player)
	savePlayerStars(player)
end)
Assistant:  реализовать логику, где при добавлении валюты `Multiplayer` также проверяется и учитывается количество валюты `Stars`, вам нужно внести изменения в существующий скрипт, где происходит управление `Multiplayer`.

Вот модифицированный скрипт, который включает расчеты на основе вашего примера:

```lua
local part = script.Parent -- Указываем, что текущий парент - это сам парт
local Players = game:GetService("Players")

-- Переменная для отслеживания игрока на парте
local playerOnPart = nil

local function checkStandingOnPart(player)
        while playerOnPart == player do
                wait(0.2) -- Каждые 0.2 секунды проверяем

                -- Получаем атрибут Money
                local currentMoney = player:GetAttribute("Money") or 0

                if currentMoney >= 10 then
                        -- Убираем 10 Money у игрока
                        player:SetAttribute("Money", currentMoney - 10)

                        -- Получаем количество Stars
                        local currentStars = player:GetAttribute("Stars") or 0
                        local multiplierBonus = currentStars * 2 -- Учитываем, что каждый Star дает x2

                        -- Прибавляем +1 к Multiplayer с учетом Stars
                        local currentMultiplier = player:GetAttribute("Multiplayer") or 2
                        player:SetAttribute("Multiplayer", currentMultiplier + multiplierBonus)

                        -- Обновляем значение Multiplayer сразу после изменения
                        print(player.Name .. " забрал 10 Money и получил + " .. multiplierBonus .. " Multiplayer. Теперь у них " .. (currentMultiplier + multiplierBonus) .. " Multiplier.")
                end
        end
end

local function onTouch(otherPart)
        -- Проверяем, является ли касающийся объект игроком
        local player = Players:GetPlayerFromCharacter(otherPart.Parent)
        if player then
                if not playerOnPart then
                        playerOnPart = player
                        checkStandingOnPart(player) -- Начинаем проверку
                end
        end
end

local function onTouchEnded(otherPart)
        local player = Players:GetPlayerFromCharacter(otherPart.Parent)
        if player == playerOnPart then
                playerOnPart = nil -- Игрок покинул парт
        end
end

-- Подключаем события Touched и TouchEnded к функциям
part.Touched:Connect(onTouch)
part.TouchEnded:Connect(onTouchEnded)
```

### Что изменилось

1. **Добавлена логика для расчета `multiplierBonus`:** Когда игрок забирает Money, мы берем количество Stars, умножаем его на 2 и добавляем к текущему `Multiplayer`.
  
2. **Логика при выводе сообщений:** Сообщение о полученном `Multiplayer` теперь выводит увеличенное значение с учётом `Stars`.

Убедитесь, что название атрибута `Stars` совпадает с тем, что вы используете в других частях кода. Этот подход позволит вам динамично изменять `Multiplayer`, основываясь на `Stars`.
User: Добавь, что если Stars равняеться 0, то мы ничего не множим.
Assistant:  учесть условие, при котором если количество `Stars` равно 0, то `Multiplayer` не должен изменяться, мы можем добавить простую проверку в существующую функцию. Вот обновленный код:

```lua
local part = script.Parent -- Указываем, что текущий парент - это сам парт
local Players = game:GetService("Players")

-- Переменная для отслеживания игрока на парте
local playerOnPart = nil

local function checkStandingOnPart(player)
    while playerOnPart == player do
        wait(0.2) -- Каждые 0.2 секунды проверяем

        -- Получаем атрибут Money
        local currentMoney = player:GetAttribute("Money") or 0

        if currentMoney >= 10 then
            -- Убираем 10 Money у игрока
            player:SetAttribute("Money", currentMoney - 10)

            -- Получаем количество Stars
            local currentStars = player:GetAttribute("Stars") or 0
            
            local multiplierBonus = 0
            if currentStars > 0 then
                multiplierBonus = currentStars * 2 -- Учитываем, что каждый Star дает x2
            end
            
            -- Прибавляем +1 к Multiplayer с учетом Stars
            local currentMultiplier = player:GetAttribute("Multiplayer") or 2
            player:SetAttribute("Multiplayer", currentMultiplier + multiplierBonus)

            -- Обновляем значение Multiplayer сразу после изменения
            print(player.Name .. " забрал 10 Money и получил + " .. multiplierBonus .. " Multiplayer. Теперь у них " .. (currentMultiplier + multiplierBonus) .. " Multiplier.")
        end
    end
end

local function onTouch(otherPart)
    -- Проверяем, является ли касающийся объект игроком
    local player = Players:GetPlayerFromCharacter(otherPart.Parent)
    if player then
        if not playerOnPart then
            playerOnPart = player
            checkStandingOnPart(player) -- Начинаем проверку
        end
    end
end

local function onTouchEnded(otherPart)
    local player = Players:GetPlayerFromCharacter(otherPart.Parent)
    if player == playerOnPart then
        playerOnPart = nil -- Игрок покинул парт
    end
end

-- Подключаем события Touched и TouchEnded к функциям
part.Touched:Connect(onTouch)
part.TouchEnded:Connect(onTouchEnded)
```

### Что изменилось

1. **Проверка на количество `Stars`:** Перед тем, как умножать `Stars` на 2, добавлено условие `if currentStars > 0`. Если `Stars` равны 0, то `multiplierBonus` останется 0, и не будет добавлено к `Multiplayer`.

2. **Логика при выводе сообщений:** Сообщение о полученном `Multiplayer` также обновляется, чтобы отразить, что если `multiplierBonus` равен 0, то увеличение не происходит.

Теперь если у игрока нет `Stars`, его `Multiplayer` не изменится при использовании парт.
User: Вот например в данном скрипте за 10 денег мы получаем 1 Multiplayer. А где поменять число денег, и сколько за них получит игрок Multiplayer?
Assistant:  изменить количество денег, за которое игрок получает `Multiplayer`, а также количество `Multiplayer`, которое он получает за это количество денег, вам нужно сделать изменения в нескольких местах в коде.

Вот как вы можете это сделать:

1. **Изменить стоимость в `Money`:** Это значение определяется в условии `if currentMoney >= 10 then`. Замените `10` на нужное вам значение (например, `20`).

2. **Изменить количество `Multiplayer`, которое дает эта стоимость:** Для того чтобы изменить, сколько `Multiplayer` игрок получает за потраченные деньги, вы можете ввести новую переменную (например, `multiplierGain`) и использовать её вместо простого добавления `1`.

### Вот пример кода с изменениями:

```lua
local part = script.Parent -- Указываем, что текущий парент - это сам парт
local Players = game:GetService("Players")

-- Переменная для отслеживания игрока на парте
local playerOnPart = nil

-- Параметры для расчета Multiplayer
local costMoney = 10 -- Сколько денег стоит получить Multiplayer
local multiplierGain = 1 -- Сколько Multiplayer дается за costMoney

local function checkStandingOnPart(player)
    while playerOnPart == player do
        wait(0.2) -- Каждые 0.2 секунды проверяем

        -- Получаем атрибут Money
        local currentMoney = player:GetAttribute("Money") or 0

        if currentMoney >= costMoney then
            -- Убираем деньги у игрока
            player:SetAttribute("Money", currentMoney - costMoney)

            -- Получаем количество Stars
            local currentStars = player:GetAttribute("Stars") or 0
            
            local multiplierBonus = 0
            if currentStars > 0 then
                multiplierBonus = currentStars * 2 -- Учитываем, что каждый Star дает x2
            end
            
            -- Прибавляем Multiplayer с учетом Stars
            local currentMultiplier = player:GetAttribute("Multiplayer") or 2
            player:SetAttribute("Multiplayer", currentMultiplier + multiplierGain + multiplierBonus)

            -- Обновляем значение Multiplayer сразу после изменения
            print(player.Name .. " забрал " .. costMoney .. " Money и получил + " .. multiplierGain + " Multiplayer ( + " .. multiplierBonus .. " за Stars). Теперь у них " .. (currentMultiplier + multiplierGain + multiplierBonus) .. " Multiplier.")
        end
    end
end

local function onTouch(otherPart)
    -- Проверяем, является ли касающийся объект игроком
    local player = Players:GetPlayerFromCharacter(otherPart.Parent)
    if player then
        if not playerOnPart then
            playerOnPart = player
            checkStandingOnPart(player) -- Начинаем проверку
        end
    end
end

local function onTouchEnded(otherPart)
    local player = Players:GetPlayerFromCharacter(otherPart.Parent)
    if player == playerOnPart then
        playerOnPart = nil -- Игрок покинул парт
    end
end

-- Подключаем события Touched и TouchEnded к функциям
part.Touched:Connect(onTouch)
part.TouchEnded:Connect(onTouchEnded)
```

### Что изменилось

1. **Переменная `costMoney`:** Добавлена переменная `costMoney`, которая определяет, сколько денег нужно потратить для получения `Multiplayer`. Вы можете изменить это значение на нужное вам (например, `20`, `15` и т. д.).

2. **Переменная `multiplierGain`:** Эта переменная определяет, сколько `Multiplayer` игрок получает за потраченные деньги. Измените её значение так, как вам нужно (например, `2`, если вы хотите, чтобы игрок получал по 2 `Multiplayer` за каждую зарплату денежек).

Теперь вы можете легко настроить стоимость и количество `Multiplayer` в этом коде, просто меняя значения переменных.
User: Теперь сделаем такую же систему, но с покупкой Stars за Multiplayer. Теперь, мы проверяем, сколько у игрока Mega. И это увеличение Stars будет работать таким же способом, как и увеличение Multiplayer за Stars.

Скрипт (который сейчас):

local part = script.Parent -- Указываем, что текущий парент - это сам парт
local Players = game:GetService("Players")

-- Переменная для отслеживания игрока на парте
local playerOnPart = nil

local function checkStandingOnPart(player)
	while playerOnPart == player do
		wait(0.2) -- Каждые 0.2 секунды проверяем

		-- Получаем атрибут Money
		local currentMulti = player:GetAttribute("Multiplayer") or 0

		if currentMulti >= 10 then
			-- Убираем 10 Money у игрока
			player:SetAttribute("Multiplayer", currentMulti - 10)

			-- Прибавляем +1 к Multiplayer
			local currentMultiplier = player:GetAttribute("Stars") or 2
			player:SetAttribute("Stars", currentMultiplier + 1)

			-- Обновляем значение Multiplayer сразу после изменения
		
		end
	end
end

local function onTouch(otherPart)
	-- Проверяем, является ли касающийся объект игроком
	local player = Players:GetPlayerFromCharacter(otherPart.Parent)
	if player then
		if not playerOnPart then
			playerOnPart = player
			checkStandingOnPart(player) -- Начинаем проверку
		end
	end
end

local function onTouchEnded(otherPart)
	local player = Players:GetPlayerFromCharacter(otherPart.Parent)
	if player == playerOnPart then
		playerOnPart = nil -- Игрок покинул парт
	end
end

-- Подключаем события Touched и TouchEnded к функциям
part.Touched:Connect(onTouch)
part.TouchEnded:Connect(onTouchEnded)

Mega:

local Players = game:GetService("Players")
local DataStoreService = game:GetService("DataStoreService")
local MegaStore = DataStoreService:GetDataStore("PlayerMega")

-- Функция форматирования чисел
local function formatNumber(number)
	local suffixes = {"", "K", "M", "B", "T", "Qd", "Qn", "Sx", "Sp", "Oc", "No"}
	local index = 1

	while number >= 1000 and index < #suffixes do
		number = number / 1000
		index += 1
	end

	if index == #suffixes and number >= 1000 then
		return "999No"
	end

	-- Измененный вывод форматирования
	if number >= 100 then
		return string.format("%d%s", number, suffixes[index]) -- Для целых чисел
	else
		return string.format("%.2f%s", number, suffixes[index]):gsub("%.00", "") -- Удаляем .00 для целых чисел
	end
end

-- Функции управления Mega
local function resetMega(player)
	player:SetAttribute("Mega", 0)
end

local function addMega(player, amount)
	local currentMega = player:GetAttribute("Mega") or 0
	player:SetAttribute("Mega", currentMega + amount)
end

local function subtractMega(player, amount)
	local currentMega = player:GetAttribute("Mega") or 0
	player:SetAttribute("Mega", math.max(currentMega - amount, 0))
end

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

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

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

	local textLabel = Instance.new("TextLabel")
	textLabel.Name = "MegaOverheadText"
	textLabel.Parent = billboardGui
	textLabel.Size = UDim2.new(1, 0, 1, 0)
	textLabel.BackgroundTransparency = 1
	textLabel.TextStrokeTransparency = 0
	textLabel.TextColor3 = Color3.fromRGB(128, 0, 128) -- Фиолетовый цвет
	textLabel.Font = Enum.Font.FredokaOne
	textLabel.TextScaled = true
	textLabel.Text = "Mega: " .. formatNumber(player:GetAttribute("Mega"))

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

-- Обработка при добавлении игрока
Players.PlayerAdded:Connect(function(player)
	player:SetAttribute("Mega", 0) -- Начальное значение Mega

	loadPlayerMega(player)

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

-- Сохранение данных при выходе игрока
Players.PlayerRemoving:Connect(function(player)
	savePlayerMega(player)
end)
Assistant:  создать систему, в которой игроки могут покупать `Stars` за `Multiplayer`, с учетом количества `Mega`, вы можете внести изменения в ваш существующий скрипт. `Stars` будут увеличиваться на основе количества `Mega`, и правила, в которых `1 Star` будет даваться за `10 Multiplayer`, ту же логику, что и раньше.

### Модифицированный скрипт:

Вот как может выглядеть ваш обновленный код на основе предоставленного:

```lua
local part = script.Parent -- Указываем, что текущий парент - это сам парт
local Players = game:GetService("Players")

-- Переменная для отслеживания игрока на парте
local playerOnPart = nil

-- Параметры для расчета Stars
local costMulti = 10 -- Количество Multiplayer, необходимое для получения Stars
local starsGain = 1 -- Количество Stars, получаемое за каждые costMulti Multiplayer

local function checkStandingOnPart(player)
    while playerOnPart == player do
        wait(0.2) -- Каждые 0.2 секунды проверяем

        -- Получаем атрибут Multiplayer
        local currentMulti = player:GetAttribute("Multiplayer") or 0

        if currentMulti >= costMulti then
            -- Убираем Multiplayer у игрока
            player:SetAttribute("Multiplayer", currentMulti - costMulti)

            -- Получаем количество Mega
            local currentMega = player:GetAttribute("Mega") or 0
            local bonusStars = 0
            if currentMega > 0 then
                bonusStars = currentMega * 2 -- Каждый Mega увеличивает количество Stars
            end

            -- Прибавляем Stars с учетом Mega
            local currentStars = player:GetAttribute("Stars") or 0
            player:SetAttribute("Stars", currentStars + starsGain + bonusStars)

            -- Обновляем значение Stars и выводим информацию
            print(player.Name .. " использовал " .. costMulti .. " Multiplayer и получил " .. starsGain .. " Stars ( + " .. bonusStars .. " за Mega). Теперь у него " .. player:GetAttribute("Stars") .. " Stars.")
        end
    end
end

local function onTouch(otherPart)
    -- Проверяем, является ли касающийся объект игроком
    local player = Players:GetPlayerFromCharacter(otherPart.Parent)
    if player then
        if not playerOnPart then
            playerOnPart = player
            checkStandingOnPart(player) -- Начинаем проверку
        end
    end
end

local function onTouchEnded(otherPart)
    local player = Players:GetPlayerFromCharacter(otherPart.Parent)
    if player == playerOnPart then
        playerOnPart = nil -- Игрок покинул парт
    end
end

-- Подключаем события Touched и TouchEnded к функциям
part.Touched:Connect(onTouch)
part.TouchEnded:Connect(onTouchEnded)
```

### Что изменилось

1. **Стоимость `Multiplayer`:** Добавлена переменная `costMulti`, которая определяет количество `Multiplayer`, необходимое для получения `Stars` (в этом случае 10).

2. **Количество `Stars`, получаемое за `Multiplayer`:** Добавлена переменная `starsGain`, которая определяет, сколько `Stars` игрок получает за трату `Multiplayer` (в этом случае 1).

3. **Логика для расчета `bonusStars`:** Если у игрока есть `Mega`, то количество Stars увеличивается на два за каждую единицу `Mega`. Это аналогично тому, как работает логика для получения `Multiplayer` за `Stars`.

4. **Информирование игрока:** После успешной покупки `Stars` выводится сообщение, показывающее, сколько `Stars` было получено (с учетом бонуса за `Mega`).

Теперь у вас есть система, которая позволяет игрокам тратить `Multiplayer` на получение `Stars`, а также учитывает количество `Mega`, влияющее на количество получаемых `Stars`.
User: Смотри, тут будет чуть другая система. Если у человека, есть то кол-во Multiplayer, которое нужно. И когда мы проверяем, если у него например уже больше 10, мы обнуляем все к 2. Тоесть, даже если у человека больше чем 10, мы обнуляем все. Меньше чем 10 = не получиться. Но кроме Multiplayer мы обнуляем еще и Money.
Assistant:  реализовать систему, где игрок может обменять `Multiplayer` на `Stars`, но при этом есть правило об обнулении всех значений (`Multiplayer` и `Money`), если у него больше определенного количества `Multiplayer` (в данном случае 10), вам нужно внести некоторые изменения в код.

### Обновленный скрипт

Вот как вы можете изменить код, чтобы учесть эти условия:

```lua
local part = script.Parent -- Указываем, что текущий парент - это сам парт
local Players = game:GetService("Players")

-- Переменная для отслеживания игрока на парте
local playerOnPart = nil

-- Параметры для расчета Stars
local costMulti = 10 -- Количество Multiplayer, необходимое для получения Stars
local starsGain = 1 -- Количество Stars, получаемое за каждые costMulti Multiplayer

local function checkStandingOnPart(player)
    while playerOnPart == player do
        wait(0.2) -- Каждые 0.2 секунды проверяем

        -- Получаем атрибут Multiplayer
        local currentMulti = player:GetAttribute("Multiplayer") or 0
        local currentMoney = player:GetAttribute("Money") or 0

        if currentMulti >= costMulti then
            -- Убираем Money у игрока
            player:SetAttribute("Money", 0)

            -- Убираем Multiplayer у игрока и обнуляем его
            player:SetAttribute("Multiplayer", 2)

            -- Прибавляем Stars
            local currentStars = player:GetAttribute("Stars") or 0
            player:SetAttribute("Stars", currentStars + starsGain)

            -- Обновляем значения и выводим информацию
            print(player.Name .. " обменял " .. costMulti .. " Multiplayer и получил " .. starsGain .. " Stars. Теперь у него " .. player:GetAttribute("Stars") .. " Stars.")
        end
    end
end

local function onTouch(otherPart)
    -- Проверяем, является ли касающийся объект игроком
    local player = Players:GetPlayerFromCharacter(otherPart.Parent)
    if player then
        if not playerOnPart then
            playerOnPart = player
            checkStandingOnPart(player) -- Начинаем проверку
        end
    end
end

local function onTouchEnded(otherPart)
    local player = Players:GetPlayerFromCharacter(otherPart.Parent)
    if player == playerOnPart then
        playerOnPart = nil -- Игрок покинул парт
    end
end

-- Подключаем события Touched и TouchEnded к функциям
part.Touched:Connect(onTouch)
part.TouchEnded:Connect(onTouchEnded)
```

### Что изменилось

1. **Проверка `Multiplayer`:** Если у игрока есть достаточно `Multiplayer` (больше или равно `costMulti`), то выполняется дальнейшая логика.

2. **Обнуление `Money` и `Multiplayer`:** После успешного обмена, `Money` игрока обнуляется (`player:SetAttribute("Money", 0)`), и его `Multiplayer` устанавливается на 2 (`player:SetAttribute("Multiplayer", 2)`). Это значит, что даже если у игрока был изначально `Multiplayer` больше 10, после обмена он будет обнулен до 2.

3. **Увеличение `Stars`:** Количество `Stars` рассчитывается путем добавления `starsGain`, которое определяется ранее.

4. **Вывод информации:** После успешного обмена выводится сообщение о том, сколько `Stars` игрок получил и какое у него теперь количество `Stars`.

Теперь у вас есть принятая система, где игрок может обменивать `Multiplayer` на `Stars`, и если у него достаточно `Multiplayer`, у него автоматически обнуляется количество `Money` и `Multiplayer`.
User: Есть проблема с скриптом ниже. Например, игрок стоит в парте или на парте, вообще не важно, главное касаеться. И у него меньше денег чем требует данный парт, когда эта сумма ровно наступает, все забирает. Но. Если у человека, сумма больше, то ему снимит деньги лишь один раз пока ОН не выйдет из парта и снова не зайдет в него.
User: Есть проблема с скриптом ниже. Например, игрок стоит в парте или на парте, вообще не важно, главное касаеться. И у него меньше денег чем требует данный парт, когда эта сумма ровно наступает, все забирает. Но. Если у человека, сумма больше, то ему снимит деньги лишь один раз пока ОН не выйдет из парта и снова не зайдет в него.


local part = script.Parent -- Указываем, что текущий парент - это сам парт
local Players = game:GetService("Players")

-- Переменная для отслеживания игрока на парте
local playerOnPart = nil

-- Параметры для расчета Multiplayer
local costMoney = 1500000000000000000000000 -- Сколько денег стоит получить Multiplayer
local multiplierGain = 5000000000 -- Сколько Multiplayer дается за costMoney

local function checkStandingOnPart(player)
	while playerOnPart == player do
		wait(0.2) -- Каждые 0.2 секунды проверяем

		-- Получаем атрибут Money
		local currentMoney = player:GetAttribute("Money") or 0

		if currentMoney >= costMoney then
			-- Убираем деньги у игрока
			player:SetAttribute("Money", currentMoney - costMoney)

			-- Получаем количество Stars
			local currentStars = player:GetAttribute("Stars") or 0

			local multiplierBonus = 0
			if currentStars > 0 then
				multiplierBonus = currentStars * 2 -- Учитываем, что каждый Star дает x2
			end

			-- Прибавляем Multiplayer с учетом Stars
			local currentMultiplier = player:GetAttribute("Multiplayer") or 2
			player:SetAttribute("Multiplayer", currentMultiplier + multiplierGain + multiplierBonus)

			-- Обновляем значение Multiplayer сразу после изменения
			print(player.Name .. " забрал " .. costMoney .. " Money и получил + " .. multiplierGain + " Multiplayer ( + " .. multiplierBonus .. " за Stars). Теперь у них " .. (currentMultiplier + multiplierGain + multiplierBonus) .. " Multiplier.")
		end
	end
end

local function onTouch(otherPart)
	-- Проверяем, является ли касающийся объект игроком
	local player = Players:GetPlayerFromCharacter(otherPart.Parent)
	if player then
		if not playerOnPart then
			playerOnPart = player
			checkStandingOnPart(player) -- Начинаем проверку
		end
	end
end

local function onTouchEnded(otherPart)
	local player = Players:GetPlayerFromCharacter(otherPart.Parent)
	if player == playerOnPart then
		playerOnPart = nil -- Игрок покинул парт
	end
end

-- Подключаем события Touched и TouchEnded к функциям
part.Touched:Connect(onTouch)
part.TouchEnded:Connect(onTouchEnded)

Assistant:  реализации желаемого поведения в вашем скрипте, необходимо изменить логику проверки игрока. В текущем коде, когда игрок заходит на парт и у него достаточно денег, его деньги списываются, и это происходит только один раз, пока он не покинет парт. Вам нужно изменить логику таким образом, чтобы игрок продолжал получать `Multiplayer`, пока у него достаточно денег, и при этом была возможность обрабатывать ситуации, когда у игрока недостаточно денег.

Вот пример того, как вы можете изменить ваш код:

```lua
local part = script.Parent -- Указываем, что текущий парент - это сам парт
local Players = game:GetService("Players")

-- Переменная для отслеживания игрока на парте
local playerOnPart = nil

-- Параметры для расчета Multiplayer
local costMoney = 1500000000000000000000000 -- Сколько денег стоит получить Multiplayer
local multiplierGain = 5000000000 -- Сколько Multiplayer дается за costMoney

local function checkStandingOnPart(player)
    while playerOnPart == player do
        wait(0.2) -- Каждые 0.2 секунды проверяем

        -- Получаем атрибут Money
        local currentMoney = player:GetAttribute("Money") or 0

        -- Проверяем, достаточно ли денег
        if currentMoney >= costMoney then
            -- Убираем деньги у игрока
            player:SetAttribute("Money", currentMoney - costMoney)

            -- Получаем количество Stars
            local currentStars = player:GetAttribute("Stars") or 0

            local multiplierBonus = 0
            if currentStars > 0 then
                multiplierBonus = currentStars * 2 -- Учитываем, что каждый Star дает x2
            end

            -- Прибавляем Multiplayer с учетом Stars
            local currentMultiplier = player:GetAttribute("Multiplayer") or 2
            player:SetAttribute("Multiplayer", currentMultiplier + multiplierGain + multiplierBonus)

            -- Обновляем значение Multiplayer сразу после изменения
            print(player.Name .. " забрал " .. costMoney .. " Money и получил + " .. multiplierGain .. " Multiplayer ( + " .. multiplierBonus .. " за Stars). Теперь у них " .. (currentMultiplier + multiplierGain + multiplierBonus) .. " Multiplier.")
        end
    end
end

local function onTouch(otherPart)
    -- Проверяем, является ли касающийся объект игроком
    local player = Players:GetPlayerFromCharacter(otherPart.Parent)
    if player then
        if not playerOnPart then
            playerOnPart = player
            -- Начинаем проверку
            checkStandingOnPart(player)
        end
    end
end

local function onTouchEnded(otherPart)
    local player = Players:GetPlayerFromCharacter(otherPart.Parent)
    if player == playerOnPart then
        playerOnPart = nil -- Игрок покинул парт
    end
end

-- Подключаем события Touched и TouchEnded к функциям
part.Touched:Connect(onTouch)
part.TouchEnded:Connect(onTouchEnded)
```

### Что изменилось

1. **Непрерывная проверка:** Мы продолжаем проверять деньги игрока каждый раз, пока он стоит на парте. Если у него достаточно денег, он будет продолжать получать `Multiplayer`.

2. **Обработка недостатка денег:** Если у игрока недостаточно денег, ничего не происходит, и он не теряет свою возможность получать `Multiplayer`, пока он не выйдет из парта.

Таким образом, когда игрок стоит на парте, если у него достаточно денег, он будет получать `Multiplayer`, пока у него не закончатся деньги. Если денег недостаточно, то они не списываются, и игрок может повторно попытаться, когда у него появится нужная сумма.
User: Какую строчку ты изменил или добавил?
Assistant: