Перейти к содержимому

Сборка лаунчера

Лаунчер принадлежит одному проекту: адрес сервера, ключи подписи, соль машинного отпечатка и оформление записываются в файл при сборке. Игрок ничего не настраивает и адрес не вводит, а чужой проект через этот файл не откроется.

Одной командой

Сервер делает лаунчер сам — ни Rust, ни Node, ни компилятора на нём не нужно. Он берёт готовый лаунчер из релиза Laminara и впечатывает в него вашу конфигурацию: адрес, ключи, соль, оформление и иконку.

  1. Укажите адрес, по которому придут игроки

    {
    "launcher": {
    "dir": "/var/lib/laminara/launcher",
    "endpoints": ["https://launcher.ваш-домен"]
    }
    }
  2. Соберите и выпустите

    launcher build

    Команда скачивает заготовки под Windows, Linux и macOS (проверяя их контрольные суммы), впечатывает конфигурацию, ставит вашу иконку из branding.logoPath и сразу публикует версию. Имя файла — из оформления: при branding.windowTitle = «Magic World» получится Magic World.exe. Версию можно назвать явно: launcher build 1.3.0.

    Иконка ставится в двух местах, и оба важны: в ресурсах .exe — её показывает проводник, — и самим лаунчером при запуске окна, откуда её берут панель задач и переключение окон. Второе работает на всех системах, поэтому на Linux и macOS окно тоже с вашим логотипом.

  3. Выложите игрокам

    Сервер раздаёт опубликованный лаунчер сам, по постоянному адресу:

    https://ваш-домен/launcher

    Эта ссылка определяет систему по браузеру и отдаёт нужный файл — её и давайте игрокам. Если нужна ссылка на конкретную систему, она такая же предсказуемая:

    https://ваш-домен/launcher/windows-x64
    https://ваш-домен/launcher/linux
    https://ваш-домен/launcher/mac-os-arm64
    https://ваш-домен/launcher/mac-os

    Адрес не меняется никогда: после каждой пересборки по нему автоматически лежит свежий файл. Скачивание не требует входа — игроку нужно попасть в лаунчер до того, как он сможет войти. Файл приходит под своим именем из оформления (Magic World.exe), самодостаточный: скачал и запустил, установка не нужна. Дальше лаунчер обновляет себя сам.

    Сами файлы по-прежнему лежат в launcher/<версия>/, если их нужно выложить куда-то ещё.

После обновления сервера лаунчер перепекается и выпускается заново — так до игроков доедет свежая версия. Отключается это настройкой launcher.autoBake.

Лаунчер для macOS

Под macOS лаунчер — это .app, а не один файл, поэтому он приезжает архивом Ваш Лаунчер-mac-os-arm64.app.tar.gz. Внутри обычное приложение: имя, иконка из вашего оформления и настройки проекта лежат рядом с программой, а не внутри неё.

Так сделано ради подписи. Начиная с Apple Silicon система отказывается запускать изменённую программу, а «впечатать» конфигурацию — это как раз изменить файл. Поэтому сервер кладёт настройки рядом с программой, внутрь .app, и не трогает сам исполняемый файл: подпись, которую поставила Apple при сборке, остаётся целой.

Процессор при скачивании выбирать не нужно: внутри одна программа сразу под Apple Silicon и Intel. Ссылки /launcher/mac-os-arm64 и /launcher/mac-os отдают одно и то же, а /launcher сам определит мак по браузеру.

Первый запуск у игрока

У пакета, собранного сервером, нет печати целостности: сервер кладёт внутрь ваши настройки, а запечатать .app умеет только сам мак — команда codesign есть лишь в macOS. Поэтому скачанное из браузера приложение система при первом запуске не откроет, и «правой кнопкой → Открыть» тут не поможет: для macOS пакет выглядит не как «неизвестный разработчик», а как испорченный. Снимается это одной командой, которую стоит положить рядом со ссылкой на скачивание:

Окно терминала
xattr -dr com.apple.quarantine "/Applications/Ваш Лаунчер.app"

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

