К карте
ОСТРОВА ИГРОКОВ · ЭКСПЕДИЦИЯ V · КВЕСТ 7
Склянки и раунды
0
Прогресс0 / 6
ПОСТАВЬ ПЕРВУЮ ДЕТАЛЬ

Нажми — и деталь появится в мире

Жми кнопки по очереди — это три строчки настоящего скрипта.
ПЕРЕД СТАРТОМ
⏱ Сколько займёт
40–60 минут, 6 шагов. Каждый шаг заканчивается результатом на экране.
💻 Что нужно
Компьютер с Windows или macOS. Понадобится Roblox Studio — бесплатная, поставим на первом шаге. С телефона этот квест не проходится.
⏸ Если прервёшься
Ничего не потеряется: прогресс сохраняется на этом устройстве. Вернёшься — продолжишь с того же шага.
🎓 Чему научишься
игровой цикл · таймер и раунды · состояния игры
ШАГ 1 ИЗ 6 · ЭКСПЕДИЦИЯ V · ПИРАТСКАЯ БУХТА · КВЕСТ 7

Игра, которая идёт сама

ЧТО ПРОИСХОДИТ
ЭПИЗОД 24Палуба «Дублона»

Клык бьёт в склянки: восемь ударов. Все бросают дела и идут на палубу.

«Море живёт по склянкам, — говорит он. — Игра тоже. Ждём, играем, считаем победителя, начинаем снова».

Этот круг и есть настоящая многопользовательская игра. Без него — просто песочница.

боцман Клык · старший на палубе
ЧТО ПОЛУЧИТСЯ
ЗАПИСЬ ГОТОВОЙ ИГРЫ
Матч идёт сам: ожидание → РАУНД с таймером → итоги — и снова, без единой команды сверху. Этот цикл держит все сетевые игры мира.

Это запись из Roblox Studio: игра, которая объявляет старт и подводит итоги сама. Такой же круг раунда ты соберёшь за этот квест.

СНАЧАЛА — ПОСМОТРИ
ЖИВАЯ ЗАПИСЬ СТУДИИ
Житель с восклицательным знаком над головой — задание ждёт. Тот же круг, что и в раундах: начали → сыграли → итоги.
ШТУРМАН · ВЕДУЩИЙ
Читать текстом
Звонарь, посмотри на свою игру честно. Матч в ней начинается, когда ты крикнул «поехали», и заканчивается, когда все устали. А теперь вспомни любую настоящую игру: там никто ничего не кричит. Матч сам объявляет старт, сам отсчитывает время, сам подводит итоги — и тут же начинает следующий. Сегодня твой остров научится жить без тебя. Это последний остров перед финалом, и он превращает набор механик в игру.

Соберём круг раунда: подготовка, матч, итоги — и снова.

Круг раунда — он крутится вечно 1 · ПОДГОТОВКА · PREP 10 секунд · счёт обнулён 2 · МАТЧ · MATCH 90 секунд · гоняем мяч 3 · ИТОГИ · RESULTS 8 секунд · кто победил 4 · СНОВА никто не расходится

Вот весь механизм: четыре шага по кругу. Такой круг есть в каждой игре с матчами — от футбола до огромных сетевых проектов. Меняются только цифры и правила внутри.

ШАГ 2 ИЗ 6 · ~20 МИНУТ

Сердце матча

Script — главный цикл
1  -- Script в ServerScriptService — сердце матча
2  local PREP, MATCH, RESULTS = 10, 90, 8
3  
4  while true do
5    resetRound()                              -- чистим прошлый матч
6    countdown(PREP, "Матч через")
7    announce:FireAllClients("ПОЕХАЛИ!")
8    countdown(MATCH, "До конца")
9    announce:FireAllClients(whoLeads())
10   task.wait(RESULTS)
11 end  -- и снова по кругу, вечно

Одиннадцать строк — и матч крутится вечно. while true do означает «повторяй, пока игра жива». Внутри — ровно тот круг, что был на схеме: сброс, отсчёт, старт, матч, итоги, пауза. Три числа в строке 2 — длительности фаз: PREP, MATCH, RESULTS. Пока не набирай это: цикл зовёт resetRound, countdown, whoLeads и announce, которых ещё нет. Их напишем дальше, а на шаге 4 будет весь скрипт целиком — оттуда и набирай, сверху вниз.

