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

Отличия от BeamMP

Эта страница для тех, кто знает BeamMP. У NodeMP с ним общие корни: игровой сервер и хелпер соединения начинались как форки кода BeamMP под лицензией AGPL-3.0-or-later, а синхронизация машин в клиентском моде портирована из BeamMP. Две сети не взаимодействуют: лаунчер NodeMP подключается только к серверам NodeMP, а сервер NodeMP принимает только лаунчер NodeMP. Дальше — простое сравнение двух текущих релизов: где они делают одно и то же, так и написано; где у BeamMP есть то, чего в NodeMP нет, — тоже. Сторона BeamMP взята с docs.beammp.com.

  • Модель. Сервер отдаёт свои моды подключающимся игрокам, лаунчер запускает игру и держит соединение, серверный Lua реагирует на события. Клиент, который симулирует машину, — её авторитет, остальные получают её состояние: синхронизация машин в NodeMP — портированная из BeamMP.
  • Публикация в списке. Ключ с сайта проекта записывается в конфиг сервера: AuthKey из Keymaster BeamMP — в ServerConfig.toml, Host ID и секрет со страницы nodemp.com/hosts — в [Directory] файла server.toml. Идея одна, сайты разные; ключи не взаимозаменяемы.
  • Аккаунты и гости. Аккаунт проекта, вход через лаунчер, либо гостевое имя, если сервер это разрешает (AllowGuests в BeamMP, [Directory] TestDrive в NodeMP). Аккаунт BeamMP на NodeMP не работает, и наоборот.
  • Конфигурация. Один TOML-файл плюс переменные окружения, которые его перекрывают (BEAMMP_* начиная с BeamMP 3.2.0, NODE_* в NodeMP). Файлы и ключи разные; см. Конфигурацию.
  • Контент. Zip-архивы модов в папке на сервере (Resources/Client в BeamMP, content/ в NodeMP), которые лаунчер скачивает до того, как игра входит в мир.
NodeMP BeamMP
Транспорт TLS 1.3 на TCP-сессии; UDP для потока позиций с аутентифицирующим трейлером; каждый пакет — типизированный бинарный кадр (Category, SubType). Сетевой протокол v18 проверяется при подключении, лаунчер с другой версией отклоняется. Обычные TCP и UDP; пакеты помечены первым символом; игровой трафик не шифруется.
Среда плагинов Один рабочий поток выполняет все обработчики всех ресурсов: блокировки не нужны, а обработчик, который блокирует поток, останавливает всех. Ожидание — корутины (node.async, node.sleep) и колбэки; тяжёлая работа уходит в фоновый пул (node.job). Блокирующего sleep и синхронного HTTP в API нет. API MP.*; MP.Sleep и Http.Get блокируют вызывающий Lua-стейт. Периодическая работа — таймер событий (MP.CreateEventTimer).
Форма API плагинов node.on(name, fn) передаёт объекты Player и Vehicle; запрос отклоняется через return false, reason; одна точка входа на ресурс, остальное через require. MP.RegisterEvent(name, "handler") передаёт id; запрос отклоняется через return 1; загружается каждый .lua верхнего уровня папки плагина.
Перезагрузка Явная: node.resources.reload(name), с хуком resourceUnload перед сбросом состояния. За файлами никто не следит. Автоматическая: изменение .lua верхнего уровня перезагружает плагин, а onFileChanged сообщает о любом другом изменении внутри Resources/Server.
Клиентский Lua из плагина Передаётся из resources/<name>/client/ при каждом подключении, выполняется в игре в собственном пространстве имён ресурса, на диск не записывается; обфусцируется Prometheus, если ресурс или хост это не отключили. Заменить файлы игры или клиентского мода он не может (Клиентские скрипты). Лежит внутри zip-архива мода в Resources/Client, который игра монтирует как любой другой мод.
Другие языки C ABI для нативных модулей (.dll/.so); модуль может зарегистрировать языковой хост для другого типа ресурсов — type = "js" с примером js-host, который встраивает Node и требует сборки Node (Нативные модули). Только Lua.
База данных node.pg: асинхронный пул PostgreSQL (Доступ к базе данных). Встроенной нет.
Проверка установки игры [General] VerifyGame: хелпер проверяет установку игрока на уровне size, scripts, full или strict (по эталонному манифесту) перед каждым подключением (Строгая проверка). Аналога в ServerConfig.toml нет.
Чат Не часть сервера: им владеет пример-ресурс chat, без него node.chat.say молчит. Встроен: onChatMessage, MP.SendChatMessage.
Консоль Сервер не читает ввод с консоли; администрирование — команды чата, шина или клиентская половина. Консольные команды и onConsoleInput для своих.
Файлы и JSON из Lua node.fs.read, write, writeAsync, list внутри папки ресурса; node.json.encode/decode и больше ничего. Стандартные библиотеки io и os открыты (Ресурсы → Файлы). FS.* в любом месте диска (Exists, CreateDirectory, Remove, Rename, Copy, ConcatPaths, …); Util.Json* с prettify, minify, flatten и diff/patch (RFC 6902).
Диагностика из Lua node.server.metrics() (игроки, машины, сетевые счётчики, очередь плагинов) и собственный сторожевой таймер сервера. Ни имени ОС, ни цифр памяти, ни времени выполнения по обработчикам. MP.GetOSName, MP.GetStateMemoryUsage, MP.GetLuaMemoryUsage, Util.DebugExecutionTime.
Защищённые моды Каждый zip из content/ отправляется каждому игроку. protectmod: указанный мод игрок должен получить сам.

Нет. Node-Server — другая программа с другим файлом конфигурации, другим ключом публикации и другим API плагинов, и она не загружает плагины MP.*. Что можно перенести:

  • Карты и машины. Положите zip-архивы в content/; сервер раздаст их подключающимся игрокам.
  • Логику плагинов. Перенесите её на API node. Страница Перенос плагинов BeamMP сопоставляет вызовы и события MP.* с их аналогами в NodeMP и перечисляет то, у чего аналога нет.
  • Игроков. Они устанавливают лаунчер NodeMP (Установить лаунчер) и находят ваш сервер в списке, как только у него появится ключ сервера (Регистрация сервера).