崩溃界面(Minecraft crashed!)

基本信息

属性 值
类 vfyjxf.bettercrashes.utils.GuiCrashScreen → GuiProblemScreen
标题 bettercrashes.gui.crash.title = “Minecraft crashed!”
摘要 “Minecraft ran into a problem and crashed.”
触发 Minecraft.run() 主循环捕获异常后(MinecraftMixin.java:185-200)

这是 mod 的核心功能

崩溃后不退出游戏,而是回到主菜单继续玩(MinecraftMixin.betterCrashes$displayCrashScreen, :237-264)。崩溃瞬间会先执行 betterCrashes$resetGameState()(:280-315)把 游戏状态复位:临时清空 Minecraft.memoryReserve、调用 StateManager.resetStates()、 关闭网络连接、loadWorld(null)、停用光影、清空 scheduledTasks 队列, 最后 System.gc()。

按钮

id 文本(en_US) 出现条件 行为
0 Return to main menu 仅崩溃界面 mc.displayGuiScreen(new GuiMainMenu())
1 Open Crash Report 总是 用系统默认程序打开本地 txt 报告
2 Upload and copy link 总是 异步上传到粘贴站,成功后自动复制链接到剪贴板
3 Open bug tracker 仅当 issueTrackerURL 非空 浏览器打开该 URL

⚠️ id 0 是 GuiCrashScreen 额外加的(GuiCrashScreen.java:28-35), 基类 GuiProblemScreen 只有 1/2/3。

排版常量

常量 值 作用
MAX_MOD_LIST_LINES 3 嫌疑 mod 列表最多 3 行,超出第 3 行末尾加 ...
MOD_LIST_WIDTH 310 列表与「不支持 mod」段的换行宽度
按钮行 Y min(height/4 + 132 + (行数-1)*行高, height - 24 - issueTracker偏移) 见 getButtonY()

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

  • ⚠️ keyTyped 被完全吞掉(GuiProblemScreen.java:165) protected void keyTyped(char typedChar, int keyCode) {} —— 空实现, 该界面不响应任何键盘操作,只能用鼠标点按钮。
  • ⚠️ Open Crash Report 在报告被限流时无意义:界面会改显 paragraph6 / paragraph7(“Number of crash logs exceeded limit…”) 说明没生成日志,但按钮 1 仍然存在、点击只会走到 CrashUtils.openCrashReport 的 report.getFile() == null 分支并返回 false。
  • drawScreen 首行 Tessellator.instance.draw() 被 catch (IllegalStateException ignored) {} 包裹(:178-180), 用于清理崩溃瞬间残留的未结束批次,属 VanillaFix 移植的兼容写法。
  • ⚠️ detectedUnsupportedModNames 在 drawScreen 中每帧检查是否需计算, 首次算完即缓存(:173-175),不会重复扫描 mod 列表。