ОПАСНОСТЬ: цикл без паузы вешает Studio намертво while true do print("ой") end — миллион повторов в секунду; окно замирает, а через ~10 секунд Roblox обрывает скрипт: Script timeout Правило: в каждом while ОБЯЗАТЕЛЬНО task.wait() Написал while — сразу пиши wait, потом всё остальное

Прочитай это дважды. В нашем цикле пауза спрятана внутри countdown — там есть task.wait(1). Без неё Studio замирает секунд на десять, а потом Roblox сам обрывает скрипт строкой «Script timeout: exhausted allowed execution time» — и матч не запустится вовсе. Привычка простая: написал while — сразу поставь wait.

Обратный отсчёт
1  local function countdown(seconds, text)
2    for i = seconds, 1, -1 do   -- шаг -1: считаем НАЗАД
3      announce:FireAllClients(text .. " " .. i)
4      task.wait(1)                    -- ждём ровно секунду
5    end
6  end

Знакомый for, но с хитростью: шаг -1 заставляет считать назад — 10, 9, 8… Каждый круг цикла кричит новое число всем игрокам и ждёт секунду. Так и получается таймер.

НАСТОЯЩИЙ ЭКРАН ROBLOX STUDIO — КУДА НАЖИМАТЬ
ТВОЙ ЭКРАН ROBLOX STUDIO — КУДА НАЖИМАТЬнажми на кружок — покажу место
Окно редактора
  • 1ServerScriptService — сердце матча«+» на строке → Script. Тут крутится while true do: сброс, отсчёт, «ПОЕХАЛИ!», матч, итоги — и снова. Правило без исключений: написал while — сразу пиши task.wait, иначе Studio повиснет намертво вместе с несохранённой работой.
  • 2ReplicatedStorage — рупор на всех«+» → RemoteEvent, назови «Объявление». Через него сервер кричит сразу всем: FireAllClients("До конца 10"). Тот же мост, что и раньше, только в обратную сторону.
  • 3StarterGui — где появляется надпись«+» → ScreenGui, внутрь него TextLabel, а внутрь надписи — LocalScript с OnClientEvent. Никакой доски с SurfaceGui строить не нужно: текст живёт прямо на экране у каждого.
  • 4Синий треугольник ▶ — дождись конца раундаНе выключай сразу: цикл обязан пойти по второму кругу сам. Красный квадрат рядом обрывает тест, если что-то пошло не так.
  • 5Вкладка Script — окно OutputОткрывается отсюда, вкладки View в этой Studio нет. Если Studio замерла и не отвечает — почти всегда это while без task.wait внутри.
Отмечено:0 из 5

Это настоящий экран Roblox Studio 2026 — такой же, как у тебя: та же лента вкладок, тот же Explorer со всеми сервисами, та же панель Properties. Нажимай на кружки по порядку: метка покажет место, строка ниже объяснит, зачем оно. Чего на кадре нет — про то честно написано словами. Отмечай пройденное — прогресс сохранится.

ШАГ 3 ИЗ 6 · ~15 МИНУТ

Голос на весь остров

Мост работает и в обратную сторону Квест 5: клиент → серверу FireServer() один игрок просит Сейчас: сервер → всем FireAllClients() сервер объявляет всем сразу Маша ты Ваня Одна строка на сервере — надпись появилась у каждого

Помнишь мост из пятого острова? Он двусторонний. FireServer — один игрок просит сервер. FireAllClients — сервер объявляет всем сразу. Именно так работают надписи «ПОЕХАЛИ!» и «До конца 10».

LocalScript — ловим объявление и показываем
1  -- LocalScript внутри TextLabel на экране
2  local label = script.Parent
3  local RS = game:GetService("ReplicatedStorage")
4  local announce = RS:WaitForChild("Объявление")
5  
6  announce.OnClientEvent:Connect(function(text)
7    -- тут player НЕ приходит: клиент и так знает, что он это он
8    label.Text = text
9  end)

