CodeChicken 生态契约
基本信息
| 属性 | 值 |
|---|---|
| 定位 | 供其他模组编程的 API 与运行时期望 |
| 本模组 modId | CodeChickenCore(注意大写 C) |
| 典型消费方 | ForgeMultipart、EnderStorage、ChickenChunks、Translocator、NotEnoughItems |
功能
CodeChickenCore 自身不含任何游戏内容——它是一层「其他模组往上爬」的脚手架。本条目记录这份契约的两端:本模组对外提供什么,以及外部模组实际用了什么。
本模组侧:对外提供什么
| 类别 | 内容 | 条目 |
|---|---|---|
| coremod 变换框架 | ASM 文本 DSL、模块化转换器、混淆名映射、委托转换器槽 | ASM 工具包、DelegatedTransformer |
| 通用库 | 向量 / 颜色 / 光照 / 渲染 / 网络 / 容器 / 世界扩展 / 配置 | api/ 目录下其余 6 条 |
| 扩展点 | 接口默认实现注入 | DefaultImplementationTransformer |
| 事件 | CCCEventHandler 统计渲染时刻;WorldExtensionManager 桥接区块生命周期 |
客户端运行时与事件、世界与区块扩展 |
| 工具 | ClassDiscoverer 按父类/接口扫描已加载模组 |
本条目下文 |
ClassDiscoverer:生态发现机制
codechicken.core.ClassDiscoverer(:27)允许一个模组找出「所有实现了某接口或继承某父类的已加载 mod 类」——CodeChicken 家族用它来互相发现(例如让 EnderStorage 向 ChickenChunks 注册方块)。
| 方法 / 字段 | 行 | 说明 |
|---|---|---|
ClassDiscoverer(IStringMatcher, Class<?>... superclasses) |
:34-42 |
带文件名匹配器 |
ClassDiscoverer(Class<?>... superclasses) |
:44-46 |
匹配器为 test -> true(全匹配) |
findClasses() |
:48-55 |
触发扫描,异常包成 RuntimeException |
IStringMatcher |
— | 函数式接口,按文件名匹配 |
扫描逻辑:遍历 modClassLoader.getParentSources()(:85),对每个 jar/目录检查条目名是否匹配,命中后用 ASMHelper.createClassNode(bytes, SKIP_CODE) 读出不含方法体的类信息,校验其接口与父类是否命中 superclasses(:63-66),再用 Class.forName(classname, true, modClassLoader) 实际加载(:75)。
它会主动跳过已知的库与已加载的 coremod(:83-84,取自 modClassLoader.getDefaultLibraries() 与 CoreModManager.getLoadedCoremods()),并跳过 META-INF/versions/ 下的多版本 JAR 条目(:119)。
容错:addClass 用 catch (Throwable t) 捕获并记 error 日志(:77-79),单个类加载失败不影响整体扫描;扫描某个 zip 失败同样只记日志(:98-102)。
外部侧:FML 声明的依赖
CodeChickenCoreModContainer.getDependants() 硬编码 6 条版本约束(详见 CodeChickenCoreModContainer):
Forge@[10.13.3,)、NotEnoughItems@[1.0.5,)、EnderStorage@[1.4.7,)、ChickenChunks@[1.3.4,)、Translocator@[1.1.2,)、WR-CBE|Core@[1.4.1,)
这些在 dependencies.gradle 中没有一条对应声明——它们是运行时约束,不是构建依赖。
外部侧:真实消费证据
以下数据来自独立仓库 /Users/evlos/a/mirror/ForgeMultipart/,用于说明本 API 被怎样使用。ForgeMultipart 与本模组同属一个生态,但不在本条目所述的本仓内,其内容不在本 wiki 分类中。
消费方式:Gradle 显式依赖
ForgeMultipart/dependencies.gradle:4:
implementation("com.github.GTNewHorizons:CodeChickenCore:1.4.19:dev")
即引用 1.4.19 开发版(:dev classifier,取 jar 内的类),与本分类所引用的源码版本(tag 1.4.22)不是同一版本。
值得注意的一处依赖卫生问题(ForgeMultipart/dependencies.gradle:8-11):
devOnlyNonPublishable("com.github.GTNewHorizons:NotEnoughItems:2.8.114-GTNH:dev") {
exclude group: 'com.github.GTNewHorizons', module: 'CodeChickenCore'
}
NEI 依赖上显式排除了 CodeChickenCore,以确保使用第 4 行声明的那一份。
消费方式:import 频次
对 ForgeMultipart/src 下全部 .java 统计 import codechicken.*,属于本模组的 import 及其出现次数:
| import | 次数 |
|---|---|
codechicken.lib.vec.BlockCoord |
11 |
codechicken.lib.vec.Cuboid6 |
5 |
codechicken.lib.vec.Vector3 |
4 |
codechicken.lib.packet.PacketCustom |
4 |
codechicken.lib.packet.PacketCustom.IServerPacketHandler |
1 |
codechicken.lib.packet.PacketCustom.IClientPacketHandler |
1 |
codechicken.lib.raytracer.RayTracer |
1 |
codechicken.lib.raytracer.ExtendedMOP |
1 |
codechicken.lib.math.MathHelper |
1 |
codechicken.lib.inventory.InventoryUtils |
1 |
codechicken.lib.data.MCDataOutput |
1 |
codechicken.lib.data.MCDataInput |
1 |
即外部模组的高频依赖集中在**几何(vec)、网络(packet)、序列化(data)**三条线上。
一个易混淆点:codechicken.nei 不属于本模组
同一份 import 统计里还出现了:
| import | 次数 |
|---|---|
codechicken.nei.api.API |
1 |
codechicken.nei.api.IConfigureNEI |
1 |
codechicken.nei.ItemStackMap |
1 |
这三个类不在 CodeChickenCore 中。本仓 src/main/java/codechicken/ 下只有三个子包:core、lib、obfuscator(目录枚举核实),git ls-files 'src/main/java/codechicken/nei*' 命中 0 个文件。codechicken.nei.* 来自 NotEnoughItems(ForgeMultipart/dependencies.gradle:8 中声明为 devOnly)。
包名前缀 codechicken. 在本生态中被多个模组共用,不能据此判断类归属。
版本一致性
ForgeMultipart/gradle.properties 的 minecraftVersion = 1.7.10、forgeVersion = 10.13.4.1614 与本模组 gradle.properties:24、:27 完全一致。两者 modGroup 同为 codechicken(ForgeMultipart/gradle.properties:14),但这是各自的构建配置,并非同一 jar。
相关条目
- ASM 工具包 - 生态的基础层
- CodeChickenCoreModContainer - 6 条依赖声明的出处
- 网络与序列化 - 外部 import 频次最高的子系统之一
- 几何、颜色与数学库 -
BlockCoord使用最频繁