Coremod 引导(HodgepodgeCore)

基本信息

属性 值
类 com.mitchej123.hodgepodge.core.HodgepodgeCore
源文件 src/main/java/com/mitchej123/hodgepodge/core/HodgepodgeCore.java(209 行)
声明 @IFMLLoadingPlugin.MCVersion("1.7.10")(:39)
接口 IFMLLoadingPlugin(FML coremod)+ IEarlyMixinLoader(GTNHLib GTNHMixins)
变换器排除 @IFMLLoadingPlugin.TransformerExclusions({ "com.mitchej123.hodgepodge.core", "optifine" })(:40)
早期 Mixin 配置 mixins.hodgepodge.early.json(getMixinConfig(),:105-107)
关联 ASM 变换器、RetroFuturaBootstrap 插件、Mixin 系统

功能

HodgepodgeCore 是整个模组的引导点。它比 @Mod 类早得多实例化(FML 加载插件阶段),因此必须在此完成配置读取 —— 此时 config/hodgepodge.cfg 还不存在。

构造器做的事(HodgepodgeCore.java:47-102)

按顺序:

  1. 可选注册早期 transformer:若 EarlyConfig.noNukeBaseMod 为 false,手动 registerTransformer("…early.ModContainerFactoryTransformer")(:48-52)
  2. 注册 8 个配置类到 GTNHLib ConfigurationManager(:54-61)—— 注意这里包含 MemoryConfig,与 GUI 的 7 类不同
  3. 把 SoundConfig.outputDeviceManagement.enabled 写进 manageOutputDevicesAtStartup(:62)—— 这是 SoundConfig 中唯一标 @Config.Ignore 的字段的唯一赋值点
  4. NBT 字符串池化:若 enableTagCompoundStringPooling 或 enableNBTStringPooling 打开,调 StringPooler.setupPooler()(:63-65)
  5. 写黑板标志:若 FixesConfig.fixBottomFaceUV 打开,Launch.blackboard.put("hodgepodge.FixesConfig.fixBottomFaceUV", TRUE)(:66-68)—— 供其它 transformer 反查
  6. Bukkit / Thermos 探测(:74-81):getClassBytes("org.bukkit.World") 非 null 则打四行 WARN,提示当前是不支持的配置,且 ASMConfig.thermosCraftServerClass 可能需要手改
  7. CoFHCore 探测(:85-90):若 ASMConfig.disableCoFHAccessTransformer 打开且 cofh.CoFHCore 存在,置 replaceCoFHCoreAT = true
  8. 可选注册第二个早期 transformer:MemoryConfig.allocs.deduplicateASMDataTableStrings 打开时注册 ModCandidateTransformer(:93-97)
  9. 可选收窄 FML 排除:FixesConfig.fixForgeOptionalInterfaceSignature 打开时调 narrowFmlTransformerExclusion()(:99-101)

第 6、7 步的 catch (Exception ignored) {}(:81、:91)是探测式的:getClassBytes 找不到类时抛异常即代表「该模组不存在」,空 catch 是正确语义,不是被吞掉的失败。

injectData(:133-144)

FML 把启动数据交给 coremod 的时刻:

  • runtimeDeobfuscationEnabled → 存进静态 isObf(:134)
  • mcLocation → 调 VoxelMapCacheMover.changeFileExtensions(File)(:135),把 VoxelMap 缓存从 .zip 改名为 .data(对应 TweaksConfig.changeCacheFileExtension)
  • 往 Launch.blackboard 的 TweakClasses 列表追加 HodgepodgeLateTweaker;若 replaceCoFHCoreAT 再追加 CoFHCoreATDisablerTweaker(:137-143)

getAccessTransformerClass 的跨模组协调(:147-162)

这一步会修改 CoreTweaks 的运行期配置:若 makamys.coretweaks.Config 在类路径上且 TweaksConfig.threadedWorldDataSaving 打开,则调 Config.enhanceMapStorageErrors.disable() 并打 INFO 说明理由(:149-155)。

若 replaceCoFHCoreAT 为真,返回 com.mitchej123.hodgepodge.core.CoFHCoreAccessTransformer。

getModContainerClass() 与 getSetupClass() 均返回 null(:122-130)—— 本模组不提供这两者。

数值

静态状态 isObf 的三态语义

isObf()(:164-169)在被调用前若 isObf == null 会抛 IllegalStateException("Obfuscation state has been accessed too early!")。三处使用:

调用方 用途
commands/PacketStatsCommand.java:52 混淆环境取 SRG 字段名 field_150748_i,否则取 receivedPacketsQueue
commands/DumpTextureAtlasCommand.java 同类反射需求
静态方法 logASM(Logger, String)(:171-177) isObf == null || isObf 时打 DEBUG,否则打 INFO —— 混淆环境噪音大,降级为 DEBUG

narrowFmlTransformerExclusion 的收窄逻辑(:179-208)

FixesConfig.fixForgeOptionalInterfaceSignature 需要改写 FML 的 ModAPITransformer,但 FML 整包被 @TransformerExclusions 排除。该方法反射 LaunchClassLoader.transformerExceptions,把 cpw.mods.fml.common.asm.transformers. 一条换成 9 条具体类:

保留排除的 FML transformer
AccessTransformer
DeobfuscationTransformer
EventSubscriptionTransformer
ItemStackTransformer
MarkerTransformer
ModAccessTransformer
PatchingTransformer
SideTransformer
TerminalTransformer
  • 目标条目原本不在集合里 → 打 WARN %s not present in transformerExceptions - ModAPITransformer Signature patch will not apply(:198-200)
  • 任一步失败 → catch (Throwable t) 打 WARN,补丁不生效但游戏继续(:203-207)

相关条目