module-mixin

基本信息

属性 值
modid unimixins-mixin
Java 文件 4
加载插件 io.github.legacymoddingmc.unimixins.mixin.MixinCore
产出 …-mixin-1.7.10.jar
启用版本 Minecraft 1.7.10

功能

Mixin 库 fork。UniMixins 系列的根基 —— 其它模块都依赖它提供的 Mixin 0.8 运行时。它本身就是 mcmod.info 里的 「UniMixins module that provides the @MIXIN_SOURCE_CAPITALIZED@ fork of Mixin」。

4 个类

类 行数 作用
MixinCore 58 IFMLLoadingPlugin,Mixin 环境平台相关初始化
MixinModule 4 空 @Mod 标记类
MixinSanityCheck 54 环境自检
MixinModidDecorator 146 用 modid 装饰 mixin 报错信息

MixinCore

@IFMLLoadingPlugin.MCVersion("1.7.10")。getASMTransformerClass() 返回 new String[0] —— 本模块自身不注册 ASM transformer。

其静态初始化块在自检开启时依次检查 3 件事:

MixinSanityCheck.checkMixinHasInitialized(),
MixinSanityCheck.checkMixinContainer(),
SanityCheckHelper.checkIfJarPrefixesExist(
    Arrays.asList("gasstation-", "mixinbooterlegacy-", "spongemixins-"))

MixinModule

/**
 * An empty mod class provided to make it impossible to load multiple editions
 * of the module at the same time.
 */
@Mod(modid = "unimixins-mixin", version = "@VERSION@", acceptableRemoteVersions = "*")
public class MixinModule {}

⚠️ 用途与 AllModule 不同: AllModule 是「GUI 里显示为一个 mod」, MixinModule 是「阻止同时加载多个版本」。 两者都写成 @Mod 但目的相反,容易混淆。

MixinSanityCheck

2 个检查:

  • checkMixinHasInitialized() —— 检查 Launch.blackboard 是否含 mixin.initialised 键;缺则提示「dev 环境需用 --tweakClass 传入 MixinTweaker」。
  • checkMixinContainer() — 对比两个类各自所在 jar 名: MixinCore.class 与 org/spongepowered/asm/launch/MixinTweaker.class。 不同名即说明「加载了别的 Mixin 版本」。

⚠️ checkMixinContainer 的提示里有个实用技巧:若怀疑是文件名排序问题 (UniMixins 的 jar 名按字母序排在后面),建议在文件名前加 ! 字符使其排到最前。

MixinModidDecorator

146 行,参考 Fabric Loader 的 FabricMixinBootstrap。为 mixin 配置装饰 modid, 使报错信息里显示 modid 而非 jar 名。 用 Launch.blackboard 键 unimixins.mixinModidDecorator.refresh 注册了一个 Runnable 句柄,供「之后新增 mixin 配置」时触发刷新。

实现要点

⚠️ 本模块没有 MixinConfigs(manifest 中该属性缺省), 它不提供 mixin,只提供 mixin 运行时。

⚠️ manifest 额外声明 Implementation-Version: mixinVersion, 以及 Premain-Class / Agent-Class = MixinAgent、 Can-Redefine-Classes / Can-Retransform-Classes = true —— 即可作为 Java agent 启动。

⚠️ 注释里明确说明 ASM 刻意不 relocate(「We want to not relocate ASM in the bridge classes」),改用多步构建流程处理。

相关条目