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 的原因。

关联