bfda50ae61
Собран так, чтобы его читал человек, который пишет первый мод. Показывает apiVersion, конфиги из rsxm-lib, события, everyTicks, типизированные обёртки Rsx.Player и Rsx.World, onError и onUnload. Ни одного обфусцированного имени: мод спрашивает логическими именами, бриф переводит их в имена текущей сборки. Ни рефлексии, ни чтения файлов игры - всё это либо не нужно, либо делает бриф. Компилируется против rsx-api.jar и rsxm-lib.jar, но не содержит ни одного: библиотека лежит в libs\ и подмешивается в системный class path при старте. Проверяется просто - если в jar мода нет net/rsxm/, он собран правильно.
49 lines
3.0 KiB
Markdown
49 lines
3.0 KiB
Markdown
# 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/`, значит
|
|
он собрался правильно.
|