Roblox · Усиления

Щит: временная неуязвимость

Клик — вокруг персонажа светящаяся сфера, 8 секунд никакой урон не проходит. Работает со всем, что ранит через TakeDamage: оружие, капкан, лава, ловушки.

Структура

Синим — что нужно создать.

StarterPack — или копии на карте для подбора
└─ Shield (Tool)
   ├─ Handle (Part) — модель; CanCollide выкл.
   │  └─ Use (Sound)
   ├─ Configuration (Configuration)
   │  ├─ Duration (NumberValue) — секунд защиты, 8
   │  ├─ Uses (NumberValue) — сколько раз можно использовать, 1
   │  └─ Cooldown (NumberValue) — секунд между использованиями, 1
   └─ ShieldServer (Script)

Шаги

  1. Предмет — Tool с деталью Handle (CanCollide выкл.), в Handle — Sound «Use». Configuration — папка настроек: наведи на Tool → «+» → Configuration, внутри NumberValue (имена и числа — в «Структуре»).
  2. Щит — стандартный ForceField Roblox: пока он на персонаже, Humanoid:TakeDamage ничего не делает. Visible — показывать ли сферу.
  3. Убивающие детали, которые ставят Health = 0 напрямую (например, Killbrick), щит не останавливает — у них лучше тоже использовать TakeDamage(100).
  4. Пока щит стоит, второй не тратится.
  5. На последнем использовании предмет исчезает из рук, но удаляется чуть позже, когда эффект кончится: если удалить скрипт сразу, Roblox остановит все его таймеры — и эффект не выключится.

Скрипты

ShieldServer

Где: StarterPack → Shield · Script
Зачем: Ставит силовое поле на Duration секунд.

-- щит (Tool)
local tool = script.Parent
-- модель
local handle = tool:WaitForChild("Handle")
-- настройки
local config = tool:WaitForChild("Configuration")
-- звук использования
local useSound = handle:WaitForChild("Use")
-- все игроки
local Players = game:GetService("Players")
-- удаление по таймеру
local Debris = game:GetService("Debris")
-- время прошлого использования
local lastUse = 0
-- сколько раз ещё можно
local uses = config.Uses.Value
-- подсказка на панели предметов
tool.ToolTip = "Щит: " .. uses

-- клик, пока предмет в руках (событие приходит и на сервер)
tool.Activated:Connect(function()
    -- кто держит
    local humanoid = tool.Parent:FindFirstChildOfClass("Humanoid")
    -- нет персонажа или он мёртв
    if not humanoid or humanoid.Health <= 0 then return end
    -- его персонаж
    local character = humanoid.Parent
    -- и игрок
    local player = Players:GetPlayerFromCharacter(character)
    -- щит уже стоит — не тратим
    if character:FindFirstChild("Shield") then return end
    -- откат ещё не прошёл
    if os.clock() - lastUse < config.Cooldown.Value then return end
    -- запоминаем
    lastUse = os.clock()
    -- звук
    useSound:Play()
    -- силовое поле Roblox
    local shield = Instance.new("ForceField")
    -- имя — чтобы не поставить второй
    shield.Name = "Shield"
    -- светящаяся сфера вокруг персонажа
    shield.Visible = true
    -- на персонажа: TakeDamage больше не ранит
    shield.Parent = character
    -- через Duration секунд исчезнет само
    Debris:AddItem(shield, config.Duration.Value)
    -- минус одно использование
    uses -= 1
    -- обновляем подсказку
    tool.ToolTip = "Щит: " .. uses
    -- использования кончились
    if uses <= 0 then
        -- убираем из рук; здесь скрипт продолжит работать
        tool.Parent = game:GetService("ServerScriptService")
        -- ждём конца эффекта — иначе его таймер остановится
        task.wait(config.Duration.Value + 1)
        -- теперь удаляем совсем
        tool:Destroy()
    -- конец проверки
    end
-- конец обработчика
end)

Проверка

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

Собрать щит одной командой