SL:MP – Simple Lua Multiplayer для GTA: San Andreas

Открытый мультиплеер для GTA: San Andreas, полностью написанный на Lua: клиент работает на чистой игре с MoonLoader, сервер – на LuaJIT под Windows и Linux.

Автор: Проект: 2020Обновлено: 2 мин чтения

SL:MP (Simple Lua Multiplayer) – открытый мультиплеер для GTA: San Andreas, который мы с SEVEN разрабатывали в 2020–2021 годах. Он целиком написан на Lua: клиент работает как набор скриптов MoonLoader прямо в игре, сервер крутится на LuaJIT под Windows и Linux.

Баннер SL:MP: Simple Lua Multiplayer, разработчики Pakulichev и Seven.exe
Баннер проекта из темы на BLAST.HK, 2020

Как появился проект

Всё началось в августе 2020 года с эксперимента: получится ли синхронизировать игроков одним LuaSocket поверх SA:MP? Получилось, и эксперимент быстро превратился в отдельный проект.

Как он развивался:

  1. Прототип поверх SA:MP, позиции игроков передавались через LuaSocket.
  2. Потом зависимость от SA:MP убрали, и мультиплеер заработал на чистой GTA: San Andreas 1.0 US, где нужен только MoonLoader.
  3. Протокол прошёл путь от сжатого JSON через сериализованные Lua-таблицы к собственному бинарному протоколу SL:NET поверх UDP.
  4. Появились отдельный сервер на LuaJIT для Windows и Linux, лаунчер на Java и интерфейс на ImGui.

Тема проекта на BLAST.HK открылась 23 августа 2020 года с пометкой «Эксклюзив», а первый публичный релиз вышел уже 25 августа.

Возможности

  • синхронизация пешком в настраиваемой зоне стрима (в тестах – около 10 игроков рядом друг с другом);
  • синхронизация в транспорте, для водителя и пассажиров;
  • диалоги трёх типов: информационный, с полем ввода и со списком;
  • пикапы, в том числе внутри интерьеров;
  • виртуальные миры, чтобы разводить игроков по измерениям;
  • примеры патчинга игры через memory и LuaJIT FFI.

Архитектура

Часть Технологии Назначение
Клиент Lua, MoonLoader, LuaJIT FFI Работает в игре, отправляет и применяет синхронизацию
Сервер LuaJIT, LuaSocket Принимает игроков, рассылает данные, исполняет игровой режим
Протокол UDP, SL:NET Бинарные пакеты с собственным битстримом
Лаунчер Java, ImGui Список серверов и подключение

Позже сетевую часть я вынес в отдельную библиотеку SNET.

Настройка сервера

Сервер настраивается файлом server.cfg:

serverName = My SL:MP Server
version    = 1.0.0
gamemode   = freeroam
maxSlots   = 10
stream     = 200
address    = 0.0.0.0
port       = 7777

Порт по умолчанию 7777, как у SA:MP. Значения serverName, gamemode и stream в примере условные.

Релизы

Версия Дата
0.0.1-Alpha 25.08.2020
Alpha rev.2 – rev.4 26–28.08.2020
RC5, RC6 29.08.2020
RC7 30.08.2020
RC8 01.09.2020
RC9 06.09.2020
0.0.1-RC-X 12.09.2020
1.0.0-alpha.1 18.01.2021

Только за первый месяц вышло десять сборок. Клиент версии 0.0.1-RC-X скачали более 200 раз, сервер (Windows и Linux) – около 170; у 1.0.0-alpha.1 больше 200 скачиваний клиента. В репозитории проекта больше 120 коммитов.

Команда

Я был основным разработчиком (около 100 коммитов из 124) и выкладывал релизы. Соавтор проекта – SEVEN. Спасибо imring, FYP (автору MoonLoader) и Akionka, который написал кодировщик битстрима для SL:NET.

Время SL:MP и SL Team я до сих пор считаю одним из лучших за всё, что делал в моддинге GTA: San Andreas.

Частые вопросы

Нужен ли SA:MP для SL:MP?

Нет. Первые эксперименты шли поверх SA:MP, но уже в 2020 году зависимость убрали: SL:MP работает на чистой GTA: San Andreas 1.0 US с MoonLoader.

Кто разработал SL:MP?

SL:MP разрабатывали Pakulichev и SEVEN (команда SL Team). Благодарности в проекте указаны imring, FYP и Akionka – автору кодировщика битстрима для протокола SL:NET.

Сколько игроков поддерживает SL:MP?

Количество слотов задаётся в server.cfg параметром maxSlots. На этапе альфа-тестов авторы рекомендовали не более 10 игроков; в тестах синхронизировалось около 10 игроков рядом друг с другом.

Чем SL:MP отличается от SA:MP и MTA?

SA:MP и MTA – зрелые мультиплееры на C/C++ с собственными клиентами. SL:MP – экспериментальный проект, в котором и клиент, и сервер написаны на Lua: его можно читать, менять и расширять, не трогая нативный код.