rsxm-example
Эталонный мод RustexModding. Собери его, положи в %LOCALAPPDATA%\rsx-mod\mods
и посмотри лог — он рассчитан на то, чтобы его читал человек, который пишет
первый мод.
build.cmd
Нужен только JDK. Скрипт собирает build\mods\rsxm-example.jar и кладёт его в
папку модов; если путь другой, переопредели:
set MODS_DIR=D:\path\to\mods && build.cmd
Что показывает мод
apiVersion()— версия API, под которую написан мод;Configиз rsxm-lib — настройки вconfig\example.json, значения по умолчанию задаёт сам мод;- события
playerJoin,playerLeave,worldChange; everyTicks— периодичность по игровым тикам;- типизированные обёртки
Rsx.PlayerиRsx.World; onError— что мод делает, когда задача упала;onUnload— что мод делает на выходе.
Чего здесь нет - и почему
Ни одного обфусцированного имени: ни класса, ни поля, ни метода. Мод спрашивает логическими именами, бриф переводит их в имена текущей сборки. Поэтому мод собирается один раз и переживает очередную реобфускацию игры.
Нет рефлексии, нет чтения файлов игры, нет работы с class loader-ами. Всё
это либо не нужно, либо делает бриф: Rsx.get(), Rsx.call() и
Rsx.field() существуют для редких случаев, когда профиль ещё не знает
член, и пользоваться ими стоит в последнюю очередь.
Зависимости
Компилируется против двух jar, но не содержит ни одного из них:
libs\rsx-api.jar- API, идёт в составе модлоадера;libs\rsxm-lib.jar- общая библиотека, лежит в%LOCALAPPDATA%\rsx-mod\libsи подмешивается в системный class path при старте игры.
Загрузчик игры даёт каждому моду свой class loader, поэтому моды не видят друг
друга напрямую - но у всех этих загрузчиков родитель системный, а значит всё,
что в нём, доступно каждому. Поэтому библиотека одна на всех, и вшивать её в
мод не нужно. Проверяется это просто: если в jar мода нет net/rsxm/, значит
он собрался правильно.