ForgeAmidst

基本信息

属性 值
类名 sedridor.forgeamidst.ForgeAmidst
文件 src/main/java/sedridor/forgeamidst/ForgeAmidst.java
modid forgeamidst
启用版本 Minecraft 1.7.10

⚠️ modid ≠ 分类名

分类名是 amidstgtnh,而真实 modid 是 forgeamidst —— 两者完全无关。 仓库名带 GTNH 后缀只是因为这是 GTNH 维护分支。

modid 的两个独立来源互相印证:

来源 值
@Mod(modid = "forgeamidst", …)(ForgeAmidst.java:44) forgeamidst
gradle.properties:9 modId = forgeamidst forgeamidst
资源域 assets/forgeamidst/biome forgeamidst

@Mod 声明

@Mod(
    modid = "forgeamidst",
    name = "ForgeAmidst",
    version = "1.7.10-1.4-beta",
    dependencies = "after:climatecontrol;after:RTG")
public class ForgeAmidst {
字段 值 备注
modid forgeamidst
name ForgeAmidst ⚠️ 与 gradle.properties 的 modName = ForgeAmidst-GTNH 不一致
version 1.7.10-1.4-beta ⚠️ 字面量,非占位符
dependencies after:climatecontrol;after:RTG 两条都是软顺序依赖

⚠️ dependencies 用的是 after:(软),不是 required-after:。 即缺 ClimateControl 或 RTG 不会导致启动失败 —— 只是走不到兼容分支(见 BiomeProviderRTG)。 README 也说「Intended to be used together with ClimateControl and RTG… However, Amidst also works on RWG」。

⚠️ version 是源码字面量 1.7.10-1.4-beta, 这在本仓属于少数派 —— 对比 UniMixins 那边几乎全是占位符。 但 mcmod.info 里的 ${modVersion} 仍是占位符(见该条目)。

@Mod.Instance 与静态状态

@Mod.Instance("forgeamidst")
private static ForgeAmidst instance;

持有大量静态字段:客户端 mc、MinecraftServer server、World world、 GenLayer biomeGen、GenLayer biomeIndexLayer、long seed、 Object climatecontrol、Object dimensionManager, 以及两个布尔 climateControlFound / rtgFound。

⚠️ climatecontrol 声明为 Object 而非具体类型 —— 即编译期不依赖 ClimateControl,靠运行期 getModInstance("climatecontrol") 反射取。 这与 after: 软依赖一致。

生命周期(4 个 @Mod.EventHandler)

阶段 处理
preInit 取客户端 Minecraft 实例;`mcDataDir = 事件配置目录的父目录
init 注册 EVENT_BUS + TERRAIN_GEN_BUS;探测 climatecontrol / RTG;注册 TickHandler 及其快捷键
serverStarting event.registerServerCommand(new CommandAmidst())
serverAboutToStart 若 server != null:停服、清空 DimensionManager 第 0 维、通知 ClimateControl / RTG serverStopped

实现要点

  • init 中 同时注册 MinecraftForge.EVENT_BUS 和 MinecraftForge.TERRAIN_GEN_BUS —— 后者用于地形生成相关挂钩。
  • 环境探测:Loader.isModLoaded("climatecontrol") → getModInstance("climatecontrol"); Loader.isModLoaded("RTG") → 只置 rtgFound = true(不取实例)。 ⚠️ 两者探测方式不同:ClimateControl 取实例并 catch (NoClassDefFoundError), RTG 只记布尔。
  • preInit 里 mcDataDir 取的是 getModConfigurationDirectory().getParentFile(), 即游戏根目录(因为 config/ 的父级),不是 config/ 本身。

关联