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

Как появился проект
Всё началось в августе 2020 года с эксперимента: получится ли синхронизировать игроков одним LuaSocket поверх SA:MP? Получилось, и эксперимент быстро превратился в отдельный проект.
Как он развивался:
- Прототип поверх SA:MP, позиции игроков передавались через LuaSocket.
- Потом зависимость от SA:MP убрали, и мультиплеер заработал на чистой GTA: San Andreas 1.0 US, где нужен только MoonLoader.
- Протокол прошёл путь от сжатого JSON через сериализованные Lua-таблицы к собственному бинарному протоколу SL:NET поверх UDP.
- Появились отдельный сервер на 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: его можно читать, менять и расширять, не трогая нативный код.