Roblox · Тайкун · урок 4

Улучшения конвейера и интерьера

Три вида улучшений: конвейер работает быстрее и дороже, рамка на ленте повышает цену каждого предмета, покупка украшений. Кнопки устроены так же, как кнопка покупки конвейера.

Структура

Синим — что добавляем на этом уроке.

ServerStorage
└─ Conveyors (Folder)
   ├─ CandyDropper (Model)
   │  ├─ Upgrade (Model) — детали улучшения: Transparency 1, CanCollide выкл.
   │  └─ CandyDropperScript (Script)
   │     ├─ Rate (NumberValue) — 5 — секунд между предметами
   │     └─ GainBonus (NumberValue) — 0 — надбавка к цене
   ├─ CandyUpgrader (Model) — рамка над лентой
   │  └─ Upgrader (Part) — Anchored, CanCollide выкл.
   │     └─ UpgradeCandyScript (Script)
   └─ Garland (Model) — гирлянда на стене
Workspace
└─ IndustryModel (Model)
   └─ Buttons (Folder)
      ├─ BuyButtons (Folder)
      │  ├─ CandyUpgrader (Part) — кнопка; Conveyor → Conveyors.CandyUpgrader
      │  ├─ Garland (Part) — кнопка; Conveyor → Conveyors.Garland
      │  └─ BuyScript (Script) — без изменений
      └─ UpgradeButtons (Folder)
         └─ CandyDropperUpgrade (Part) — Price, Conveyor → Conveyors.CandyDropper, CostGui
            └─ ClickDetector
               └─ UpgradeDropperScript (Script)

Шаги

  1. Все правки — в CandyDropper внутри ServerStorage.Conveyors: на карту ставится его копия.
  2. Улучшение конвейера: собери детали в модель Upgrade внутри CandyDropper и сделай их невидимыми.
  3. Рамку и гирлянду ставь в здании на своё место, потом перенеси в ServerStorage.Conveyors — появятся там же.
  4. Кнопки покупки называй так же, как покупаемый предмет (CandyUpgrader, Garland) — это нужно для сохранения.
  5. Гирлянде скрипт не нужен: её ставит BuyScript, как конвейер.

Скрипты

CandyDropperScript

Где: ServerStorage → Conveyors → CandyDropper · Script
Зачем: Частота и надбавка берутся из Rate и GainBonus — их меняет улучшение.

-- модель конвейера
local candyDropper = script.Parent
-- производство: CandyDropper → Owned_Items → IndustryModel
local tycoon = candyDropper.Parent.Parent
-- папка для упавших предметов
local droppedFolder = tycoon.Dropped_Items
-- касса производства
local gainValue = tycoon.Values.Gain
-- точка, где появляется предмет
local spawnPart = candyDropper.SpawnPart
-- корзина в конце ленты
local catcher = candyDropper:WaitForChild("Catcher")
-- серверное хранилище
local SS = game:GetService("ServerStorage")
-- образец предмета
local candy = SS.ItemsToDrop:WaitForChild("Candy")
-- удаление по таймеру
local Debris = game:GetService("Debris")
-- секунд между предметами
local rate = script.Rate
-- надбавка к цене каждого предмета
local gainBonus = script.GainBonus

-- каждые Rate секунд (меняется улучшением)
while task.wait(rate.Value) do
    -- копируем предмет
    local candyClone = candy:Clone()
    -- ставим над лентой
    candyClone.Position = spawnPart.Position
    -- кладём в мир
    candyClone.Parent = droppedFolder
    -- упал мимо ленты — сам исчезнет через 30 с
    Debris:AddItem(candyClone, 30)
    -- за этот предмет ещё не платили
    local paid = false
    -- следим за касаниями предмета
    candyClone.Touched:Connect(function(otherPart)
        -- предмет в корзине, оплаты ещё не было
        if otherPart == catcher and not paid then
            -- платим один раз
            paid = true
            -- цена предмета — в кассу
            gainValue.Value += candyClone.Gain.Value + gainBonus.Value
            -- пауза 1 секунда
            task.wait(1)
            -- удаляем предмет
            candyClone:Destroy()
        -- конец проверки
        end
    -- конец обработчика касания
    end)
-- следующий предмет
end

UpgradeDropperScript

Где: … → UpgradeButtons → CandyDropperUpgrade → ClickDetector · Script
Зачем: Улучшает купленный конвейер: Rate 3, +5 к цене, показывает детали Upgrade.

-- ClickDetector кнопки улучшения
local clicker = script.Parent
-- сама кнопка
local button = clicker.Parent
-- производство: UpgradeButtons → Buttons → IndustryModel
local tycoon = button.Parent.Parent.Parent
-- владелец и касса
local valuesFolder = tycoon.Values
-- купленное оборудование
local ownedFolder = tycoon.Owned_Items

-- нажали на кнопку улучшения
clicker.MouseClick:Connect(function(player)
    -- ищем купленный конвейер с этим именем
    local conveyor = ownedFolder:FindFirstChild(button.Conveyor.Value.Name)
    -- конвейер ещё не куплен — улучшать нечего
    if not conveyor then return end
    -- нажал не владелец
    if valuesFolder.Owner.Value ~= player then return end
    -- денег не хватает
    if player.leaderstats.Money.Value < button.Price.Value then return end
    -- списываем цену
    player.leaderstats.Money.Value -= button.Price.Value
    -- предметы чаще: раз в 3 секунды
    conveyor.CandyDropperScript.Rate.Value = 3
    -- каждый предмет дороже на 5
    conveyor.CandyDropperScript.GainBonus.Value += 5
    -- все детали визуального улучшения
    for _, part in pairs(conveyor.Upgrade:GetDescendants()) do
        -- только физические
        if part:IsA("BasePart") then
            -- делаем видимыми
            part.Transparency = 0
        -- конец проверки
        end
    -- конец перебора
    end
    -- улучшение куплено — кнопка больше не нужна
    button:Destroy()
-- конец обработчика
end)

UpgradeCandyScript

Где: ServerStorage → Conveyors → CandyUpgrader → Upgrader · Script
Зачем: Каждая конфета, проехавшая через рамку, дорожает на 5 — один раз.

-- рамка, через которую проезжает предмет
local upgrader = script.Parent

-- рамки что-то коснулось
upgrader.Touched:Connect(function(otherPart)
    -- это конфета, и её ещё не улучшали
    if otherPart.Name == "Candy" and not otherPart:GetAttribute("Upgraded") then
        -- метка на самой конфете: второй раз не улучшим
        otherPart:SetAttribute("Upgraded", true)
        -- конфета стала дороже на 5
        otherPart.Gain.Value += 5
    -- конец проверки
    end
-- конец обработчика
end)

Проверка

Запусти Play (или Run) и убедись: