Skip to content

About

Legendary experience in roblox platform

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

17 Commits

Folders and files

Repository files navigation

Robostrike

Проект Roblox на Luau (язык Roblox). В сцену подключена геометрия fy_pool_day из GoldSrc BSP: бассейн, помещения, статичные объекты и 32 точки появления. Добавлены персонаж, вид от первого лица, четыре слота, серверная стрельба и раунды 3×3 с ботами. Подробнее об импорте — в assets/README.md.

Первый запуск на этом Mac

В папке .tools лежит локальный Rojo 7.7.1. Он собирает исходники в файл, который открывается в Roblox Studio. Глобальная установка не нужна.

cd ~/sandbox/robostrike
mkdir -p build
./.tools/rojo build default.project.json -o build/robostrike.rbxlx
open -a RobloxStudio build/robostrike.rbxlx

Если команда open не находит приложение, открой Roblox Studio и выбери File → Open from File…, затем файл build/robostrike.rbxlx. Нажми Play (кнопка с треугольником), чтобы появился персонаж. Для выхода из тестирования нажми Stop.

Сессии 3×3

  • Первый экран: «Новый сервер» / «Найти сервер». Создать сессию может любой игрок: сначала он задаёт имя (1–48 символов), затем выбирает команду и существующие настройки. Создатель управляет только своей сессией; привязки к владельцу игры больше нет. Его уход закрывает сессию и сбрасывает счёт, остальные игроки возвращаются к выбору серверов.
  • «Найти сервер» показывает именованные сессии, число игроков и состояние. Поиск по имени — без учёта регистра для русского/английского текста; кнопка «Искать» или завершение ввода применяет поиск. Пагинация — 50 строк по умолчанию, можно выбрать 10 или 20. «Обновить» перечитывает каталог (межсерверный кэш до 10 секунд, сведения о сессии обновляются каждые 20 секунд). Закрытые серверы удаляются, после аварийного завершения исчезают за 90 секунд.
  • В опубликованной игре каждая сессия — отдельный reserved server того же place, переходы выполняет TeleportService, каталог хранит MemoryStoreService. Имена фильтрует Roblox TextService; если название скрыто решётками, создание отклоняется с просьбой выбрать другое имя. Коды доступа не передаются клиентам. В Studio / Server & Clients используется локальный каталог: одна сессия на тестовый сервер без телепортов и облачных API. Любой тестовый игрок может создать её, остальные входят через «Найти сервер». Несколько независимых сессий и межсерверный поиск проверяются только в опубликованной игре Roblox.
  • До первого раунда создатель выбирает 0–3 бота на команду и нажимает «Начать сессию». Это верхний предел: всего в команде не больше трёх участников, люди занимают места в приоритете. Выбор команды сам по себе больше не запускает бой. Для фонового трека экрана настройки подготовлен assets/audio/shiza.mp3; загрузка в Roblox и подключение ID описаны в assets/audio/README.md. При «Без ботов» можно стартовать одному, выбрав любую команду. Это бесконечная сессия для отладки: уничтожение команды и смерть всех игроков не завершают раунд и не начисляют победы. Сервер остаётся доступен в каталоге; новый игрок после выбора свободной команды появляется сразу, даже если бой уже идёт. После смерти для нового спавна перезапусти сессию через M. В каждой команде три места: боты в пределах выбранного лимита — с M4A1, поиском пути, проверкой видимости и стрельбой. Команды различаются скинами, без повязок. Небольшой приглушённый ник над головой есть только у живых игроков, не у ботов; он виден до 70 studs и не отображается сквозь стены.
  • Первый вход в команду заменяет живого бота на его позиции с сохранением HP, брони и патронов автомата. Если свободны только погибшие места — игрок ждёт следующего раунда. При отключении живого игрока его место занимает живой бот только при наличии свободного лимита ботов, с сохранением позиции, HP и брони, без дополнительной жизни команды. В режиме без ботов замены не создаются.
  • M открывает/закрывает меню поверх своей камеры. Живой персонаж стоит на месте, не стреляет, но остаётся уязвимым. Выбор любой команды, включая свою, убивает персонажа: до следующего раунда можно только наблюдать за новой командой. Команда с тремя людьми недоступна для входа.
  • Администратор в меню M может выбрать новое количество ботов и нажать «Перезапустить сессию», в том числе после перевыбора команды: его меню при выборе остаётся открытым. Изменение количества само по себе не меняет бой. Перезапуск сохраняет выбранные людьми команды, сбрасывает счёт и номер раунда, удаляет прежних ботов и возвращает всех на спавн с новым лимитом и новым фризом. Перезапуск без ботов тоже доступен с одним игроком. Обычным игрокам перезапуск недоступен. Здесь администратор — создатель конкретной сессии. «Выйти с сервера» возвращает к первому экрану (в Roblox — через переход на публичный сервер).
  • Смерть не вызывает респавн. Наблюдение — от первого лица живого союзника, сначала человека, затем бота. Для людей передаётся направление их камеры.
  • Уничтожение команды завершает раунд; одновременное уничтожение — ничья. Справа сверху — победы красных/синих. Через 4 секунды все появляются в комнатах за стеной; ещё 1 секунду разрешено только вращать камеру, затем начинается бой.
  • Выживший переносит в следующий раунд оружие, остаток патронов и гранат, броню с прежней прочностью и каской. Погибший получает стартовый комплект. Дропы прошлого раунда удаляются, предметы в комнатах восстанавливаются. Перезапуск сессии сбрасывает снаряжение всех игроков.
  • Friendly Fire отключён для пуль, ножа и гранат: броня союзников тоже не теряется. Собственная граната по-прежнему опасна. Числа нанесённого урона всплывают над целью только у атакующего игрока, включая попадания по ботам и людям.
  • Входящий урон показывает затухающую градиентную красную дугу со стороны атаки; направление обновляется при повороте камеры. Попадание в голову резко подбрасывает камеру вверх и сбивает оружие/перекрестье вниз с плавным возвратом за 0,5 секунды. Пули в это время летят по фактическому направлению сбитого ствола.
  • Стандартный звук смерти заглушён. Для крика Вильгельма настроен публичный audio ID 160718677; разрешение и доступность нужно проверить в опубликованной игре. Если Roblox блокирует этот ассет, замени WilhelmSoundId в src/shared/SessionRules.luau на разрешённый для игры аудиоассет.

Проверка в Studio Server & Clients: один игрок против ботов; второй игрок в своей/противоположной команде; замена живого/погибшего бота; M и повторный выбор; смерть наблюдаемого союзника; Friendly Fire всеми тремя видами оружия; новый раунд; отключение игрока и создателя сессии; создание не владельцем игры, поиск, страницы 10/20/50 и подключение после старта без ботов. Поиск пути ботов, камеру и аудио обязательно проверить в движке — офлайн-тесты не моделируют Roblox-физику и репликацию.

Персонаж и управление

  • Синие — тактические полицейские в стиле референса: угловатая тёмно-синяя броня, шлем с поднятыми очками, закрытое лицо с двумя простыми глазами, наплечники, бронепластины на предплечьях, пояс с рацией и подсумками. Шлем и пластины — постоянная часть скина, не дают игровой защиты: она по-прежнему определяется подобранной бронёй и показателями HUD. Внутри сохранён R6-риг для существующих анимаций и коллизий; внешность не зависит от аватара аккаунта и не требует ассетов из каталога. Игроки и боты уменьшены на 10% вместе с формой и R6-ригом.
  • Красные — образ в духе Phoenix из CS 1.6: тёмная балаклава с прорезью для глаз, коричневая куртка, камуфляжные брюки, перчатки и ботинки, без полицейских знаков. Одинаково для игроков и ботов; рукава от первого лица соответствуют команде.
  • Вид от первого лица; отдельные руки в тёмных рукавах и перчатках и оружие перед камерой. Руки и оружие перед камерой также уменьшены на 10%. Собственный мировой R6-риг вместе с формой и аксессуарами скрывается локально, включая детали, добавленные после респавна. Во время фриза оружие и руки остаются привязаны к камере, а не к мировой позиции из прошлого раунда. Посадка под правую руку, ближе к корпусу: ствол направлен внутрь к центру экрана, приклад уходит за нижний правый край, левая рука поддерживает цевьё. View, ADS, SightHeight, RightHand и LeftHand в src/shared/Weapons.luau настраивают посадку и прицеливание отдельно от серверного Grip.
  • WASD — движение, Space — прыжок. Бег по умолчанию — 19.8 studs/s; скорость ботов — 14.4 studs/s. Все наземные скорости уменьшены на 10%.
  • В бассейне персонаж плавно опускается на дно с ограничением скорости до 8.75 studs/s. Space запускает плавное всплытие; держать клавишу не нужно. На поверхности персонаж слегка покачивается и может двигаться. Движение к бортику автоматически запускает небольшой прыжок на свободный край. Короткие волны затухают у стенок; поверхность использует Glass для бликов и оптического эффекта (вид зависит от качества графики Roblox).
  • Удерживай Shift для шага (9 studs/s), C или любой Ctrl для приседания (5.4 studs/s). На Mac рекомендуется C: не требует правого Ctrl и не конфликтует с Control-сочетаниями macOS. Отпускание клавиши под низким потолком не поднимает персонажа сквозь препятствие: он встанет, когда над головой появится место. Прыжок в приседе отключён.
  • Ноги игроков и ботов двигаются по фактической скорости, включая шаг назад, движение боком и присед. Автоматы и пистолет удерживаются двумя руками; ствол направлен горизонтально вперёд на высоте плеч, независимо от наклона руки. процедурные позы не требуют загрузки анимационных ассетов Roblox.
  • 1–4 или колёсико мыши — основное оружие (M4A1 / AK-47 / M249), Glock 17, нож, гранаты. Повторное 4 переключает «Гранату 38» и «Гранату 69» в одном слоте.
  • F10 или кнопка «Настройки» — общая громкость, отдельно персонажи (шаги и смерть) и стрельба. Ползунки 0–100% и кнопки ± меняют уже звучащие и будущие звуки, работают мышью и касанием; звук и чувствительность сохраняются в DataStore аккаунта, включая выход и повторный запуск игры. Для проверки в Studio нужна опубликованная игра и Enable Studio Access to API Services (лучше в тестовой копии). Там же — чувствительность мыши 10–200% (по умолчанию 100%), ползунок и кнопки ±. Во вкладке «Управление» — список текущих клавиш движения, оружия и меню с прокруткой. Пока только просмотр: переназначение привязок недоступно. Звук смерти дополнительно тише на 20% (базовая громкость 0,64 вместо 0,8). Roblox не разрешает добавлять вкладки в системный CoreGui: после открытия и закрытия меню Escape показывается эта отдельная панель. Закрыть её можно кнопкой «Вернуться в игру» или F10. Системное меню Roblox не подменяется. Настройки блокируют игровые действия, но не ставят сетевой бой на паузу.
  • Удерживай Alt / Option (левый или правый), чтобы освободить курсор и нажимать на HUD. Мышь временно не поворачивает камеру и не активирует оружие; после отпускания возвращается обычное управление.
  • ЛКМ — M4A1 стреляет тапами или зажимом, Glock 17 — только одиночными по отдельному нажатию. Быстрые тапы накапливают отдачу так же, как очередь. ПКМ — прицеливание через мушку и целик, R — перезарядка. M4A1: 700 выстрелов/мин, магазин 30, перезарядка 2,3 с; Glock 17: магазин 17, перезарядка 1,7 с. В каждом оружии полный магазин и ещё 3 в запасе: M4A1 — 30 + 90, Glock — 17 + 51 патрон. Перезарядка переносит недостающие патроны из запаса, не теряя остаток магазина. Смена оружия и дроп прерывают перезарядку.
  • AK-47: магазин 30 + 90 в запасе, 600 выстрелов/мин, перезарядка 2,5 с; урон ×1, разброс ×1. M249: 100 выстрелов без перезарядки + 300 в запасе, 750 выстрелов/мин, перезарядка 5 с; урон ×1,2, разброс ×2. У M4A1 урон теперь ×0,9, разброс остаётся ×0,8. Новые модели лежат в обеих комнатах: выброси текущее основное оружие (G), затем подойди к нужному. Все три модели занимают один слот 1.
  • HUD слева сверху появляется только при смене слота и скрывается через 2 секунды; при первом появлении и респавне скрыт. Стандартный рюкзак и Shift Lock отключены. Полоска здоровья — снизу слева, HP и броня справа от неё; стандартная полоска скрыта.
  • M4A1, AK-47, M249 и Glock 17 — локальные объёмные модели: отдельные ствольная коробка, ствол, магазин, рукоять и открытые механические прицелы; у M4 также приклад, цевьё, планки и пламегаситель. Модели одинаковы в мире и у камеры, не зависят от доступа к каталожным мешам. Нож поддерживает режущий и колющий удары; исходные ассеты ножа и гранат перечислены в assets/stock/README.md.

Ножевой бой

  • Слот 3: ЛКМ — режущий замах 0,3 с, урон только на 0,1–0,2 с, дальность 0,2 м; ПКМ — колющий удар 0,8 с, урон на 0,3–0,5 с, дальность 0,3 м. Удерживание повторяет выбранный удар после полного завершения.
  • Режущий удар проходит дугой перед взглядом, колющий направлен по центру экрана. Дальность считается от поверхности головы в направлении удара (1 stud = 0,28 м). Можно доводить удар взглядом и входить в дистанцию во время активного окна.
  • Урон по тем же зонам, что и стрельба: ×0,6 для режущего и ×3 для колющего. Бронежилет/каска уменьшают урон вдвое и теряют 20 прочности в защищённой зоне. Один удар наносит урон только одной цели один раз; стены блокируют попадание.
  • Сервер задаёт время, проверяет экипировку и рассчитывает попадание. Смена оружия, смерть, меню и потеря фокуса отменяют удар, не сбрасывая задержку. В Studio проверить оба удара по манекену и игроку с бронёй, границы дистанции, вход/выход из активного окна, стены и отмену сменой слота.

Гранаты

  • При спавне по 3 гранаты каждого типа. 4 выбирает слот гранат, повторные нажатия 4 переключают тип; пятый слот не добавляется.
  • ПКМ переключает бросок от плеча (по умолчанию, верхний полукруг) и от бедра (нижний). Радиус индикатора 24 px — втрое больше перекрестья; переключение поворачивает его по часовой стрелке за 0,22 с.
  • Зажать ЛКМ — замах со снятой чекой, отпустить — бросить. Переключение оружия/типа, меню или потеря фокуса отменяют замах без расхода. Удерживание не запускает таймер взрывателя.
  • От плеча: максимум 15 м при +45° на ровной поверхности. Выше — высокая и короткая траектория, ниже — более пологая и короткая; при −90° — вниз. От бедра: низкий бросок, максимум 5 м (настраивается в shared/Grenades). 0° — горизонтальный взгляд камеры; 1 stud = 0,28 м. Высота выпуска учитывается в скорости; препятствия, склоны и перепады высоты меняют место приземления.
  • 38 отскакивает и взрывается через 5 с после броска. 69 взрывается при первом контакте, в том числе в руке после снятия чеки, если граната касается стены или другого персонажа.
  • Сервер рассчитывает полёт и взрыв: 150 HP в эпицентре, линейное падение до 0 HP на 10 м, во всех направлениях, включая бросившего. Броня не уменьшает этот урон. Луч к центру корпуса определяет укрытие: карта и первый персонаж блокируют урон следующему. Видимость всех целей фиксируется до нанесения урона, поэтому даже погибший от этого взрыва персонаж прикрывает стоящего за ним.
  • Проверить в Studio: оба режима при −90/0/45/75°, отмену замаха сменой типа, 5-секундный таймер, контактную гранату у стены и персонажа, укрытия и двух персонажей на одной линии взрыва. Автотесты не заменяют физику и сетевой тест.

Стрельба и разброс

  • Мгновенный луч (hitscan). Случайное отклонение применяется к общей линии оружия ещё до выстрела, а не к отдельному скрытому лучу. Луч идёт из ствола строго по его оси; перекрестье показывает фактическую точку попадания, в том числе у стены и угла. Модель, вспышка и выстрел используют одну позу кадра. В ADS боковые штрихи скрываются, остаётся слабая точка на линии прицела.

  • Каждый выстрел, включая первый после паузы, получает случайное отклонение в ограниченном угловом диске. Его радиус берётся из того же алгоритма, что и текущая отдача: быстрый огонь усиливает отклонение, дальних случайных выбросов нет. Рандом не накапливается бесконтрольно поверх отдачи.

  • Единая сила: Ballistics.SpreadStrength × Weapons[slot].SpreadMultiplier × (1 - ADS × 0.5) × (0.8 в приседе, иначе 1). Эталон 1.0 сохраняет прежнюю хардкорную амплитуду для АК-47. Множители:

    Оружие От бедра Через прицел
    M4A1 0.8 0.4
    AK-47 1 0.5
    M249 2 1
    Glock 17 0.5 0.25

    Общий множитель применяется к отдаче, покачиванию и случайному отклонению. В приседе все значения таблицы дополнительно умножаются на 0,8: например, M249 — 1,6 от бедра и 0,8 через прицел. При переходе в ADS сила плавно уменьшается до половины текущей, в том числе для уже накопленной отдачи.

  • Отдача плавно поднимает центр и смещает его влево/вправо по повторяемому рисунку. Чем меньше пауза между выстрелами, тем сильнее следующий толчок. При зажиме отдача накапливается без затухания между выстрелами: после подъёма на 6° относительно камеры камера следует вверх за стволом, вплоть до зенита. Мышью можно увести прицел обратно на цель. Через 0,5 с отдача точно равна нулю; следующий выстрел всё равно получает новое случайное отклонение.

  • Движение добавляет общую для ствола и перекрестья волну по двум осям, преимущественно снизу. Бег усиливает её, шаг уменьшает; ADS снижает покачивание и отдачу. Эта волна остаётся при движении даже после паузы. Эталонные амплитуды покачивания и отдачи сохраняют прежнее увеличение втрое; поверх них применяется множитель текущего оружия.

  • Сервер проверяет экипировку, жизнь игрока, положение камеры, темп огня, патроны и перезарядку; сам рассчитывает попадание и урон по зоне тела (см. ниже). Ближняя стена перед стволом блокирует выстрел: нельзя стрелять сквозь укрытие только потому, что камера видит цель. Оружие отводится перед стеной, перекрестье следует лучу ствола. Сервер дополнительно проверяет путь от головы до дула.

  • Металл даёт искры, камень/плитка — пыль, дерево — щепки, стекло — трещины и осколки, вода — брызги. Следы ограничены по числу и времени жизни. Это косметическая реакция: карта не разрушается, прострела и рикошетов нет.

  • Выстрелы озвучены: свой звук проигрывается сразу, чужие — из точки выстрела с затуханием по расстоянию. Быстрые выстрелы не обрывают звук предыдущего. Аудио использует Roblox CDN; доступность ассетов нужно проверить в Studio.

  • У ствола — короткая направленная огненная вспышка с тёплым светом. У M4A1 и Glock из правого окна затвора вылетают вращающиеся латунные гильзы с отскоком. Эффекты видны у своего оружия, других игроков и ботов; серверную физику не нагружают. Гильзы не имеют коллизий с персонажами, ограничены 40 на клиент и исчезают за 2,5 с.

Здоровье, броня и лут

  • Старт: 100 HP, без игровой брони. Эталон урона в src/shared/Survival.luau:

    Зона AK-47 (×1) M4A1 (×0,9) M249 (×1,2) Glock 17 (×0,6)
    Нога 20 18 24 12
    Рука 30 27 36 18
    Корпус 70 63 84 42
    Голова 150 135 180 90
  • Множитель оружия — DamageMultiplier в src/shared/Weapons.luau; если не указан, равен 1. Итог после множителя и защиты округляется до целого.

  • Бронежилет: 100 прочности, урон в корпус вдвое меньше. Вариант с каской также вдвое уменьшает урон в голову. Каждое попадание в защищённую зону отнимает 20 прочности; руки и ноги не защищены и броню не изнашивают. Последнее попадание до разрушения ещё защищено. Каска действует, пока есть броня. Здоровье, броня и наличие каски видны внизу слева, патроны и запас — справа.

  • В синей и красной комнате лежат M4A1, AK-47, M249, Glock и оба вида брони. Автоподбор работает рядом с предметом, но не через стены. Изношенная броня пополняется до 100 за счёт прочности подбираемого комплекта, имеющаяся каска не теряется. Комплект с каской автоматически заменяет жилет без каски даже при полной прочности; старый жилет выпадает с оставшимся запасом брони. Новое оружие подбирается только в свободный соответствующий слот. Если такая же модель уже есть в руках или рюкзаке и запас меньше трёх магазинов, предмет расходуется на пополнение запаса до этого предела; текущий магазин не меняется. У выброшенного оружия можно забрать только оставшиеся в нём патроны. При полном запасе предмет остаётся на месте; другая модель БК не пополняет. Предметы в комнатах возвращаются через 60 секунд после своего подбора или при старте следующего раунда; выброшенные вещи сами не восстанавливаются.

  • G — бросить выбранный автомат или пистолет. Бросок по параболе примерно на метр; стена гасит горизонтальное движение, оружие падает вниз и может сразу подобраться снова, если игрок рядом. До приземления подбор отключён. Патроны в выброшенном оружии сохраняются. Нож и граната не выбрасываются.

  • Числа рассчитанного сервером урона поднимаются над головой и плавно исчезают. Старый бессмертный тренировочный манекен сохранён в TrainingDummy.luau, но в раундовой игре не создаётся.

