Inject Tweaker

Версия Minecraft
1.7.10
API
Forge
210
1
19
Не по какой-то готовой инструкции, а методом проб и ошибок (а потому возможно, что я делаю полную хрень), на примере пары готовых твиков из интернета разобрался, что можно подменять оригинальные классы в minecraft.jar своими. Через MCP вношу изменения в нужные мне классы, потом компилирую, реобфусцирую и готовые классы кладу в JAR-файл, в котором уже лежат ClassTransformer.class и Tweaker.class, а в манифесте следующее:
Код:
Manifest-Version: 1.0
TweakClass: inject.Tweaker
TweakOrder: -1000

Возможно, так вообще нельзя делать, но в целом всё работает, как мне хочется... Если скажете лучший способ - буду рад.

Но тема не об этом. Меня парит наличие отдельного JAR-архива. Подскажите, как это всё запихать в мой мод, чтоб всё загружалось вместе? Ну там закинуть готовые классы в папку, и чтоб они перед загрузкой мода "инъекцировались". Может, что-то прописать в mcmod.info или типа того, я не знаю. Главное - чтобы не очень сложно, а то у меня IQ низкий из-за преклонного возраста.

И вдогонку вопрос: я правильно понимаю, что подменять классы имеет смысл только те, которые не меняет сам Forge? Ведь тогда будет несостыковка, очевидно - класс подменится, но форж его все равно после перезапишет своим и ничего работать не будет.
 
210
1
19
с помощью asm можно меня что хочешь
Я не умею ими пользоваться. Читал инструкцию - там как-то всё сложно. Какие-то приватные поля я грабил с классов через RefleсtionHelper - и то просто где-то стащил кусок готового кода, приспособил на соплях - заработало, даже вникать в код особо не стал...


Заменять полностью классы вообще зло.
А вот тут [1.7.10] ASM. Class Transformer. Coremod. A few questions человек пишет с точнотью до наоборот: "ASM трансформеры - это плохо и не стоит ими пользоваться никогда". Собственно, ни ты, ни он не объясняете свою точку зрения. Разъясни, пожалуйста, почему замена классов - зло?
 

tox1cozZ

aka Agravaine
8,456
598
2,893
человек пишет с точнотью до наоборот: "ASM трансформеры - это плохо и не стоит ими пользоваться никогда"
Если возможно сделать без диких костылей без ASM - надо делать без него. Это очень хрупкая штука, которая требует хорошего понимания байткода. Иначе легко всё сломать.

Разъясни, пожалуйста, почему замена классов - зло?
Потому что ты перезаписываешь их полностью) Ты вообще сразу всю совместимость ломаешь.
Представь два мода, которые оба заменяют один и тот же класс. В итоге победит только один, а второй в лучшем случае будет неправильно работать, в худшем - сломает игру. Эта была проблема ModLoader в бородатых версиях 1.2.5 и старше. Нормально собрать сборку было очень тяжело, потому что любой чих и моды уже конфликтуют.

С помощью же ASM ты меняешь только нужный кусочек кода в классе, например, добавляешь хук (вызов твоего метода). Из-за этого ничего не сломается, сколько хочешь модов добавят свои вызовы и всё будет работать.
 
210
1
19
В итоге победит только один, а второй в лучшем случае будет неправильно работать, в худшем - сломает игру.
Теперь понятно, на самом деле - спасибо. Вот вроде моды во сто раз круче и удобнее плагинов, но сижу и такое ощущение, будто в навозе копаюсь.
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
моды во сто раз круче и удобнее плагинов
До тех пор пока тебе не нужно топать менять байткод, моды и плагины идентично работают/пишутся, разница в том что моды ставятся и на клиент и на сервер, и потому могут намного больше - свои эффекты/текстуры/рендеринг, блоки, сущности и так далее.
Вот в этом моём моде нету никакого байткода (окей, если проигнорировать одну маленькую бесполезную фишку сделанную для прикола), но выглядит красиво.

У asm трансформеров на самом деле элементарный интерфейс - на входе имя класса и массив байт, на выходе массив байт)

Если возвращать оригинальный массив, то ничего не будет, можно любым образом грузить/генерировать классы и возвращать тупо новый класс - та же замена что у тебя была через твикеры (для которых никакой фордж и прочие не нужны, кстати), или как положено - прочитать входящий массив байт, понять что-где, и добавить кусочек от себя в него (желательно добавлять, а не заменять/удалять).
 
Сверху