崩溃界面(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 列表。