Респавн — только при подготовке нового раунда, по трём точкам в задней части каждой комнаты, с расстоянием не менее 7 studs, вне узких коридоров со шкафчиками. Все точки находятся за центральной глухой стеной, вне прострелов через дверные проёмы. Сервер создаёт R6 сразу внутри помещения, без автоматического подъёма Roblox над крышей. Старые 32 точки отключены; персонажи не сталкиваются друг с другом. Группа коллизий назначается и деталям, добавленным после спавна. Боты стараются держать дистанцию от союзников (6 studs от человека, 4 от бота), без толчков и телепортов. Во время фриза/меню команды запрещены ходьба, прыжок и поворот тела, но риг не закрепляется через Anchored: гравитация и контакт с полом работают весь таймер. Физика постоянно остаётся у игрока; при снятии фриза сразу восстанавливается скорость. Боты реагируют на новую цель за 0,9–1,6 с, стреляют очередями по три выстрела с паузами 0,8–1,4 с; разброс увеличивается с расстоянием. Они выбирают укрытия и разные стороны обхода, держат дистанцию и отходят при низком HP, получении урона, перезарядке или численном перевесе видимых врагов. Из укрытия периодически выходят на огневую позицию. Перезарядка продолжается и без видимой цели. Потеряв противника, ищут его последнюю замеченную позицию (память 7 с, сообщения союзных ботов — 6 с), затем патрулируют точки карты: живые позиции противников за стенами не используются для преследования. Локальные манёвры проверяют свободный объём и пол, дальние — navmesh; при ошибке пути бот останавливается и повторяет поиск, а не бежит в стену. В Studio проверить укрытия у бассейна, обход с разных сторон, отход и перезарядку за стеной, потерю контакта и застревание в дверях. Атрибут BotTactic на модели показывает текущее решение: Engage / Retreat / Search / Patrol. Точки команд и таймеры — в src/shared/SessionRules.luau, настройки движения — в src/shared/Config.luau, модели слотов — в src/shared/Weapons.luau.

