Как отключить мискин?

Версия Minecraft
1.16+
API
Forge
342
33
54
Hi
На issue написали о несовместимости модов.
Проблему нашел.

И для решения нужно отключать миксин проверкой - ModList.get().isLoaded("ыыы")
И не знаю как это сделать...

PS: Проверка внутри методов миксинов не поможет т.к. @Redirect()
 
Решение
И для решения нужно отключать миксин проверкой - ModList.get().isLoaded("ыыы")
И не знаю как это сделать...
В рантайме миксины нельзя включать и отключать по желанию

Однако можно сделать свой IMixinConfigPlugin, который будет контролировать, какие миксины нужно применять
(достаточно указать в твоем mixins.json путь к классу-конфиг-плагину)

Добавить в текстовый конфиг переменную что-то типа "включить совместимость с модом N", в миксин-конфиге это прочитать и отменить применение миксина
И для решения нужно отключать миксин проверкой - ModList.get().isLoaded("ыыы")
И не знаю как это сделать...
В рантайме миксины нельзя включать и отключать по желанию

Однако можно сделать свой IMixinConfigPlugin, который будет контролировать, какие миксины нужно применять
(достаточно указать в твоем mixins.json путь к классу-конфиг-плагину)

Добавить в текстовый конфиг переменную что-то типа "включить совместимость с модом N", в миксин-конфиге это прочитать и отменить применение миксина
 
Plugin:
public class MFRAPIMixinPlugin implements IMixinConfigPlugin {

    @Override
    public void onLoad(String mixinPackage) {}

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

    @Override
    public boolean shouldApplyMixin(String targetClassName, String mixinClassName) {
        if (mixinClassName.startsWith("foundationgames.enhancedblockentities.core.mixin.mfrapi.") && SinytraIntegration.FFAPI.isLoaded()) {
            EBE.LOGGER.debug(EBE.FFAPI, "Sinytra detected. Force disabling MFRAPI.");
            return false;
        }
        return true;
    }

    @Override
    public void acceptTargets(Set<String> myTargets, Set<String> otherTargets) {}

    @Override
    public List<String> getMixins() {
        return null;
    }

    @Override
    public void preApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) {}

    @Override
    public void postApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) {}
}

кидается nullpointer т.к. ModList.get() == null
 
кидается nullpointer т.к. ModList.get() == null
Препроцессор миксинов запускается за до инициализации классов модов - естественно оно нулл
Я уже писал выше - нужно написать максимально независимым условие
 
Препроцессор миксинов запускается за до инициализации классов модов - естественно оно нулл
Я уже писал выше - нужно написать максимально независимым условие
Если эти миксины применятся то игра крашится(с sinytra модом).
Есть вариант - искать в папке mods нужный jar и отменять, но звучит как-то не очень
 
Java:
public static boolean isSinytraOrFFAPILoaded() {
     Path path = FMLPaths.MODSDIR.get();
     return Files.exists(path.resolve(SINYTRA.modid())) || Files.exists(path.resolve(FFAPI_JAR));
}

Нюансы - в IDE не проверить, Если .jar будут переименованы, то краш.

С конфигом как вариант, но сколько же мне будет писать на issue...
 
Нюансы - в IDE не проверить, Если .jar будут переименованы, то краш.
Вспомнил еще такую вещь - ты можешь попытаться проверить наличие ресурса example/mod/Main.class
По идее оно должно быть доступно - тк оно работает по такой логике -> forge добавляет все URL файлов модов к загрузчику классов -> запускаются core-моды (например система миксинов) -> запускаются обычные моды
 
Вспомнил еще такую вещь - ты можешь попытаться проверить наличие ресурса example/mod/Main.class
Звучит лучше чем конфигом, но я уже опубликовал версию(Все равно попробую еще).
Также я не нашёл куда можно запихнуть конфига загрузку поэтому запихнул сразу в shouldApplyMixin(В preApply не вариант).

Как ожидалось, много людей, не прочитав описание на modrinth/закреплённый issue, пишут на issues о том что, ничего не работает...
 
Назад
Сверху