兼容性与门控
基本信息
| 属性 | 值 |
|---|---|
| 类型 | 依赖声明、mixin 门控、构建期开关 |
| 硬依赖 | gtnhlib@[0.6.22,) |
| 接受的 MC 版本 | [1.7.10] |
| 逐 mod 条件分支 | 无 |
| 被门控的 mixin 组 | 2(均 TargetedMod.VANILLA) |
excludedMods 排除项 |
0 个(字段存在但从未填充) |
行为
Foundation 是一个无分支的基础设施层:源码里没有任何 Loader.isModLoaded /
FMLLoader.isModLoaded / ModList. 判断(grep 全仓库零命中),也没有针对
任何具体 mod 的 if。它对世界的唯一要求是 GTNHLib 在场。
依赖声明
@Mod 注解(Foundation.java:16-21):
@Mod(
modid = Foundation.MODID,
version = Tags.VERSION,
name = "Foundation",
acceptedMinecraftVersions = "[1.7.10]",
dependencies = "required-after:gtnhlib@[0.6.22,);")
required-after + 版本区间 [0.6.22,) 表示 GTNHLib 缺失或版本过低时直接拒绝启动。
这个依赖是功能性的而非可选的:mixin 的声明、筛选、EARLY 挂载全部由 GTNHLib 的
mixin 子系统完成——FoundationCore.getMixins() 唯一的实现就是
IMixins.getEarlyMixins(Mixins.class, loadedCoreMods)。
mixin 门控
Mixins 枚举两个常量各自声明的 4 个门控参数:
| 门控参数 | PACKETS |
CLIENT_ONLY |
实际效果 |
|---|---|---|---|
addTargetedMod |
TargetedMod.VANILLA |
TargetedMod.VANILLA |
只在目标是原版类时挂载;目标类若被其他 mod 的 coremod 整体替换,本 mixin 不参与 |
setSide |
Side.BOTH |
Side.CLIENT |
前者在服务端与客户端都挂载,后者仅客户端 |
setPhase |
Phase.EARLY |
Phase.EARLY |
全部在类加载早期应用 |
setApplyIf |
() -> true |
() -> true |
恒真,无任何条件判断 |
excludedMods |
(未设置) | (未设置) | 无排除项 |
Side 与 Phase 是正交的:Side 决定物理加载在哪一侧,Phase 决定时序。
Foundation 没有任何 Phase.LATE mixin,因此 mixins.foundation.json(LATE 用的那份
配置,见 Mixin 配置)实际不承载任何类。
为何全部 EARLY
三个 @Overwrite(S21 的 func_149269_a、S22/S23 的 read/writePacketData、以及
ASM 重写的 S22 构造)与两个客户端 @Overwrite(Chunk.fillChunk、
NetHandlerPlayClient.handleMultiBlockChange)都改写了协议方法体。Mixin 的
@Overwrite 要求目标方法在被处理时处于原始状态;若被别的 coremod 先改写,Overwrite
会失败或产出不可预期结果。源码在 MixinS21PacketChunkData、client/MixinChunk 的
@Overwrite 上重复标注了同一句:
If something is targeting this, it is guaranteed not gonna work with Foundation
即:其他 mod 若也对这几个方法做注入,视为与 Foundation 不兼容。这是本 mod 最大的 兼容性约束,且无法通过配置规避。
@IFMLLoadingPlugin.TransformerExclusions
FoundationCore 用 TransformerExclusions({"com.gtnewhorizons.foundation.core"})
把自己的 core 包排除出 FML 的 ASM 转换链。原因是 FoundationTransformer 自身
要被 FML 加载并使用,若它的包也进入 ASM 转换流程,则转换器在极早期运行、其依赖的
org.spongepowered.asm.lib.tree 类尚未就绪。同理 getSetupClass() 返回 null
(不做 setup 阶段)、getAccessTransformerClass() 返回 null(不用 AT,
accessTransformersFile 亦为空)。
第三方依赖面
全仓库的非 Minecraft 第三方 import 只有 4 处来源:
| 依赖 | 使用的符号 | 用途 |
|---|---|---|
| GTNHLib | IMixins、ITargetedMod、MixinBuilder、Phase、Side、TargetedMod |
mixin 声明与门控 |
| GTN Mixins | IEarlyMixinLoader |
coremod 的早期 mixin 加载接口 |
| MixinExtras | com.llamalad7.mixinextras.sugar.Local |
仅 S26 mixin 的 @Local 局部变量捕获 |
| Mixin / ASM | org.spongepowered.asm.mixin.*、org.spongepowered.asm.lib.* |
注入注解与字节码树改写 |
注意 org.spongepowered.asm.mixin(Mixin 框架)与 org.spongepowered.asm.lib
(Forge 捆绑的 ASM 5 树 API,仅 转换器链 使用)是两个不同的
包,不要混淆。
没有任何 NEI / REI / JEI 集成,也没有任何其他 mod 的 API 调用。
对外扩展面
其他 mod 接入 Foundation 的方式只有一条:实现 api 包下的接口并注册。
| 扩展点 | 类型 | 位置 |
|---|---|---|
| chunk 数据扩展 | ChunkPacketHandler(3 方法) |
com.gtnewhorizons.foundation.api |
| 单方块数据扩展 | BlockPacketHandler(2 方法) |
com.gtnewhorizons.foundation.api |
| 数据载体 | BlockPacketInfo |
com.gtnewhorizons.foundation(根包,不在 api 包内) |
| 注册入口 | HandlerRegistry.registerChunkPacketHandler / registerBlockPacketHandler |
根包 |
api.FoundationHandler 是一个空接口(零方法),全仓库除其自身定义外无任何
引用——是预留的标记接口,未被接线。
构建期开关
| 属性 | 值 | 兼容性含义 |
|---|---|---|
containsMixinsAndOrCoreModOnly |
false |
本 mod 同时有普通 @Mod 类(Foundation)与 coremod,不是纯基础设施包 |
usesMixins |
true |
自动引入 UniMixins 作为必需依赖 |
forceEnableMixins |
false |
不会为依赖本 mod 的其他 mod 顺带开启 mixin |
mixinsPackage |
mixins |
mixin 越出该包构建即失败 |
mixinPlugin |
(空) | 无自定义 IMixinConfigPlugin,即无 per-mod 动态开关 |
separateMixinSourceSet |
(空) | mixin 与主源码同编译单元 |
accessTransformersFile |
(空) | 不用 AT |
usesShadowedDependencies |
false |
不打包任何依赖 |
excludeWellKnownRepositories |
(空) | CurseMaven / Modrinth 仓库均启用 |
modrinthRelations / curseForgeRelations |
(空) | 未声明任何可选/不兼容依赖关系 |
数值
| 数值 | 值 |
|---|---|
| 硬依赖数 | 1(gtnhlib@[0.6.22,)) |
| 逐 mod 条件分支数 | 0 |
TargetedMod.VANILLA 组数 |
2 / 2 |
excludedMods 条目数 |
0 |
applyIf 非恒真的组数 |
0 |
Phase.LATE 的 mixin 数 |
0 |
被 @Overwrite 覆盖的原版方法数 |
8 |
| 第三方库种类数 | 4(GTNHLib、GTN Mixins、MixinExtras、Mixin/ASM) |
| 声明的其他 mod 依赖关系 | 0 |