Roblox · Усиления
Светящиеся кубики на карте: пробежал сквозь — получил ускорение, прыжок, щит или лечение. Белый кубик даёт случайный бонус. Через 15 секунд кубик появляется снова.
Синим — что нужно создать.
Workspace └─ PowerUps (Folder) └─ PowerUp (Part) — Neon, CanCollide выкл.; атрибут Kind: Speed / Jump / Shield / Heal (пусто — случайный) └─ PointLight (PointLight) — свечение ServerScriptService ├─ WeaponEffects (ModuleScript) — общий модуль эффектов (версия с Heal и Boost) └─ PowerUpsServer (Script)
Где: ServerScriptService · Script
Зачем: Выдаёт бонус при касании и возвращает кубик.
-- все игроки
local Players = game:GetService("Players")
-- удаление по таймеру
local Debris = game:GetService("Debris")
-- общий модуль эффектов
local Effects = require(game:GetService("ServerScriptService"):WaitForChild("WeaponEffects"))
-- бонусы на карте
local folder = workspace:WaitForChild("PowerUps")
-- через сколько секунд бонус появляется снова
local RESPAWN = 15
-- сколько секунд действует
local DURATION = 10
-- все виды — для случайного бонуса
local KINDS = {"Speed", "Jump", "Shield", "Heal"}
-- выдать бонус
local function Apply(humanoid, kind)
-- скорость
if kind == "Speed" then
-- в 1,5 раза быстрее
Effects.Boost(humanoid, "Speed", 1.5, DURATION)
-- прыжок
elseif kind == "Jump" then
-- вдвое выше
Effects.Boost(humanoid, "Jump", 2, DURATION)
-- щит
elseif kind == "Shield" then
-- силовое поле
local shield = Instance.new("ForceField")
-- на персонажа
shield.Parent = humanoid.Parent
-- исчезнет само
Debris:AddItem(shield, DURATION)
-- лечение
else
-- +30 сразу и по 3 в секунду 5 секунд
Effects.Heal(humanoid, 30, 3, 5)
-- конец выбора
end
-- конец функции
end
-- подключить бонус
local function Setup(part)
-- бонус — одна деталь
if not part:IsA("BasePart") then return end
-- как он выглядит, когда виден
local look = part.Transparency
-- бонуса коснулись
part.Touched:Connect(function(otherPart)
-- уже взят
if not part.CanTouch then return end
-- это персонаж?
local humanoid = otherPart.Parent:FindFirstChildOfClass("Humanoid")
-- нет или мёртв
if not humanoid or humanoid.Health <= 0 then return end
-- только игроки
if not Players:GetPlayerFromCharacter(otherPart.Parent) then return end
-- второй раз не взять
part.CanTouch = false
-- исчезает
part.Transparency = 1
-- атрибут Kind — какой бонус; пусто — случайный
Apply(humanoid, part:GetAttribute("Kind") or KINDS[math.random(#KINDS)])
-- через несколько секунд
task.delay(part:GetAttribute("Respawn") or RESPAWN, function()
-- снова виден
part.Transparency = look
-- и берётся
part.CanTouch = true
-- конец отложенной функции
end)
-- конец обработчика
end)
-- конец функции
end
-- бонусы, что уже стоят
for _, part in ipairs(folder:GetChildren()) do Setup(part) end
-- и новые
folder.ChildAdded:Connect(Setup)Запусти Play (или Run) и убедись: