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)
按顺序:
- 可选注册早期 transformer:若
EarlyConfig.noNukeBaseMod为 false,手动registerTransformer("…early.ModContainerFactoryTransformer")(:48-52) - 注册 8 个配置类到 GTNHLib
ConfigurationManager(:54-61)—— 注意这里包含MemoryConfig,与 GUI 的 7 类不同 - 把
SoundConfig.outputDeviceManagement.enabled写进manageOutputDevicesAtStartup(:62)—— 这是SoundConfig中唯一标@Config.Ignore的字段的唯一赋值点 - NBT 字符串池化:若
enableTagCompoundStringPooling或enableNBTStringPooling打开,调StringPooler.setupPooler()(:63-65) - 写黑板标志:若
FixesConfig.fixBottomFaceUV打开,Launch.blackboard.put("hodgepodge.FixesConfig.fixBottomFaceUV", TRUE)(:66-68)—— 供其它 transformer 反查 - Bukkit / Thermos 探测(
:74-81):getClassBytes("org.bukkit.World")非 null 则打四行 WARN,提示当前是不支持的配置,且ASMConfig.thermosCraftServerClass可能需要手改 - CoFHCore 探测(
:85-90):若ASMConfig.disableCoFHAccessTransformer打开且cofh.CoFHCore存在,置replaceCoFHCoreAT = true - 可选注册第二个早期 transformer:
MemoryConfig.allocs.deduplicateASMDataTableStrings打开时注册ModCandidateTransformer(:93-97) - 可选收窄 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)
相关条目
- ASM 变换器 -
getASMTransformerClass()返回的 9 个早期变换器 - RetroFuturaBootstrap 插件 - 另一条改写 Forge 内部的路线
- 早期配置 -
noNukeBaseMod等 3 个必须在 coremod 期生效的开关 - Mixin 系统 -
getMixins返回的 274 个 EARLY 条目