Ловит объявление OnClientEvent. И важная деталь, которая часто путает: здесь player первым не приходит. На сервере он нужен был, чтобы понять, кто крикнул. А клиенту это незачем — он и так один.

Проверка · Чем FireAllClients отличается от FireServer?

Ничем, просто разные названия
FireAllClients работает быстрее
FireServer — от игрока серверу, FireAllClients — от сервера сразу всем
Смотри на названия: «выстрелить серверу» и «выстрелить всем клиентам». Направление разное.

Что случится с while true do без task.wait внутри?

Цикл выполнится один раз
Studio зависнет — цикл крутится без остановки
Roblox сам добавит паузу
Компьютер выполняет команды очень быстро. Без паузы он будет крутить цикл миллионы раз в секунду.

Оба верных ответа — +10 дублонов.

ЭКСКУРС
КАК В НАСТОЯЩИХ ИГРАХ

Игровой цикл: чем живут все сетевые игры

Почти любая многопользовательская игра крутится по кругу: ожидание — раунд — итоги — снова. Так устроены и шутеры, и обби, и прятки.

В Tower of Hell раунд длится восемь минут, потом башня собирается заново — и все начинают одновременно.

Цикл решает главную проблему: опоздавшие. Пришёл посреди раунда — подождал немного и играешь со всеми на равных.

ШАГ 4 ИЗ 6 · ТРЕНАЖЁР

Второй раунд начинается со старым счётом

Script — матч идёт, но что-то не так
1while true do
2 countdown(PREP, "Матч через")
3 announce:FireAllClients("ПОЕХАЛИ!")
4 countdown(MATCH, "До конца")
5 announce:FireAllClients(whoLeads())
6 task.wait(RESULTS)
7end
ЧТО ВИДЯТ ИГРОКИ
Первый матч отличный: 3 : 2, всё честно. Второй начинается — а на табло уже 3 : 2, мяч валяется в воротах. К пятому раунду счёт 14 : 11 и играть бессмысленно.

Пятый вид поломки — пропущенная строка. Всё написанное верно, ошибок нет, первый матч честный. А со второго игра начинает разваливаться. Найди место, где чего-то не хватает.

Тот самый сброс
1  local function resetRound()
2    for _, team in ipairs(Teams:GetChildren()) do
3      team["Очки"].Value = 0      -- счёт с чистого листа
4    end
5    sendHome()               -- мяч в центр — уже умеем
6    lastTeam = nil               -- и память о касании
7  end
Script — раунды целиком, в конец скрипта мяча
1  -- дописываем В КОНЕЦ скрипта мяча (там уже есть ball, home,
2  -- sendHome и lastTeam — они нам понадобятся)
3  local Teams = game:GetService("Teams")
4  local RS = game:GetService("ReplicatedStorage")
5  local announce = RS:FindFirstChild("Объявление")
6  if not announce then            -- нет — создаём сами
7    announce = Instance.new("RemoteEvent")
8    announce.Name = "Объявление"
9    announce.Parent = RS
10 end
11 
12 local PREP, MATCH, RESULTS = 10, 90, 8
13 
14 local function countdown(seconds, text)
15   for i = seconds, 1, -1 do
16     announce:FireAllClients(text .. " " .. i)
17     task.wait(1)
18   end
19 end
20 
21 local function whoLeads()
22   local red = Teams["Красные"]["Очки"].Value
23   local blue = Teams["Синие"]["Очки"].Value
24   if red > blue then return "КРАСНЫЕ победили!" end
25   if blue > red then return "СИНИЕ победили!" end
26   return "НИЧЬЯ " .. red .. " : " .. blue  -- поровну — тоже ответ
27 end
28 
29 local function resetRound()
30   for _, team in ipairs(Teams:GetChildren()) do
31     team["Очки"].Value = 0
32   end
33   sendHome()               -- из скрипта мяча
34   lastTeam = nil               -- оттуда же
35 end
36 
37 while true do                    -- цикл — САМЫМ ПОСЛЕДНИМ
38   resetRound()
39   countdown(PREP, "Матч через")
40   announce:FireAllClients("ПОЕХАЛИ!")
41   countdown(MATCH, "До конца")
42   announce:FireAllClients(whoLeads())
43   task.wait(RESULTS)
44 end

