Mixin 补丁总表
基本信息
| 属性 | 值 |
|---|---|
| 注册真源 | mixins/Mixins.java(枚举 Mixins implements IMixins) |
| 目标 mod 枚举 | mixins/TargetedMod.java(枚举 TargetedMod implements ITargetMod) |
| coremod 入口 | mixins.WitcheryExtrasCore(gradle.properties 的 coreModClass) |
| Mixin 加载器 | mixins/LateMixinLoader.java |
| Mixin 组数 | 11 |
| Mixin 类数 | 22(4 个 early/minecraft + 18 个 late/witchery) |
| 清单文件 | mixins.WitcheryExtras.json / .early.json / .late.json |
3 个清单文件
| 文件 | package |
额外声明 |
|---|---|---|
mixins.WitcheryExtras.json |
无(根 alkalus.main.mixins) |
— |
mixins.WitcheryExtras.early.json |
alkalus.main.mixins.early |
target: @env(DEFAULT) |
mixins.WitcheryExtras.late.json |
alkalus.main.mixins.late |
"mixinextras": {"minVersion": "0.5.0"} |
三者共用 refmap: mixins.WitcheryExtras.refmap.json,
minVersion: 0.8.5-GTNH,compatibilityLevel: JAVA_8。
三者都没有 "mixins" 数组——类清单由 GTNH mixin 注解处理器
从 Mixins 枚举自动生成。
late清单必须声明mixinextras.minVersion,因为PotionResizingMixin用了@At("MIXINEXTRAS:EXPRESSION")这种 MixinExtras 专有注入点(PotionResizingMixin.java:15)。
11 个组
| # | 组名(Mixins.java 行) |
Mixin 类 | 侧 | 阶段 | 门控 |
|---|---|---|---|---|---|
| 1 | FIX_SHAPESHIFT_SYNC(13-15) |
minecraft.NetHandlerPlayClientMixin |
客户端 | EARLY | — |
| 2 | FIX_SHAPESHIFT_STANCE_VALIDATION(16-18) |
minecraft.NetHandlerPlayServerMixin |
通用 | EARLY | — |
| 3 | FIX_IS_ENTITY_INSIDE_OPAQUE_BLOCK(19-21) |
minecraft.EntityMixin |
通用 | EARLY | — |
| 4 | FIX_POSITON_RESIZING_EYE_HEIGHT(22-24) |
witchery.PotionResizingMixin |
通用 | LATE | — |
| 5 | FIX_SHAPESHIFT_CAMERA(25-27) |
minecraft.EntityRendererMixin |
客户端 | EARLY | — |
| 6 | WITCHERY_OFFSET_CAPTURE(28-30) |
witchery.PlayerRenderMixin |
客户端 | LATE | — |
| 7 | WITCHERY(31-43) |
9 个通用 + 1 个客户端 | 通用 + 客户端 | LATE | — |
| 8 | WITCHERY_NEI_CONFIG(44-47) |
witchery.NEIWitcheryConfigMixin |
通用 | LATE | enablePatchNEI |
| 9 | WITCHERY_BAUBLES_COMPAT(48-54) |
3 个(见下) | 通用 | LATE | Baubles|Expanded |
| 10 | WITCHERY_DISABLE_CONTAINER_BLOCKS(55-59) |
witchery.BlockBaseContainerMixin |
通用 | LATE | — |
| 11 | WITCHERY_FIX_EXTENDED_PLAYER_SYNC(60-63) |
witchery.ExtendedPlayerMixin |
通用 | LATE | — |
组 7 WITCHERY 的 10 个类(Mixins.java:31-43)
| 类 | 侧 |
|---|---|
witchery.TileEntityPoppetShelf |
通用 |
witchery.TileEntityWitchesOven |
通用 |
witchery.TileEntitySpinningWheel |
通用 |
witchery.SpinningRecipe |
通用 |
witchery.ShockwaveTask |
通用 |
witchery.TileEntityDistillery |
通用 |
witchery.ItemGeneral$3$1 |
通用 |
witchery.BlockAltar |
通用 |
witchery.ItemLeonardsUrn |
通用 |
witchery.ItemBrew |
客户端(addClientMixins,Mixins.java:42) |
witchery.ItemGeneral$3$1是匿名内部类, 源码用targets = "com.emoniph.witchery.item.ItemGeneral$3$1"字符串指定 (ItemGeneral$3$1Mixin.java:13)。类名里的$3是匿名类序号, Witchery 改版重排内部类就会失效——这是本 mod 最脆弱的补丁之一。
组 9 WITCHERY_BAUBLES_COMPAT 的 3 个类
BlockWitchDoorMixin_Bauble、ItemGeneralMixin_Bauble、ItemPoppetMixin_Bauble
(Mixins.java:49-52)。三者文件名都带 _Bauble 后缀,
且被 .addRequiredMod(TargetedMod.BAUBLES_EXPANDED) 门控
(Mixins.java:53)。详见 Baubles Expanded 兼容。
⚠️ modid 陷阱:
TargetedMod.BAUBLES_EXPANDED("Baubles|Expanded")(TargetedMod.java:10)和Loader.isModLoaded("Baubles|Expanded")(WitcheryExtras.java:63)用的都是带竖线的Baubles|Expanded, 不是Baubles。Baubles|Expanded是 GTNH 版 Baubles-Expanded 的 父 modid,其自身 modid 是Baubles。
目标 mod 枚举只有 1 项
TargetedMod.java:8-10:
public enum TargetedMod implements ITargetMod {
BAUBLES_EXPANDED("Baubles|Expanded");
只有 Baubles Expanded 一个门控目标,WITCHERY 本体不做门控——
@Mod(dependencies = "required-after:witchery")(WitcheryExtras.java:37)
已在 mod 层面保证。
EARLY / LATE 划分
| 阶段 | 组 | 设计意图 |
|---|---|---|
| EARLY | 1, 2, 3, 5 | 全部打 Minecraft 本体类(NetHandlerPlayClient/Server、Entity、EntityRenderer) |
| LATE | 4, 6, 7, 8, 9, 10, 11 | 打 Witchery 类(PotionResizing、PlayerRender、各 TileEntity/Item/Block) |
划分逻辑清楚:改原版类要 EARLY(早于 Witchery),改 Witchery 类要 LATE。
注入器类型统计
| 注解 | 出现处 |
|---|---|
@Inject |
多数补丁(GUI 标题、行为取消) |
@ModifyExpressionValue |
EntityMixin、EntityRendererMixin、NetHandlerPlayClient/ServerMixin、PotionResizingMixin、BlockAltarMixin、TileEntityDistilleryMixin、ItemGeneral$3$1Mixin |
@ModifyConstant |
仅 BlockAltarMixin.java:24(intValue = 3, ordinal = 1 → 999) |
@ModifyVariable |
仅 EntityRendererMixin.java:20 |
@Overwrite |
仅 TileEntityWitchesOvenMixin.java:53、89(canSmelt() / smeltItem()) |
@WrapMethod |
BlockWitchDoorMixin_Bauble.java:23、ItemGeneralMixin_Bauble.java:53、ItemPoppetMixin_Bauble.java:87 |
@WrapWithCondition |
仅 TileEntityPoppetShelfMixin.java:30 |
@Redirect |
NEIWitcheryConfigMixin.java:23、32(各 2 个,共 4 个 @Redirect) |
@Shadow |
TileEntitySpinningWheelMixin.java:20(ItemStack[] slots) |
22 个类里同时混用 MixinExtras(
@ModifyExpressionValue/@WrapMethod/@WrapWithCondition)与原版 SpongePowered 注入器,这正是late清单需要 声明mixinextras.minVersion的原因。