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 条目是给模组作者用的编程接口, 玩家在游戏中观察不到任何直接效果。

加载期机制

依赖

依赖 版本 用途
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。