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

Разработка плагинов

Обзор

Плагин меняет поведение сервера: добавляет команды в чат, правила, режимы игры, инструменты для админов, связь с сайтом или Discord. Сам сервер только пересылает данные между игроками и следит за порядком; всё, что делает сервер особенным, пишется плагинами.

  • Реагировать на события: игрок зашёл, заспавнил машину, сел в неё, написал в чат.
  • Отказывать в действиях: не пускать на сервер, запрещать машины, правки и покраску, фильтровать чат. Игрок увидит причину.
  • Управлять игроками и машинами: кикать и банить, сажать в машину, телепортировать, замораживать, ставить метки и замки.
  • Хранить данные между перезапусками, ходить в базу данных и по HTTP.
  • Отправлять игрокам свой Lua-код, который выполняется в игре, и обмениваться с ним сообщениями.
Вид Что это Когда выбирать
Ресурс на Lua Папка в resources/ с кодом на Lua 5.4. Lua встроена в сервер. Почти всегда: правила, команды, режимы, всё, что связано с игрой.
Ресурс на JavaScript Такая же папка, но код на JavaScript. Нужен модуль js-host. Когда нужен пакет из npm или удобнее JavaScript.
Нативный модуль Библиотека на C или C++ в modules/. Когда код вызывается на каждый пакет или кадр и Lua не успевает.

Дальше раздел говорит в основном о ресурсах на Lua. JavaScript и нативным модулям посвящены свои страницы.

У ресурса может быть две части.

  • Серверная (server/main.lua) работает на сервере. Ей доступен API node: игроки, машины, события, таймеры, хранилище, HTTP.
  • Клиентская (файлы в client/) уходит каждому игроку при входе и выполняется внутри BeamNG.drive. Там доступно всё, что есть у модов игры, плюс функции NodeMP для связи с сервером.

Части общаются сетевыми событиями: клиент отправляет node.emitServer("имя", данные), сервер ловит его через node.on("имя", ...) и отвечает player:send или node.broadcast. Сообщения клиента сами дальше сервера не идут: если их должны увидеть другие игроки, их пересылает ресурс.

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

У каждого ресурса своё состояние Lua. Ресурсы не видят переменных друг друга и общаются через шину.

  1. Первый ресурс — от пустой папки до работающего ресурса с командой в чате и клиентской частью.
  2. Устройство ресурса — файлы, resource.toml, перезагрузка, ошибки.
  3. Темы по порядку: события, игроки и машины, чат, таймеры, хранилище, база данных, HTTP, шина, клиентские скрипты.
  4. Примеры плагинов — готовые ресурсы из архива сервера.
  5. Переход с других платформ — если вы уже писали плагины для другого мультиплеера.

Под рукой держите справочник API: там каждая функция и каждое событие. Справочник генерируется из описания API и написан по-английски.