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)

功能

两层含义:

  1. 配置界面(DebugOverlayScreen)—— 用 F3+F6 打开一个列表,为每个调试读数选择显示模式并拖拽排序
  2. 读数本身(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 时该界面无法打开(其余功能不受影响)。

相关条目