Roblox · Дополнительное

Король горы

Мини-игра: кто дольше всех продержится на вершине, тот король. Над вершиной — «Король горы: имя», над головой короля крутится корона, в таблице справа копятся секунды царствования.

Структура

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

Workspace
└─ KingHill (Model)
   ├─ Step0…Step3 (Part) — ярусы горы
   ├─ BaseRing (Part) — золотой круг на вершине
   │  └─ KingGui (BillboardGui) — KingText (TextLabel)
   ├─ Zone (Part) — невидимая область над вершиной, CanCollide выкл.
   ├─ Crown (Part) — корона: Anchored, CanCollide выкл.
   └─ KingServer (Script)

Шаги

  1. Гора — ярусы из деталей или ландшафт (Editor → Add). На вершине — плоский цилиндр «BaseRing».
  2. Над ним невидимая деталь «Zone» (Transparency 1, CanCollide, CanTouch, CanQuery выкл.) — кто внутри, тот «на вершине».
  3. BillboardGui «KingGui» в BaseRing — надпись в мире, всегда повёрнута к камере. StudsOffsetWorldSpace поднимает её над вершиной, AlwaysOnTop — видно сквозь стены.
  4. Корона — любой меш из Toolbox (переименуй в Crown, Anchored, CanCollide выкл.). Сервер каждый кадр ставит её над головой короля и поворачивает.
  5. Правило: король остаётся королём, пока стоит на вершине. Ушёл или упал — королём становится первый, кто наверху.
  6. Вершину можно оборонять: добавь батуты (Дополнительное → «Батут-пушка») и толкай соперников.

Скрипты

KingServer

Где: Workspace → KingHill · Script
Зачем: Король, корона, секунды.

-- игроки
local Players = game:GetService("Players")
-- каждый кадр
local RunService = game:GetService("RunService")
-- модель KingHill
local hill = script.Parent
-- невидимая область над вершиной
local zone = hill:WaitForChild("Zone")
-- корона
local crown = hill:WaitForChild("Crown")
-- надпись над вершиной
local label = hill:WaitForChild("BaseRing"):WaitForChild("KingGui"):WaitForChild("KingText")
-- кто сейчас король
local king = nil
-- угол вращения короны
local spin = 0

-- счётчик «Король, с» в таблице справа
local function Seconds(player)
    -- таблица (или новая)
    local stats = player:FindFirstChild("leaderstats") or Instance.new("Folder")
    -- имя — так Roblox показывает её справа
    stats.Name = "leaderstats"
    -- в игрока
    stats.Parent = player
    -- счётчик (или новый)
    local value = stats:FindFirstChild("KingTime") or Instance.new("IntValue")
    -- имя
    value.Name = "KingTime"
    -- в таблицу
    value.Parent = stats
    -- отдаём
    return value
-- конец функции
end
-- новые игроки
Players.PlayerAdded:Connect(Seconds)
-- кто зашёл раньше скрипта
for _, player in ipairs(Players:GetPlayers()) do Seconds(player) end

-- живые игроки на вершине
local function OnTop()
    -- список
    local list = {}
    -- детали в области
    for _, part in ipairs(workspace:GetPartsInPart(zone)) do
        -- чей персонаж
        local player = Players:GetPlayerFromCharacter(part.Parent)
        -- Humanoid
        local humanoid = part.Parent:FindFirstChildOfClass("Humanoid")
        -- живой и ещё не в списке
        if player and humanoid and humanoid.Health > 0 and not table.find(list, player) then table.insert(list, player) end
    -- конец перебора
    end
    -- кто наверху
    return list
-- конец функции
end

-- раз в секунду — отдельно от вращения
task.spawn(function()
    -- бесконечно
    while true do
        -- секунда
        task.wait(1)
        -- кто наверху
        local list = OnTop()
        -- король ушёл или упал — королём становится первый оставшийся
        if not (king and table.find(list, king)) then king = list[1] end
        -- надпись
        label.Text = king and ("Король горы: " .. king.DisplayName) or "Король горы: —"
        -- +1 секунда царствования
        if king then Seconds(king).Value += 1 end
    -- конец цикла
    end
-- конец функции
end)
-- каждый кадр
RunService.Heartbeat:Connect(function(dt)
    -- корона крутится
    spin += dt * 2
    -- голова короля
    local head = king and king.Character and king.Character:FindFirstChild("Head")
    -- над головой короля или над вершиной
    local position = head and head.Position + Vector3.new(0, 2.5, 0) or zone.Position + Vector3.new(0, zone.Size.Y / 2 + 3, 0)
    -- ставим и поворачиваем
    crown.CFrame = CFrame.new(position) * CFrame.Angles(0, spin, 0)
-- конец функции
end)

Проверка

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

Собрать гору одной командой