本篇教程由作者设定未经允许禁止转载。
本文主要简要介绍使用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而不用一直纠结到底有没有成功引导