Отличия от 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: указанный мод игрок должен получить сам. |
Можно ли запустить мой сервер BeamMP на NodeMP?
Заголовок раздела «Можно ли запустить мой сервер BeamMP на NodeMP?»Нет. Node-Server — другая программа с другим файлом конфигурации, другим ключом публикации и
другим API плагинов, и она не загружает плагины MP.*. Что можно перенести:
- Карты и машины. Положите zip-архивы в
content/; сервер раздаст их подключающимся игрокам. - Логику плагинов. Перенесите её на API
node. Страница Перенос плагинов BeamMP сопоставляет вызовы и событияMP.*с их аналогами в NodeMP и перечисляет то, у чего аналога нет. - Игроков. Они устанавливают лаунчер NodeMP (Установить лаунчер) и находят ваш сервер в списке, как только у него появится ключ сервера (Регистрация сервера).
