MixinBooterLegacy - магия миксинов на версии 1.7.10 без танцев с бубном

MixinBooterLegacy - магия миксинов на версии 1.7.10 без танцев с бубном 1.0.1

Нет прав для скачивания
Версия(и) Minecraft
1.7.10
На 1.7.10 с миксинами та еще беда: не работает официальный плагин для Gradle - MixinGradle, нет утилитарной зависимости (приходится упаковывать миксины в каждый свой мод), поддержка из коробки только устаревшей версии 0.7.11.
Так же есть проблема с инжектами в чужие моды - они просто не работают, ибо загружаются моды сильно позже трансформеров.

Данная библиотека решает все эти проблемы, а так же предоставляя миксины более новой версии 0.8.2 (в будущем, возможно, буду обновлять до самой актуальной).

P.S Я знаю что есть Grimoire. Но там, во-первых, старые миксины 0.7.11. А во-вторых, это библиотека и она предлагает еще кучу всего, которое вряд ли вам нужно.

Итак, как этим пользоваться?


Подключаем библиотеку в свой проект всего парой строк:
build.gradle:
apply from: 'https://raw.githubusercontent.com/tox1cozZ/mixin-booter-legacy/master/gradle/configurations/v1.gradle'

mixin {
    // Рекомендую фактически указать название рефмапы. По-умолчанию используется название проекта
    // mixinRefMapName = 'mixin.modid.refmap.json'
}

Дальше всё как обычно: создаём конфиг для миксинов в корне resources и заполняем.
mixin.modid.json:
{
  "minVersion": "0.8",
  "compatibilityLevel": "JAVA_8",
  "required": true,
  "target": "@env(DEFAULT)",
  "package": "your.mixins.package",
  "refmap": "${mixin_refmap}",
  "injectors": {
    "defaultRequire": 1
  },
  "mixins": [

  ],
  "client": [

  ],
  "server": [
 
  ]
}

Конфиг такой же, поэтому если что-то непонятно - идём в документацию миксинов и изучаем.
Единственное из нового - токен ${mixin_refmap} в параметре 'refmap'. Он нужен для автоматической подстановки рефмапы при сборке мода.

Загрузка миксинов.

Если нам нужно изменять Minecraft, Forge или библиотеки:

Создаём класс, расширяем IFMLLoadingPlugin и IEarlyMixinLoader:
MyLoadingPlugin:
import cpw.mods.fml.relauncher.IFMLLoadingPlugin;
import io.github.tox1cozz.mixinbooterlegacy.IEarlyMixinLoader;

import java.util.Collections;
import java.util.List;
import java.util.Map;

public class MyLoadingPlugin implements IFMLLoadingPlugin, IEarlyMixinLoader {
 
    @Override
    public String[] getASMTransformerClass() {
        return null;
    }

    @Override
    public String getModContainerClass() {
        return null;
    }

    @Override
    public String getSetupClass() {
        return null;
    }

    @Override
    public void injectData(Map<String, Object> data) {
    }

    @Override
    public String getAccessTransformerClass() {
        return null;
    }

    @Override
    public List<String> getMixinConfigs() {
        return Collections.singletonList("mixin.modid.json");
    }
}

По сути, здесь нас интересует только метод getMixinConfigs, в котором мы указываем нашу конфигурацию.

Так как мы создали загрузочный плагин, нам нужно как обычно его зарегистрировать.
Для среды разработки нужно добавить в аргументы JVM строку:
-Dfml.coreMods.load=my.package.MyLoadingPlugin

А чтобы после сборки всё работало, добавим еще в build.gradle пару строк:
build.gradle:
jar {
    manifest {
        attributes 'FMLCorePlugin': 'my.package.MyLoadingPlugin'
        attributes 'FMLCorePluginContainsFMLMod': 'true'
    }
}

Если нам нужно изменять другие моды:

Создаём класс, расширяем ILateMixinLoader, вешаем аннотацию @LateMixin:
MyLateMixinLoader.java:
import io.github.tox1cozz.mixinbooterlegacy.ILateMixinLoader;
import io.github.tox1cozz.mixinbooterlegacy.LateMixin;

import java.util.Collections;
import java.util.List;

@LateMixin
public class MyLateMixinLoader implements ILateMixinLoader {

    @Override
    public List<String> getMixinConfigs() {
        return Collections.singletonList("mixin.modid.json");
    }
}

Здесь ещё проще. Не нужно создавать загрузочный плагин, просто укажите свой конфиг и всё.

Если вам нужно грузить некоторые миксины только при условии наличия какого-то мода - создайте отдельный конфиг и переопределите метод shouldMixinConfigQueue примерно так:
MyLateMixinLoader.java:
@Override
public List<String> getMixinConfigs() {
    return Arrays.asList(
            "mixin.modid.json", // Основной конфиг
            "mixin.modid.immersiveengineering.json" // Конфиг с миксинами для мода Immersive Engineering
    );
}

@Override
public boolean shouldMixinConfigQueue(String mixinConfig) {
    if (mixinConfig.equals("mixin.modid.immersiveengineering.json")) {
        return Loader.isModLoaded("immersiveengineering");
    }
    return true;
}

Метод shouldMixinConfigQueue так же можно применить в IEarlyMixinLoader чтобы выборочно загружать миксины по настройкам из конфига, например.

Если что-то не работает, настоятельно рекомендую использовать форк ForgeGradle от anatawa12, а так же обновить версию Gradle до 7+.

Github Repository
Автор
tox1cozZ
Скачивания
32
Просмотры
1,707
Первый выпуск
Обновление
Оценка
5.00 звёзд 3 оценок

Последние рецензии

Классная либа, достаточно изящная и небольшая. Спасибо)
Сверху