Изменения без повторной сборки

  1. Установи официальный плагин Rojo в Roblox Studio. Альтернатива: ./.tools/rojo plugin install, затем перезапуск Studio.

  2. В терминале из папки проекта запусти:

    ./.tools/rojo serve default.project.json
  3. В Studio открой собранный файл, затем плагин Rojo на вкладке Plugins.

  4. Подключись к localhost:34872 и подтверди синхронизацию.

  5. Правь файлы в src/: Rojo перенесёт изменения в Studio. Перед следующим тестом останови текущий Play, дождись синхронизации и снова нажми Play.

Остановка Rojo в терминале: Ctrl+C. Для запуска собранного файла плагин не нужен.

Структура

default.project.json          Связь файлов с объектами Roblox, подключение карты
assets/generated/             Карта Roblox, OBJ/MTL и отчёт импорта
assets/source/                Локальная копия BSP (не попадает в Git)
tools/import_bsp.py            Воспроизводимый конвертер GoldSrc BSP
src/server/                    Сервер: респавн, экипировка, шаг и приседание
src/client/                    Клиент: ввод, HUD, руки первого лица, анимации
src/shared/Config.luau         Общие настройки
src/shared/Water.luau          Настройки волн, погружения, всплытия и контуры воды
src/shared/Weapons.luau        Параметры четырёх слотов, огня и прицелов
src/shared/GunModel.luau       Локальные модели M4A1, AK-47, M249 и Glock 17
src/shared/Ballistics.luau     Отдача, восстановление, волна движения и темп огня
src/shared/Survival.luau       Эталон урона, зоны тела, броня и настройки лута
src/server/Loot.luau           Автоподбор, независимый респавн предметов и дроп
src/server/TrainingDummy.luau  Бессмертный манекен в синей комнате
src/client/DamageNumbers.luau  Всплывающие числа серверного урона
src/server/Combat.luau         Проверки выстрелов, hitscan, урон и перезарядка
src/client/Combat.luau         Ввод огня/ADS, перекрестье и единое направление
src/client/ShotEffects.luau    Трассеры, вспышки и реакции материалов
rokit.toml                    Зафиксированная версия Rojo
build/                        Сборки для Studio (не попадают в Git)
.tools/                       Локальный Rojo (не попадает в Git)

Сервер выполняет доверенную игровую логику для всех игроков. Клиент работает отдельно у каждого игрока: интерфейс, камера, управление. Shared виден обеим сторонам: там не должно быть секретов и доверенных проверок.

Исходники кода — файлы в src/, а не копии скриптов в Studio: синхронизация Rojo идёт из файлов в Studio. Изменения скриптов в Studio не возвращаются в файлы. Не перезаписывай сборкой единственную копию карты, отредактированной вручную: сначала сохрани её отдельно. Карта подключена из assets/generated/fy_pool_day.rbxmx.

На другом компьютере

Установи Rokit, выполни rokit install в папке проекта. Затем используй rojo вместо ./.tools/rojo в командах выше.

Что делать дальше

  1. В Studio Play проверь тап и зажим ЛКМ, ПКМ, R, паузу 0,5 с, шаг и бег; сверь попадания с точкой на стене стоя, в движении и в ADS.
  2. Проверь прицел на разных разрешениях, компенсацию мышью и стрельбу вплотную к стене, а также реакции плитки, шкафчиков, дерева и воды.
  3. В режиме Server & Clients с двумя игроками проверь урон, попадания в голову, смерть/респавн, прерывание перезарядки сменой оружия и сетевую задержку.

Автопроверки: python3 -m unittest discover -s tools/tests -v. Включают проверку свободного объёма R6, пола и потолка в выбранном месте респавна. При наличии .tools/luau/luau или luau в PATH тесты также исполняют реальный модуль баллистики: точное восстановление, обе оси, покачивание и темп при 30–240 FPS, а также серверные обработчики с заглушками Roblox-сервисов (патроны, урон, ограничения темпа, некорректный ввод и отмена перезарядки). Они не заменяют игровой тест в Studio.

Публикация на сервер Roblox

Для локального тестирования публикация не нужна. Для игры через Roblox-клиент и автоматической доставки изменений см. настройку публикации и CI. После push в main GitHub Actions проверяет проект, собирает place и публикует его через Open Cloud. Pull request запускает только тесты и сборку.

About

Legendary experience in roblox platform

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages