FoamFix

[!INFO] Git Commit: 见 relation.md | Minecraft 1.7.10 / Forge 10.13.4.1614-1.7.10

内存与稳定性优化 coremod。由 BugfixMod(williewillus)、Forkage(immibis) 与 FoamFix(asie)三条补丁线合并重打包而成。

简介

FoamFix(modid foamfix)是 1.7.10 的 coremod,同时是普通 mod:

  • 25 个字节码补丁(ASM tree API),全部由一个 IClassTransformer 登记。
  • @Mod 无 dependencies 字段 —— 不声明任何 mod 依赖。
  • JndiLookup 三重探测修复 Log4Shell;另有 BiblioRCE 修复。
  • 重打包 80 个文件的 Ears,提供 1.8+ 皮肤支持(体量最大子系统)。
  • 8 个客户端/服务端补丁会在专用服务器上被强制关闭并落盘。

版本与标识

项 值 来源
modid foamfix @Mod(modid = "foamfix")
name FoamFix @Mod(name = "FoamFix")
版本 1.0.3 build.properties: mod_version
MC 1.7.10 build.properties: minecraft_version
Forge 10.13.4.1614-1.7.10 build.properties: forge_version
@Mod version "@VERSION@" 构建期占位符,源码读不到

⚠️ build.properties 里写的是 mod_id=FoamFix(首字母大写), 而 @Mod 注解与 mcmod.info 都是全小写 foamfix。以 @Mod 为准。 分类名 foamfix17 的 17 来自仓库名 FoamFix17,不属于 modid。 MC 版本只存在于 build.properties(gradle.properties 为空)。

概念总览

概念 摘要 关联条目
加载插件 IFMLLoadingPlugin,SortingIndex 1001 FoamFix Core
补丁注册真源 25 个实例,三道条件闸门 BugfixMod Class Transformer
补丁基类 3 种注入模式 + 哨兵写法 Abstract Patcher
映射表 MCP ↔ SRG,仅混淆时填充 Mapping Registry
配置 foamfix.cfg,28 个键 BugfixMod Settings

Coremod 列表

核心与设置

补丁列表(按来源)

内存与运行时

安全

GhostBuster

客户端修复(会在专用服务器被强制关闭)

手感 tweak(默认关闭)

渲染与平台

补丁基础设施

Ears(1.8+ 皮肤)

  • Ears — 80 个文件的重打包子系统,@Mod 被注释掉
  • EarsAgent — 变换代理

代理

  • Proxy — ProxyClient / ProxyCommon

源码缺陷

  1. BugfixModClassTransformer.java:219 vs :507 + AbstractPatcher.java:48 —— 建表键为点号类名(replace('/', '.')),而 transform() 用 斜杠 transformedName 取表。静态阅读下按类定向的补丁恒不命中, 仅 globalPatchers 生效。待运行时核验(本 mod 长期使用,可能存在未包含的上游改动)。
  2. AbstractPatcher.java:111 —— successful ? "Applied transform!" : "Failed…" 三元在此恒为 true 分支(已在 if (!successful) 的 else 里),日志文案是死代码。
  3. FoamFixMod.java preinit —— 遗留两行 System.out.println 打印类路径; 对 sun.boot.class.path 的强转在部分启动器下会抛 ClassCastException 且未捕获。
  4. BugfixModClassTransformer.java:477-490 —— JndiLookup.class 输入流仅在 catch 分支关闭,正常路径泄漏(每次启动一次,影响有限)。
  5. 专用服务器降级会覆盖用户配置 —— BoatDesyncFix / HeartBlink / HeartFlash 被置 false 后立即 config.save() 落盘, 用户复制到客户端的配置文件会丢失原值。
  6. Log4JLoggerWrapperPatcher 是全局补丁 —— 目标类名为空串, 每个被加载的类都要跑一次 patch(),启动期开销显著。
  7. AbstractPatcher.patch 静默吞 NullPointerException(注释指向 LiteLoader), 真实故障也会被误吞并静默返回原字节。