-
v0.2.0 Stable
released this
2026-10-16 23:25:47 +00:00 | 6 commits to main since this releasersx-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
- каждый мод получает свой загрузчик классов, поэтому моды не видят друг друга: