• v0.2.0 cc1eaece40

    v0.2.0 Stable

    sasheg released this 2026-10-16 23:25:47 +00:00 | 6 commits to main since this release

    rsx-modloader 0.2.0

    Главное в этом релизе: модлоадер теперь умеет несколько модов одновременно,
    и моды получают нормальный API вместо Object и парсинга toString().

    Несколько модов

    Родной загрузчик игры (ilxq) на каждый jar создаёт новый загрузчик классов,
    но тик-хук запоминает в статическом поле, которое перезаписывается при каждой
    загрузке:

    do = new ilxq();   // свой загрузчик на мод
    int = method2;     // статическое поле: помнит только ПОСЛЕДНИЙ мод
    

    getRunnableList() вызывался ровно у одного мода. Остальные грузились, их
    onLoad отрабатывал, задачи попадали в очередь — и их никто никогда не
    разбирал. Молча. С одним модом это не заметно.

    Теперь в мосте одна очередь на всех и один drain: какой бы special.Main игра
    ни позвала, он выполняет работу всех модов. Владелец задачи запоминается в
    момент onLoad, поэтому в логе видно, чей код упал.

    Кладёте jar'ы в %LOCALAPPDATA%\rsx-mod\mods — и они работают вместе.

    API

    Типизированные обёртки. Раньше Rsx.player() отдавал Object, и мод
    вытаскивал имя из toString() обфусцированного класса:

    Rsx.Player p = Rsx.player();
    p.getName(); p.getX(); p.getY(); p.getZ();
    p.getHealth(); p.getMaxHealth(); p.isAlive(); p.isDead();
    
    Rsx.World w = Rsx.world();
    w.getTime(); w.isClient();
    

    События вместо polling:

    Rsx.on("tick", ...)            Rsx.on("worldChange", ...)
    Rsx.on("playerJoin", ...)      Rsx.on("playerLeave", ...)
    Rsx.on("screenOpen", ...)      Rsx.on("screenClose", ...)
    

    Периодичность по тикам:

    Rsx.everyTicks(20, this::onSecond);   // не плывет и не двоит после лага
    Rsx.every(5000L, this::poll);         // миллисекунды: для неигровых задач
    

    Живучесть. Упадёт задача — мост зовёт RsxMod.onError. Упадёт пять раз
    подряд — задача отбрасывается, чтобы сломанный мод не залил лог. Мод может
    заявить RsxMod.apiVersion(), и бриф предупредит, если версии разойдутся,
    вместо того чтобы мод молча сломался.

    Профиль

    Перегенерирован: в него попали члены Entity (posX/posY/posZ/isDead,
    getName/getEntityId/isEntityAlive), EntityLivingBase (здоровье) и World
    (isRemote/getWorldTime). Сгенерированы по SRG-именам, поэтому переживут
    очередную реобфускацию.

    Известные ограничения

    • каждый мод получает свой загрузчик классов, поэтому моды не видят друг друга:
      общую библиотеку придётся дублировать в каждый jar;
    • профиль сборки специфичен: после обновления игры моды перестанут грузиться,
      пока профиль не перегенерирован;
    • апдейтер достаёт app.jar из своего кэша (скачивает 0 файлов), но хук
      сразу патчит его заново — на запуск это не влияет.

    Автор

    SashegDev — gdsasheg@gmail.com

    Downloads
  • v0.1.0 2eaab88809

    v0.1.0 Stable

    sasheg released this 2026-10-16 23:06:07 +00:00 | 7 commits to main since this release

    rsx-modloader 0.1.0

    Модлоадер для RustexRemake. Не трогает игру: подключается агентом, а в лаунчер
    встраивается выбор режима прямо по кнопке «Играть».

    Что внутри

    install.cmd        поставить модлоадер
    uninstall.cmd      вернуть всё как было
    start-launcher.cmd запустить лаунчер напрямую
    dist\              собранные артефакты
    profiles\          профиль сборки игры
    

    Как это работает

    Игровой game.jar не патчится вообще. Модлоадер подключается к лаунчеру
    через -javaagent в launcher_config.properties, а в сам лаунчер вживляется
    один вызов: при нажатии «Играть» появляется выбор С модами или
    Ванилла.

    • С модами — запускается агент, моды грузится штатным загрузчиком игры
      (ilxq.super → special.Main) и выполняется в игровом тике.
    • Ванилла — игра запускается вообще без агента.

    Про обновления

    Вендорный апдейтер перекачивает app.jar, из-за чего патч каждый раз
    стирался. Поэтому патчится и сам апдейтер:

    • в его payload вставляется хук, который убирает app.jar из списка на
      скачивание — только если хеш в манифесте совпадает с хешем нетронутого
      файла из .rsx-patched. Другой хеш — настоящее обновление, и файл
      качается как обычно;
    • перед запуском лаунчера app.jar патчится заново, если апдейтер всё же
      достал его из своего локального кэша.

    Три защиты в самом лаунчере (rsx.Patch): пропуск проверки app.jar,
    пропуск самопроверки рабочего jar и запрет лаунчеру «чинить» свой
    updater.exe (иначе хук апдейтера жил бы ровно один запуск).

    Требования

    • RustexRemake build 31 (профиль profiles\latest.rsxp привязан к сборке —
      при обновлении игры его нужно перегенерировать);
    • Windows, Java 8 в комплекте с игрой;
    • установщик может потребовать запуск от администратора.

    Откат

    install.cmd --uninstall
    

    Вернёт оригинальные app.jar и updater.exe, уберёт -javaagent из конфига
    и удалит маркер .rsx-patched.

    Известные ограничения

    • профиль сборки специфичен: после обновления игры моды перестают грузиться,
      пока профиль не перегенерирован;
    • апдейтер всё ещё достаёт app.jar из своего кэша (скачивает 0 файлов), но
      хук сразу патчит его заново — на запуск это не влияет;
    • полный runtime-remap ещё не сделан: 3844 класса без имён, безопасного
      автоматического переименования методов пока нет.

    Автор

    SashegDev — gdsasheg@gmail.com

    Downloads