Миксины! Хуклиба на максималках.

Миксины. Простое изменение байт-кода. Хуклиба на максималках.

94
11
54
GlassSpirit добавил(а) новый ресурс:

Миксины! Хуклиба на максималках. - В данной статье рассмотрены основные аспекты того, как начать использовать миксины в своем моде

Посмотреть вложение 8925
Предисловие
Наконец я нашел мотивацию написать такую статью по моим любимым миксинам.
Статья предназначена не для новичков, а для людей, уже пытавших счастье в написании кормодов и возможно пользовавшихся хуклибой. Для более полного понимания происходящего можно ознакомиться с данными материалами:

Узнать больше об этом ресурсе...
 
958
21
213
Шикарно! давно искал что-то интересное по миксинам на РУ. (был не особо приятный опыт с миксинами, когда мод слал нахрен при загрузке кубача... что-то там сгенерить не мог)
 

tox1cozZ

aka Agravaine
Модератор
7,242
460
2,220
Отлично. Заканчивай статью и можно в туториалы перенести я считаю.
 
495
8
279
А что там заканчивать? Он же всю суть описал уже, остались только мелочи всякие )
 

tox1cozZ

aka Agravaine
Модератор
7,242
460
2,220
Вот это бы закончить чтобы вообще идеально было :)
1590825238547.png
 
94
11
54
Сам считаю миксины (особенно на форжу) сильно недооцененной вещью. Хоть и все нормальные люди уже давно их используют (Sponge, Fabric, даже некоторые порты и наследники динозавра Cauldron), в сети крайне мало инфы о том, как банально начать их использовать.
Когда я сам первый раз столкнулся с миксинами, моей основной проблемой стало как раз таки настроить рабочую среду и сделать так, чтобы миксины работали на клиенте.
Надеюсь помогу кому-нибудь с этим, и да откроется нам прекрасный мир легких хуков.

Вскоре отполирую формулировки, дополню редиректы, мб накидаю пару новых примеров. На 1.7.10 и 1.15 затестить тоже надо бы по хорошему...
 
495
8
279
Поддерживаю. Я о них знал, но не юзал, ибо попросту сперва не смог так же настроить воркспейс, вечно какие-то ошибки были. С ними работать в разы удобнее и приятнее, нежели с кормодами на js, кек.
 
1,067
36
452
Наконец-то мануал по миксинам. Пока особо не вчитался, но надеюсь на 1.7.10 тоже встанут без танцев с бубном.
 
1,067
36
452
@GlassSpirit будь добр, осиль это дело плз. У @Ivasik точно все встало + некоторые моды (ForgeEssentials например) успешно юзают миксины на 1.7.10 если верить логам.

Имхо, новые штуки на новые версии- это хорошо. Но новые штуки на production-ready 1.7.10 - еще лучше.
 
94
11
54
Последнее редактирование:

Icosider

iMixin
Администратор
3,312
85
508
Inject, Redirect, Overwrite, ... Там же не только три аннотации, как бэ :/ ModifyArg(ModifyArgs), Intrinsic, Mutable и т.д.
 
94
11
54
Про Modify* еще буду дополнять, а в остальном бы еще самому разобраться сначала.
Как говорил один человек, решения ситуации в 95% случаев можно добиться хуком в правильное место, либо полной заменой метода, поэтому я рассмотрел то, чего нет вообще нигде, даже на западном сегменте (если не дотошно искать по дискорд каналам и тырить рандомный код из репозиториев гитхаба) - четкую пошаговую настройку среды. Ну и основной Inject с точками внедрения
 
94
11
54
GlassSpirit обновил(а) ресурс Миксины! Хуклиба на максималках. новой записью:

Полировка текста и поддержка 1.15+

Отредактировано большинство неточностей, добавлены некоторые параграфы, добавлена потенциальная поддержка 1.15+ с помощью MixinBootstrap.

Узнать больше об этом обновлении...
 
213
5
24
На миксинах на версии 1.7.10 появилась проблема.
При попытке импортировать проект с примера на github получаем gradle ошибку:

Gradle (Groovy):
A problem occurred evaluating root project 'ProjectMod'.
> java.lang.NullPointerException (no error message)

Эта ошибка вылетает на строке:
Gradle (Groovy):
mappings = project.mcpVersion // gradle.properties -> mcpVersion=stable_12
Если закоментировать эту строку, то импортирование проекта проходит успешно и сборка тоже, но без указания маппингов ничего не работает в runtime.
Кто нибудь знает как решить проблему?
 
Последнее редактирование:
94
11
54
Попробуй проверить версию gradle wrapper в файле /gradle/wrapper/gradle-wrapper.properties
Новые версии могут не работать со старыми версиями форжа (1.7.10), у меня стоит версия gradle-2.8.
 
213
5
24
У меня стояла версия 2.14, я сменил на 2.8 но ничего не изменилось абсолютно.
1605816655661.png
gradle.properties
Gradle (Groovy):
modGroup=com.group
modVersion=0.7.11-1.7.10
modBaseName=ForgeMixins
forgeVersion=1.7.10-10.13.4.1614-1.7.10
mcpVersion=stable_12
build.gradle
Gradle (Groovy):
buildscript {
    repositories {
        jcenter()
        maven {
            name = "forge"
            url = "https://files.minecraftforge.net/maven"
        }
    }
    dependencies {
        classpath "net.minecraftforge.gradle:ForgeGradle:1.2-SNAPSHOT"
    }
}

apply plugin: "java"
apply plugin: "forge"

sourceCompatibility = targetCompatibility = 1.8
compileJava.options.encoding = compileTestJava.options.encoding = "UTF-8"

version = modVersion
group = modGroup
archivesBaseName = modBaseName

minecraft {
    version = project.forgeVersion
    mappings = project.mcpVersion
    runDir = "run"
}

repositories {
    mavenCentral()
    maven {
        url "http://repo.spongepowered.org/maven"
    }
}

dependencies {
    compile "org.spongepowered:mixin:0.7.11-SNAPSHOT"
}

sourceSets {
    main {
        ext.refMap = "mixins.sweetmixin.refmap.json"
    }
}

def refMap = "${tasks.compileJava.temporaryDir}" + File.separator + "mixins.sweetmixin.refmap.json"
jar {
    from refMap
    manifest.attributes(
            "TweakClass": "org.spongepowered.asm.launch.MixinTweaker",
            "MixinConfigs": "mixins.sweetmixin.json",
            "FMLCorePluginContainsFMLMod": "true",
            "ForceLoadAsMod": "true",
    )
}

processResources {
    inputs.property "version", project.version
    inputs.property "mcversion", project.minecraft.version

    from(sourceSets.main.resources.srcDirs) {
        include "mcmod.info"
        expand "version": project.version, "mcversion": project.minecraft.version
    }
    from(sourceSets.main.resources.srcDirs) {
        exclude "mcmod.info"
    }
}

def mixinSrg = "${tasks.reobf.temporaryDir}" + File.separator + "mixins.srg"
afterEvaluate {
    tasks.compileJava.options.compilerArgs += ["-AreobfSrgFile=${tasks.reobf.srg}", "-AoutSrgFile=${mixinSrg}", "-AoutRefMapFile=${refMap}"]
}

reobf {
    addExtraSrgFile mixinSrg
}
 
Сверху