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。

相关条目