Микрофон и голосовой чат

Моды вроде Simple Voice Chat просят микрофон не у игры, а у приложения, из которого она запущена, — то есть у лаунчера. macOS пускает такой запрос, только если в приложении есть сразу две вещи: строка-объяснение NSMicrophoneUsageDescription в Info.plist и разрешение com.apple.security.device.audio-input в подписи. Нет хотя бы одной — система не показывает окно с вопросом, а снимает процесс; мод в этом случае пишет, что лаунчер не поддерживает разрешения на микрофон.

В лаунчере Laminara есть обе: строку кладёт в пакет сервер, разрешение вшито в подпись при сборке релиза. От игрока нужно одно — разрешить микрофон в окне, которое покажет macOS при первом запуске голосового чата. Разрешение выдаётся лаунчеру, игра работает под ним.

Если игрок случайно нажал «Не разрешать», починить можно в «Системных настройках» → «Конфиденциальность и безопасность» → «Микрофон»: там надо включить ваш лаунчер. После обновления лаунчера macOS может спросить про микрофон ещё раз — это нормально, подпись у новой версии своя.

Там же, в пакете, лежит NSLocalNetworkUsageDescription: начиная с macOS 15 без него игра не увидит серверы и миры в локальной сети.

Сборка своими руками

Нужна, если хочется большего, чем даёт запекание: свои свойства файла, инсталлятор, AppImage, пакет под macOS. Тогда нужны Node 24 + pnpm и Rust 1.96+, а для Windows с Linux — cargo install cargo-xwin и пакеты clang lld llvm (кросс-компиляция, виртуальная машина с Windows не нужна).

Окно терминала
laminara-server client-config \
--config /etc/laminara/config.json \
--endpoint https://launcher.ваш-домен > mygame.client.json
cd client
./build-launcher.sh ../mygame.client.json --target windows
./build-launcher.sh ../mygame.client.json --target linux
./build-launcher.sh ../mygame.client.json --target macos

Готовые файлы — в client/dist-launcher/. Положите их в launcher/<версия>/ на сервере и выпустите командой launcher publish <версия> — дальше всё как обычно.

--target macos работает только на маке: нужны Xcode (из него берутся lipo и codesign), обе цели Rust — aarch64-apple-darwin и x86_64-apple-darwin, скрипт добавит их сам, — и Go с make generate, им собирается .app. На выходе и готовое приложение, и архив .app.tar.gz для выкладки; пакет сразу подписывается codesign, поэтому игроку хватит «правой кнопкой → Открыть». Кросс-сборки с Linux тут нет и быть не может: подписывает только мак.

Где лаунчер хранит файлы

Папка называется по вашему проекту: при branding.name = «Мир Приключений» сборки и настройки лягут в Мир Приключений внутри системного каталога данных, а не в общую laminara. Благодаря этому два лаунчера разных проектов на одном компьютере не мешают друг другу.

Имя можно задать отдельно — например, если название проекта длинное или на другом алфавите:

"branding": { "name": "Мир Приключений", "folderName": "magicworld" }

Что должно быть на компьютере игрока

СистемаЧто нужно доставить
Windows 10 и 11Ничего: рантайм Visual C++ вшит в файл, а WebView2 входит в Windows 11 и приезжает в Windows 10 вместе с Edge
macOS 10.15 и новееНичего: одно приложение работает и на Apple Silicon, и на Intel
LinuxWebKitGTK (libwebkit2gtk-4.1) — в свежих дистрибутивах стоит сам

Java игроку ставить не нужно ни на одной из них: нужную версию сервер кладёт в сборку, а лаунчер скачивает её вместе с остальными файлами.

Когда лаунчер надо пересобрать

Пересборка нужна, только если поменялось запечённое:

ПоменялосьНужна пересборка
Адрес сервера, доменДа
Кольцо ключей подписиДа
Соль машинного отпечаткаДа
Брендинг: имя, логотип, ссылка на сайтДа
Сборки, моды, версииНет
Новости, доступ к сборкам, баныНет