# 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/`, значит он собрался правильно.