Сброс собирает всё, что ты делал в прошлых квестах: обнуляет счёт команд (остров 3), возвращает мяч домой (остров 4) и чистит память о касании (тоже остров 4). А вторая карточка — весь скрипт раундов целиком: добавь его в конец скрипта мяча, где уже живут ball, home, sendHome и lastTeam. И запомни порядок: сначала все функции, цикл — самой последней строкой. Всё, что окажется под while true do, не выполнится никогда.

ШАГ 5 ИЗ 6 · ~15 МИНУТ

Табло матча на экране

ДО КОНЦА 47 крупно и по центру сверху ЗАЖЕЧЬ МАЯК Надпись сверху, кнопка снизу — середина свободна для игры

Надпись делается как кнопка, только это TextLabel: наведи на тот же ScreenGui → «+» → TextLabel, а внутрь неё → «+» → LocalScript. Размер и место — тем же fromScale. Ставь её сверху по центру — там взгляд ищет счёт и время, а середину экрана оставь для самой игры.

Мелочи, из-за которых матч чувствуется живым · Последние 10 секунд — надпись краснеет · «ПОЕХАЛИ!» — крупнее остальных надписей · На итогах — цвет команды-победителя · При ничьей — «НИЧЬЯ! РЕВАНШ ЧЕРЕЗ 8» Каждая мелочь — одна строка. А ощущение меняется сильно.

Матч уже идёт сам? Тогда добавь одну мелочь из списка. Особенно советую первую: когда время краснеет, последние секунды становятся настоящими.

Судовой журнал — отметь сделанное:
Создал RemoteEvent «Объявление» в ReplicatedStorage
TextLabel сверху ловит объявления
Обратный отсчёт идёт по секундам
В каждом while есть task.wait
Сброс обнуляет счёт и возвращает мяч
Прогнал ТРИ раунда подряд — счёт каждый раз с нуля
Опубликовал обновление: File → Publish to Roblox (Alt+P)

Шестая галочка — главная проверка этого острова. Один раунд может выглядеть нормально по случайности. Три подряд покажут правду: если счёт каждый раз стартует с нуля, сброс работает.

ШАГ 6 ИЗ 6 · ФИНАЛ

Теперь это настоящая игра

Что ты собрал за семь островов 1 · сервер, который видят все 2 · команды и правило свой-чужой 3 · общий счёт команды 4 · мяч, за которым гоняются 5 · мост между клиентом и сервером 6 · кнопка, понятная с телефона 7 · раунды, которые идут сами Это уже не «проект в Studio». Это игра, в которую можно позвать.

Оглянись на список. Каждая строчка была отдельным островом, а вместе они собрались в работающую игру с матчами. Осталось одно: собрать всё в свою собственную — и это финальный остров.

Вызов друзьям: позови сразу троих и не объясняй ничего. Просто смотри, разберутся ли они сами. Если да — ты сделал понятную игру, а это умеют далеко не все взрослые разработчики.

ШТУРМАН · ВЕДУЩИЙ
Читать текстом
Семь островов позади! Твоя игра теперь живёт сама: объявляет старт, считает время, подводит итоги и начинает заново. Это тот самый момент, когда проект превращается в игру. Впереди последний остров экспедиции — там не будет новых команд. Там ты возьмёшь всё, что собрал, и сделаешь свою собственную игру на всех: свои правила, своё поле, своё название. И станешь Штурманом — тем, кто прокладывает курс сам.

Жми — Гильдия отметит седьмой остров.

Матч идёт сам!

Седьмой артефакт: раунды, которые начинаются, идут и заканчиваются без тебя. Бейдж «ВАХТЕННЫЙ» твой. Впереди финал — своя игра и звание ШТУРМАН.

Что дальше. На причале собралась вся команда. Капитан впервые ничего не объясняет.

🏅 Забрать диплом Следующий квест: Своя игра на всех Вернуться на карту экспедиции
🔒

Этот остров ещё закрыт

Сначала пройди предыдущий квест — хотя бы просмотри все шаги.

⚑ Экспедиционный режим