本篇教程由作者设定未经允许禁止转载。

本文主要简要介绍使用mixinbooter引导mixin的方法.

mixinbooter可以大幅简化mixin的引导,但是其在mcmod的首页和github上的使用描述都很不清晰

我在使用该模组的过程中走了很多弯路 故写篇教程记录使用方法 万一有后来者呢?


主要内容为自己摸索而得 不保证完全正确 只求能跑


参考:

https://github.com/LoliKingdom/LoliASM

https://github.com/LoliKingdom/MixinBooter


第一步:

对build.gradle的修改

包含通用的mixin配置

不是唯一写法,仅供参考

buildscript {
    repositories {
      ...(省略)
        maven {
            name = 'MixinGradle'
            url = 'https://repo.spongepowered.org/repository/maven-public'
        }
    }
    dependencies {
            classpath "org.spongepowered:mixingradle:0.7-SNAPSHOT"
    }
}

...(省略)

apply plugin: 'org.spongepowered.mixin'

...(省略)

dependencies {

    //这代表了我使用的forge版本
    minecraft 'net.minecraftforge:forge:1.12.2-14.23.5.2860'
    
    ...(省略)

    implementation fg.deobf("zone.rong:mixinbooter:${mixinbooter_version}")

    annotationProcessor 'org.spongepowered:mixin:0.8.5:processor'

}

...(省略)

jar {
    manifest {
        attributes([
                //与加载EarlyMixin有关 
                'FMLCorePluginContainsFMLMod': true,
                //"com.yourname.modid"请换成你自己包名,"mixininit.EarlyMixinInit"具体是什么稍后讲解
                'FMLCorePlugin': 'com.yourname.modid.mixininit.EarlyMixinInit',
                //可能并不合适?但是可以运行
                "ForceLoadAsMod": true,
                ...(省略)
        ])
    }
}


//通用的mixin配置 可以参考其他mixin教程填写 注意不需要在这里填写config,这部分交给mixinbooter
mixin {
    //换成你自己modid 其实这个refmap的名字其他地方也是可以改的
    add sourceSets.main, "mixins.modid.refmap.json"
    debug.export = true
}


第二步:使用MixinBooter引导mixin


1.mixin第三方模组

请给一个类实现ILateMixinLoader

@SuppressWarnings("unused")
//并不需要@MixinLoader或者其他注解,mixinbooter会找到这个类的
public class LateMixinInit implements ILateMixinLoader {
    
    // ILateMixinLoader接口只有一个你要实现的方法 你在这里返回给第三方模组mixin的config的文件名就行
    //不要在意例子的具体内容(
    @Override
    public List<String> getMixinConfigs() {
        return Lists.newArrayList("mixins.gregica_late.json");
    }
}


2.mixin原版或者forge

需要给一个类实现 IFMLLoadingPlugin和IEarlyMixinLoader 主要这个类在前文有使用

@SuppressWarnings("unused")
@IFMLLoadingPlugin.Name(Gregica.MOD_ID)
@IFMLLoadingPlugin.MCVersion(ForgeVersion.mcVersion)
public class EarlyMixinInit implements IFMLLoadingPlugin,IEarlyMixinLoader{
    //这个才是真正的unused(
    public static final boolean isClient = FMLLaunchHandler.side() == Side.CLIENT;
    //与 ILateMixinLoader 同理 只不过这里给出的config文件是用来描述mixin原版或者forge类的
    @Override
    public List<String> getMixinConfigs() {
            return Collections.singletonList("mixins.gregica_early.json");
    }
    
    //下方 IFMLLoadingPlugin和IEarlyMixinLoader给出了大量你需要实现的方法 但是如果你只需要mixin通常让这些方法留空就行
    //具体使用请参考LoliASM
    @Override
    public String[] getASMTransformerClass() {
        return new String[0];
    }
    
    @Override
    public String getModContainerClass() {
        return null;
    }
    
    @Nullable
    @Override
    public String getSetupClass() {
        return null;
    }
    
    @Override
    public void injectData(Map<String, Object> data) {
    
    }
    
    @Override
    public String getAccessTransformerClass() {
        return null;
    }
}


第三步:关于mixin的config

其实没有太多mixinbooter内容 这里给出一个范例

mixins.gregica_late.json

{
  "minVersion": "0.7",
  //自己改
  "package": "your.package.name.mixin",
  "compatibilityLevel": "JAVA_8",
  //有关mixin插件请自行搜索教程 本教程不做介绍
  "plugin": "your.package.name.mixininit.GCMixinConfigPlugin",
  "target": "@env(DEFAULT)",
  //注意和build.gradle里填的要一致
  "refmap": "mixins.modid.refmap.json",
  "mixins": [
   //在双端都mixin的类名
  ],
  "client": [
   //在物理客户端mixin的类名
  ],
  "server": [
  //在物理服务端上mixin的类名
  ],
  "injectors": {
    "defaultRequire": 1
  }

}



就这样吧 讲的比较草率 但是大概能让你轻松引导mixin,放心去写mixin而不用一直纠结到底有没有成功引导