F3+F6 调试叠层
基本信息
| 属性 | 值 |
|---|---|
| 打开方式 | 同时按住 F3 + F6(DebugOverlayKeyHandler.java:18-23) |
| 监听事件 | cpw.mods.fml.common.gameevent.InputEvent.KeyInputEvent(GTNHLib 事件总线,@EventBusSubscriber(side = Side.CLIENT)) |
| 配置界面类 | databack.client.debug.DebugOverlayScreen(@SideOnly(Side.CLIENT),185 行) |
| GUI 库 | ModularUI 2(com.cleanroommc.modularui.*,10 处 import,见 DebugOverlayScreen.java:9-18) |
| 配置文件 | <config>/databack/debug_overlay.json(CommonProxy.java:110-112,仅客户端) |
| 可管理读数数 | 7 |
| 默认显示模式 | 全部 OFF(7 个 @DebugOverlayEntry 均写 defaultMode = DisplayMode.OFF) |
功能
两层含义:
- 配置界面(
DebugOverlayScreen)—— 用 F3+F6 打开一个列表,为每个调试读数选择显示模式并拖拽排序 - 读数本身(
TagCommunicator)—— 7 个静态处理器订阅RenderGameOverlayEvent.Text,把诊断信息追加到 F3 叠层文本
显示模式
DebugOverlayRegistry.DisplayMode 三个枚举值(DebugOverlayRegistry.java:31-35):
| 模式 | 叠层内行为 | 界面提示文案 |
|---|---|---|
OFF |
完全禁用 | Off: disabled entirely |
IN_OVERLAY |
按下 F3 时显示 | In Overlay: shown when F3 is open |
ALWAYS |
不按 F3 也显示 | Always: shown even without F3 |
三种模式的前缀文案与列表项颜色见 DebugOverlayScreen.java:145-157:OFF 显示为 §c 红色,ALWAYS 为 §a 绿色,IN_OVERLAY 用列表默认色 0xFFDDDDDD。
底层数据由 DebugOverlayRegistry 维护:handlers、titles、descriptions、savedModes、defaultModes、savedOrder 六个 map/list(DebugOverlayRegistry.java:39-49),Gson 序列化(:37)。处理器标识符是 Mixin 反射后的可读 ID,格式为 ASM: some.package.ClassName methodName(descriptor)V(DebugOverlayRegistry.java:133-134)。
读数列表
7 个读数全部定义在 databack.common.tags.TagCommunicator(@EventBusSubscriber(side = Side.CLIENT)),并与 assets/databack/lang/en_US.lang 中的 7 组 lang key 一一对应。
| # | 方法 | 源码行 | lang key | 读出内容 |
|---|---|---|---|---|
| 1 | communicateBlockId |
TagCommunicator.java:30-46 |
databack.debug.block_id |
Legacy Block Id: + ProxyBlockRegistry.INSTANCE.getIdForObject(block),取 objectMouseOver 命中的方块(:37-44) |
| 2 | communicateBlockIdentity |
TagCommunicator.java:48-73 |
databack.debug.block_identity |
悬停方块的身份 ID 与变体名 |
| 3 | communicateBlockTags |
TagCommunicator.java:75-100 |
databack.debug.block_tags |
悬停方块所属标签 |
| 4 | communicateEntityId |
TagCommunicator.java:102-116 |
databack.debug.entity_id |
悬停实体的自动生成注册表 ID |
| 5 | communicateEntityTags |
TagCommunicator.java:118-140 |
databack.debug.entity_tags |
悬停实体所属标签 |
| 6 | communicateBiomeId |
TagCommunicator.java:142-152 |
databack.debug.biome_id |
当前群系的自动生成注册表 ID |
| 7 | communicateBiomeTags |
TagCommunicator.java:154-172 |
databack.debug.biome_tags |
当前群系所属标签 |
每个处理器方法体首行都是 if (!Minecraft.getMinecraft().gameSettings.showDebugInfo) return;(如 TagCommunicator.java:33),即必须已开启 F3 才输出。
界面布局
DebugOverlayScreen.create()(DebugOverlayScreen.java:50-77):
- 面板
new ModularPanel("databack:debug_overlay"),全屏、不可见、加半透明黑底DARK_BG(0x80000000,绘制前显式glEnable(GL_BLEND)+glBlendFunc(SRC_ALPHA, ONE_MINUS_SRC_ALPHA),注释说明 MUI2 不保证绘制面板背景时开启混合 ——DebugOverlayScreen.java:27-34) - 标题
TextWidget文本 Debug Screen Options,0xFFDDDDDD,top(20)水平居中 - 中部
SortableListWidget<String>,top(50),高度min(320, scaledHeight - 100),宽度min(500, scaledWidth - 40),逐行构建DebugOverlayRegistry.getKnownHandlers();onChange回调DebugOverlayRegistry::reorder实现拖拽排序(DebugOverlayScreen.java:60-68) - 每行左侧为名称
TextWidget(有 lang key 用IKey.lang,否则回退IKey.dynamic),悬停显示IKey.lang描述提示;右侧为宽 100 的ButtonWidget,文本为当前模式,点击调用DebugOverlayRegistry.cycleMode(handlerId) - 拖拽把手
DragHandleItem只接受光标位于nameW以左的拖拽,保证模式按钮的点击不被吞掉(DebugOverlayScreen.java:118-139) - 底部栏三个按钮(
DebugOverlayScreen.java:159-184):Default(setAll(IN_OVERLAY),120px)、Performance(setAll(OFF),130px)、Done(panel.closeIfOpen(),100px)
打开界面时先调用 DebugOverlayRegistry.applySavedOrder() 应用磁盘上的显式排序(DebugOverlayScreen.java:51)。
独立于该界面的物品提示读数
TagCommunicator.communicateItemTags(TagCommunicator.java:174-205)订阅 ItemTooltipEvent,但没有 @DebugOverlayEntry 注解,因此不进入 F3+F6 列表,也无法调显示模式。它在开启高级物品提示(event.showAdvancedItemTooltips)并按住 Shift(左右 Shift 均可)时,向物品提示追加:空行、Legacy Item Id: 、Item Identity: 、Item Variant: (仅当 itemIdentity.variant != null),以及 Item Tags: 与逐条 - <tag>(仅当标签集非空)。
依赖说明
DebugOverlayScreen 是全仓唯一使用 ModularUI 2 的文件:
grep -rln 'com.cleanroommc' src/main/java/
→ src/main/java/databack/client/debug/DebugOverlayScreen.java (仅 1 个文件)
但 com.cleanroommc / modularui 在 Databack 的 gradle.properties、dependencies.gradle、addon.gradle、build.gradle.kts、settings.gradle.kts 中全部 0 命中,在 GTNHLib 与 GTNHExtLib 的 dependencies.gradle 中同样 0 命中。因此 ModularUI 2 不是 Databack 自己在 gradle 中声明的依赖,而是运行时环境提供的。缺少 ModularUI 2 时该界面无法打开(其余功能不受影响)。
相关条目
- Databack 配置项 -
debug_overlay.json的位置 - 依赖与集成 - 依赖声明核实过程