兼容性与门控

基本信息

属性 值
类型 依赖声明、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

相关条目