第三方模组兼容 Mixin
基本信息
| 属性 | 值 |
|---|---|
| Mixins 条目 | 3(XAEROS_MINIMAP_SCROLL、XAEROS_WORLDMAP_SCROLL、OPENCOMPUTERS_KEYBOARD_INPUT_FIX) |
| 源码注释标记 | // Mod compat patches(Mixins.java:50) |
| 包含的 mixin 类 | 3 |
| 注册位置 | Mixins.java:51-59 |
这是 Mixins 枚举中仅有的 3 个受目标模组条件门控的条目——其余 9 个条目对所有环境无条件应用或只受配置开关控制。
功能
XAEROS_MINIMAP_SCROLL(Mixins.java:51-53,Phase.LATE)
- mixin 类:
xaeros.XaerosMinimapScrolling(源文件位于mixins/late/xaeros/) - 目标模组:
TargetedMod.XAEROS_MINIMAP,按 modIdXaeroMinimap匹配(TargetedMod.java:29) - 目标 GUI(4 个):
GuiAddWaypoint、GuiEntityRadar、GuiTransfer、GuiWaypoints(XaerosMinimapScrolling.java:16,来自xaero.common.gui.*) - 核心修改:
@ModifyConstant(method = "handleMouseInput", constant = @Constant(intValue = 120), expect = -1),把滚轮增量 120 重标定为 1(XaerosMinimapScrolling.java:20-23)。120 是 Xaero 假定"一次滚轮一格"的值,LWJGL3/SDL 下实际像素级增量不同。 - 另在
initGui()V的HEAD注入lwjgl3ify$onInit(XaerosMinimapScrolling.java:25-26)。
XAEROS_WORLDMAP_SCROLL(Mixins.java:54-56,Phase.LATE)
- mixin 类:
xaeros.XaerosWorldmapScrolling - 目标模组:
TargetedMod.XAEROS_WORLDMAP,按 modIdXaeroWorldMap匹配(TargetedMod.java:30) - 目标 GUI(1 个):
xaero.map.gui.GuiMap(XaerosWorldmapScrolling.java:9) - 相同的 120→1 重标定(
XaerosWorldmapScrolling.java:13-16)
幂等性设计
两个 Xaeros mixin 源码里都有同一条注释:// Optional because an old hodgepodge patch might also do the same(XaerosMinimapScrolling.java:19、XaerosWorldmapScrolling.java:12)。
对应的实现手法是 expect = -1:该参数使修改器在目标常量不存在时静默跳过,因此即使 Hodgepodge 已先行打过同一补丁,LWJGL3ify 也不会因"找不到待改常量"而崩溃。这两处是本仓库中少见的有意容错设计,与 ObjectHolderRef 那类无条件 catch (Throwable) 降级不同。
OPENCOMPUTERS_KEYBOARD_INPUT_FIX(Mixins.java:57-59,Phase.EARLY)
- mixin 类:
oc.OcInputBuffer(源文件位于mixins/early/oc/) - 目标模组:
TargetedMod.OPENCOMPUTERS - 目标:
li.cil.oc.client.gui.traits.InputBuffer$class(OcInputBuffer.java的@Mixin(remap = false, targets = {...}))
与另两个不同,OpenComputers 补丁是 EARLY 阶段而非 LATE。TargetedMod.OPENCOMPUTERS 用 setCoreModClass("li.cil.oc.client.launch.TransformerLoader") + setModId("OpenComputers") 双重匹配,源码注释写明"同时支持 NH 分支与上游"(TargetedMod.java:31-33)。
数值
| 数值 | 值 | 来源 |
|---|---|---|
| 受目标模组门控的条目数 | 3 | Mixins.java:51,54,57 |
| LATE 阶段条目 | 2 | Mixins.java:51,54 |
| EARLY 阶段条目 | 1 | Mixins.java:57 |
| 目标 GUI 类总数 | 6(Xaero Minimap 4 + WorldMap 1 + OC 1) | 各 mixin 文件 @Mixin |
expect = -1 幂等修改点 |
2 | XaerosMinimapScrolling.java:20、XaerosWorldmapScrolling.java:13 |
| 滚轮增量重标定 | 120 → 1 |
同上 |
交互
| 触发 | 行为 |
|---|---|
| 装了 XaeroMinimap,在其 4 个 GUI 滚轮 | 滚轮增量由 120 归一为 1,缩放不再跳变 |
| 装了 XaeroWorldMap,在地图 GUI 滚轮 | 同上 |
| 未装对应模组 | 整个条目不加载 |
| Hodgepodge 已打过相同补丁 | expect = -1 使本次修改静默跳过,不报错 |
相关条目
- Mixin 注册机制总览 - Phase 与目标模组条件如何决定条目是否加载
- 第三方兼容钩子 -
TargetedMod枚举的 6 个定义 - LWJGL2→LWJGL3 兼容层 -
OcInputBuffer依赖的OcInputBuffer.java支撑类