Forgelin
[!INFO] Git Commit:
f346204| Updated: 2026-10-01(回源码审计)
modid:forgelin(来自 Forgelin.kt:14 const val MOD_ID = "forgelin",
作为实参传入 Forgelin.kt:11 的 @Mod(modid = Forgelin.MOD_ID, ...))
显示名: Forgelin(Forgelin.kt:15 const val NAME = "Forgelin")
mcmod.info 描述: Kotlin helper library for Forge. Minecraft 1.7.10 Port
语言适配层模组(core mod)。 面向的是 Kotlin mod 作者而不是普通玩家: 它自身不提供任何方块、物品、实体、群系、维度或世界生成, 全部能力是让别的 Kotlin mod 能在 1.7.10 上正常工作。
源码共 7 个 .kt 文件(注意:全部是 Kotlin,没有一个 .java)。
定位是 1.7.10 的 Kotlin 移植版 —— 原始 Forgelin 面向 1.12,
mcmod.info 的 credits 写明 “Emberwalker, for the original Forgelin,
shadowfacts for the fork”。
关键设计
Forgelin 同时扮演三个角色,由三个不同的类承担:
| 角色 | 类 | 作用 |
|---|---|---|
| core mod 加载插件 | preloader/ForgelinPlugin |
ASM transformer 为空,只负责早期钩子 |
| 预载钩子 | preloader/ForgelinSetup |
类加载前预热 KotlinAdapter |
| FML 语言适配器 | api/KotlinAdapter |
让 FML 接受 Kotlin object 作为 @Mod 类 |
| PreInit 修正器 | api/ForgelinAutomaticEventSubscriber |
撤销并重建事件订阅 |
游戏内机制
本 mod 没有任何游戏内可交互内容。下列 API 条目是给模组作者用的编程接口, 玩家在游戏中观察不到任何直接效果。
- Kotlin 语言适配器 -
ILanguageAdapter实现,支持 Kotlinobject作@Mod类 - EventBusSubscriber 注解 - 1.12.2 版注解在 1.7.10 的 Kotlin 复刻
- 自动事件订阅器 - PreInit 阶段撤销错误的静态注册并重注册
- Dispatchers.MinecraftServer - 服务器主线程协程调度器,硬依赖 GTNHLib
加载期机制
- ForgelinPlugin 加载入口 - core mod 插件,声明
@MCVersion("1.7.10") - ForgelinSetup 预载钩子 - 预载
KotlinAdapter,call()返回null
依赖
| 依赖 | 版本 | 用途 |
|---|---|---|
org.jetbrains.kotlinx:kotlinx-coroutines-core |
1.10.1 | CoroutineDispatcher(shadow 打包) |
org.jetbrains.kotlinx:kotlinx-coroutines-jdk8 |
1.10.1 | 同上 |
GTNHLib (gtnhlib) |
运行期检测 | ServerThreadUtil,仅 Dispatchers.MinecraftServer 需要 |
dependencies.gradle 使用 shadowImplementation 打包协程库;
gradle.properties 的 usesShadowedDependencies = true。
已知源码问题
- 失败范围被放大:
ForgelinAutomaticEventSubscriber.kt:76-79捕获Throwable后打日志再throw Exception(e)。任一 mod 的订阅者类加载失败, 会让 Forgelin 整个 PreInit 抛异常,波及所有使用KotlinAdapter的 mod, 源码未做 per-mod 隔离。 - 静默早退:
ForgelinAutomaticEventSubscriber.kt:28的?: return与ForgelinSetup.kt:12的loader?.loadClass(...)在异常路径上都不打日志, 排障时无迹可循。 KotlinAdapter.setProxy可能 NPE:KotlinAdapter.kt:29把proxyTarget.kotlin.objectInstance直接作为Field.set的目标对象, 未判空;若被代理的@Mod是普通class(objectInstance为null)则抛 NPE。- 依赖反射访问 FML 内部结构:
ForgelinAutomaticEventSubscriber.kt:110-111对ModAnnotation.EnumHolder.value做setAccessible(true), FML 内部类结构变化会直接导致失效。
本 mod 没有的内容(源码核实)
registerBlock、registerItem、registerEntity、registerTileEntity、
addCommand、keyBinding、Enchantment、BiomeGen、WorldProvider、
Potion 在 src/main/kotlin 下各 0 命中;无 extends Block / Item / Entity 类;
getASMTransformerClass() 返回 arrayOfNulls(0),即不修改任何字节码。
唯一资源文件是 src/main/resources/mcmod.info。