Моды грузятся через -javaagent, game.jar не патчится, переживают ре-обфускацию. Что внутри: - агент rsx-bridge.jar: профиль сборки игры, патчи A2/A6, загрузка модов через родной загрузчик игры (ilxq -> special.Main) - патч лаунчера: окно выбора «С модами / Ванилла» по кнопке «Играть» и защита от автоапдейта лаунчера - install/uninstall: всё ставится в %LOCALAPPDATA%\rsx-mod, пути не хардкодятся - build: три готовых артефакта в dist, нужен только JDK - testserver: локальный сервер, принимает любой ник и токен Проверено на живом клиенте: мод грузится и выполняется в игровом потоке, в логе видно игрока и мир.
rsx-modloader
Модлоадер для RustexRemake: Java-моды в папке mods, подключаются через
-javaagent, game.jar не патчится. Один раз поставил — моды переживают
обновление игры.
В лаунчере появляется выбор режима прямо на кнопке «Играть»: с модами или ванилла.
mod-template\ пример мода, собирается один раз
bridge\ агент (-javaagent) и его исходники
launcher-patch\ патч лаунчера: окно выбора и защита от автоапдейта
testserver\ локальный сервер, принимает любой ник и токен
scripts\ сборка, установка, запуск, удаление
third_party\asm\ ASM (BSD-3), зашит внутрь rsx-launcher-patch.jar
Установка
build.cmd собрать dist\ (нужен только JDK)
install.cmd поставить модлоадер
start-launcher.cmd запускать лаунчер
uninstall.cmd вернуть всё как было
install.cmd копирует рантайм в %LOCALAPPDATA%\rsx-mod, патчит app.jar
лаунчера и прописывает -javaagent в его конфиг. Пути можно переопределить:
install.cmd --home D:\rsx-mod --game D:\RustexRemake
Лаунчер должен быть закрыт. Если он запущен с правами администратора,
app.jar не перезаписать — установщик об этом скажет.
Запускай лаунчер через start-launcher.cmd, а не ярлыком: updater.exe
сверяет хеш app.jar с манифестом и при патченом jar заново скачивает
официальный, стирая патч.
Как это работает
- Агент (
rsx-bridge.jar) подключается через-javaagentи вpremainчитает профиль сборки игры (profiles/latest.rsxp): хеш jar, обфусцированные имена нужных классов и полей. Ничего не хардкодится под конкретную сборку. - Патчи клиента — A2 ставит
joml.fastmathдо загрузки JOML, A6 подменяет таймер телеметрии на «глухой». Оба сделаны на живом клиенте: первые версии A6 роняли игру сNullPointerExceptionиTimer already cancelled. - Моды грузятся родным загрузчиком игры (
ilxq→special.Main) — так же, как моды с сервера, и выполняются в игровом потоке. - Переносимость модов. Мод собирается один раз против стабильного API. Мост сам переводит логические имена в имена текущей сборки, поэтому ре-обфускация вендора не ломает уже собранные моды.
Патч лаунчера
Лаунчер — сторонний продукт, и у него две особенности, которые мешают:
- Гонка за состоянием кнопки.
xa.run()вызываетha.y()(ставитPLAY), аfa.loadedWeb()позже ставитERROR. Состояния — это индексы кнопок вweb/launcher/main.html, их шесть, поэтомуERROR=6скрывает все кнопки. При медленной загрузке страницыloadedWebзатираетPLAY— кнопки просто нет. Патч восстанавливает состояние послеloadedWeb. - Автоапдейтер. Патченый
app.jarотличается от манифеста, и лаунчер считает себя устаревшим в двух местах:sb.q()(размер и хеш файла) иha(хеш рабочего jar, отсюда «обновление найдено, перезапустите лаунчер»). Оба закрыты черезrsx.Patch, который действует только на файл с именемapp.jarи только при наличии маркера.rsx-patched.
Возврат к обычному поведению: удалить .rsx-patched или запустить лаунчер с
-Drsx.allowLauncherUpdate=true.
Конфиг лаунчера — осторожно
launcher_config.properties — это properties-файл: слэш экранирует следующий
символ, а \r читается как перевод строки. Значение gamePath1=G:\rustexremake
без экранирования превращается в G: + перевод строки + ustexremake, и
лаунчер перестаёт находить игру. Все правки идут через
java.util.Properties — в патчере есть команды getprop и setprop.
Тест-сервер
testserver\start.cmd
Локальный сервер: принимает любой ник и токен, отвечает на /server-ping,
слушает порты 25566–25573 и закидывает в пустой мир. Проверка без игры:
python testserver\selftest.py
Адрес сервера зашит в коде клиента, поэтому для полного захода в мир нужен редирект (PowerShell от администратора):
scripts\install-hosts.ps1 прописать 127.0.0.1 для адреса клиента
scripts\uninstall-hosts.ps1 откатить
Сборка
build.cmd
Нужен только JDK. ASM лежит в third_party\asm и зашивается внутрь
rsx-launcher-patch.jar, поэтому устанавливать модлоадер можно без Gradle и
без сети.
Готовые файлы кладутся в dist\:
| файл | что это |
|---|---|
rsx-bridge.jar |
агент, Java 8 |
rsx-api.jar |
API, против которого собирается мод |
rsx-launcher-patch.jar |
патчер лаунчера, всё внутри |
mod-template\ |
заготовка мода |
Тесты
python bridge\src\test\python\run_test.py
Поднимает фейковый клиент, проверяет профиль, A2, A6, загрузку мода и то, что мод выполняется в игровом потоке, а телеметрия не срабатывает.
RustexRemake и KJST Launcher — сторонние продукты, они не входят в этот проект.
Инструмент работает только на машине пользователя. ASM распространяется по
лицензии BSD-3, см. LICENSE.