通用配置(General)

基本信息

属性 值
分类 General(BetterCrashesConfig.GENERAL)
配置项数 6
生效侧 仅客户端(BetterCrashes.java:20-21 在 Side.CLIENT 才 init)

全部配置项

键 类型 默认值 取值范围 说明
crashLogLimitClient int 30 0 – Integer.MAX_VALUE 每次启动客户端最多生成的崩溃日志数
crashLogLimitServer int 30 0 – Integer.MAX_VALUE 每次启动最多生成的崩溃日志数(对应集成服务器崩溃)
crashLogPasteService String mclo.gs — 上传服务名;注释明确「目前只支持 mclo.gs」
issueTrackerURL String ""(空) — 问题追踪链接;非空时界面才显示「Open bug tracker」按钮
unsupportedMods String[] [](空) — 整合包不正式支持的 modid 列表
stacktraceDeobfuscation boolean true — 用 MCP 映射反混淆原版方法名,让堆栈可读

崩溃日志限流

crashLogLimitClient / crashLogLimitServer 是核心防刷机制。 MinecraftMixin.betterCrashes$shouldGenerateCrashLog()(:421-424):

return clientCrashCount <= crashLogLimitClient
    && serverCrashCount <= crashLogLimitServer;

超过阈值后仍然显示崩溃界面,只是不再往磁盘写 txt。 界面会改显 paragraph6 / paragraph7 (“Number of crash logs exceeded limit and log was not generated.” / “Limit can be changed via config.”)。

两个计数器是 MinecraftMixin 的 @Unique 实例字段,每次游戏启动重置为 0, 所以阈值是「每次启动」而非「永久」。

unsupportedMods 的额外行为

GuiProblemScreen.getUnsupportedMods()(:294-309)会:

  1. 遍历已装 mod,取出 modid 命中 unsupportedMods 列表的,加显示名进列表
  2. 无条件追加 "Optifine"(若 FMLClientHandler.hasOptifine() 为真)

⇒ OptiFine 永远出现在「本整合包不正式支持」一栏,且无法通过配置关闭。 界面会提示玩家在提交报告时一并提及这些 mod。

源码核对(2026-10-01 审计)

  • ⚠️ 默认值取自错误来源的高发点(已订正): BetterCrashesConfig.java:20 写的是 public static boolean stacktraceDeobfuscation = false; —— 字段初始化值是 false;但 :56-60 的 config.getBoolean("stacktraceDeobfuscation", GENERAL, true, ...) 默认值是 true,且 syncConfig() 在 preInit 无条件执行, 会立刻用 true 覆写该字段。 ⇒ 实际默认值 = true。字段初始化的 false 是从未生效的死值, 照抄字段声明会写错。
  • ⚠️ syncConfig() 中 crashLogLimitClient 等没有写回同名字段之前的前置检查, 但所有 6 项都做了 config.hasChanged() → save(),配置会在首次运行时落盘。
  • ⚠️ unsupportedMods 用 Arrays.asList(...) 包装 config.getStringList(...)(:50-55)⇒ 返回的是固定长度 List, 若将来有代码调用 .add()/.remove() 会抛 UnsupportedOperationException。 当前源码无此类调用,暂不触发。
  • 本 mod 无任何方块/物品/实体/配方,配置项是它唯一的可调面。