Skip to content

Fix creative section rendering 修复创造栏分区显示与提示框层级(1.21.8) - #156

Merged
PigeonNian merged 1 commit into
Anvil-Dev:dev/1.21.8from
WhereisFff:codex/1.21.8-section-5315
Oct 20, 2026
Merged

PigeonNian merged 1 commit into
Anvil-Dev:dev/1.21.8from
WhereisFff:codex/1.21.8-section-5315

Conversation

@WhereisFff

Copy link
Copy Markdown
Contributor

fix(registrum): 修复创造栏分区显示与提示框层级

  • 在配方查看器绘制前景前绘制创造栏分区,避免配方收藏预览导致分区消失
  • 移除分区额外的渲染高度与层级提升,防止遮挡配方查看器提示框
  • 保留分区悬停提示、长文本滚动及变体选择交互

- 在配方查看器绘制前景前绘制创造栏分区,避免配方收藏预览导致分区消失
- 移除分区额外的渲染高度与层级提升,防止遮挡配方查看器提示框
- 保留分区悬停提示、长文本滚动及变体选择交互
@Gugle2308

Copy link
Copy Markdown

代码审查摘要 — PR #156

操作: opened(PR 现在为 open 状态,head 68483fe9;本次审查对应的就是该 head,审查期间未发生变动)
范围: 2 个文件(2 Java / 1 新增 + 1 修改)/ 92 行 diff
仓库: Anvil-Dev/AnvilLib,codex/1.21.8-section-5315 → dev/1.21.8

改动本质:把「创造栏分区」的绘制从 renderTooltip()(末尾、且带 nextStratum() 提层)移到 ContainerScreenEvent.Render.Foreground(HIGHEST)+ 去掉分区提层 + 用 mixin 声明式接口(interface)把 CreativeModeInventoryScreen 暴露给监听器。

✅ 已核对成立的部分(不是凭印象,逐项对过源码)

核对项 结论
事件时机 NeoForge 21.8.53 ContainerScreenEvent.Render.Foreground 的 javadoc 原文:“Fired after the container screen's foreground layer and elements are drawn, but before rendering the tooltips and the item stack being dragged… intended for content that should be below tooltips”。正是分区需要的层级 ✔
pose 补偿 NeoForge 1.21.x 对 AbstractContainerScreen 的 patch 里,该事件 post 在 pose().popMatrix() 之前(...post(new ContainerScreenEvent.Render.Foreground(this, guiGraphics, mouseX, mouseY)); p_418314_.pose().popMatrix();)⇒ 触发时 pose 已平移 (leftPos, topPos);而分区代码用绝对屏幕坐标(bannerX = this.leftPos + anvillib$GRID_LEFT - 1)⇒ 新监听器里 translate(-guiLeft, -guiTop) 是必要且方向正确的,等价于旧调用点 renderTooltip 时的 identity pose ✔
API 存在性 getGuiLeft()/getGuiTop() 是 NeoForge 给 AbstractContainerScreen 新增的 public 访问器(同 patch 内 public int getGuiLeft() { return leftPos; });getMouseX()/getMouseY() 传的就是 render 传入的原始屏幕坐标 ✔ 命中检测与旧行为一致
时序(提示框不丢) 事件 → renderTooltip,hoveredSection 先算、renderTooltips 后读 ✔;hoveredSlot = null 也在 super.renderTooltip 之前生效,槽位提示仍被正确抑制 ✔
无重复绘制/残留 旧调用点已删;nextStratum() 在分区路径上仅此一处,已移除 ✔
modid anvillib_registrum 与 module.registrum/gradle.properties 的 mod_id 一致 ✔;Dist.CLIENT 由 FML 按 ASM 元数据过滤,专用服务器不会加载该类(无 NoClassDefFoundError 风险)✔
implements 合并 与本项目 interface_injection=false 无关(那是 NeoForge interfaceInjectionData/Parchment 通道),mixin 声明式加接口本身无需该开关 ✔

⚠️ 警告 / 需要作者确认

  1. 变体选择器这一半没修,仍是「提层覆盖提示框」的状态。 CreativeVariantPickerOverlay 里还有 3 处 nextStratum()(:84 render、:125 renderTooltip、:153 renderCarriedItem),且它依旧在 renderTooltip() 中绘制(在 super.renderTooltip 之前但已提层)。PR 标题里的“提示框层级”只处理了分区;如果变体选择器同样会盖住配方查看器的提示框,这里的问题依旧存在——建议一并处理,或在 PR 里说明变体选择器为何必须提层。
  2. 修复成立的前提是查看器在 Foreground 且优先级低于 HIGHEST。 若目标查看器(JEI/REI/EMI)实际在 ScreenEvent.Render.Post 或更晚绘制,分区仍会被盖住(改动无效);反过来,先画分区意味着查看器前景(收藏预览等)现在会盖在分区横幅的重叠区上。请注明验证用的查看器与版本,并贴 before/after 截图。
  3. 去提层后靠提交顺序压住物品格。 banner blit 与物品/槽位绘制现在共享同一 stratum,建议确认(截图)横幅仍完整遮住物品格、悬停文字在物品之上——这是 nextStratum 原本顺手保证的东西。
  4. HIGHEST 优先级在这里是功能性的(必须早于查看器),不是性能微调;同时 hoveredSection 依赖“事件早于 tooltip”这一 NeoForge 契约——将来若有人把监听器挪到 Render.Post,提示框会静默消失且无编译错误。建议各加一行注释固化这两个前提。

💡 建议

  • 新包 ...registrum.client 缺 package-info.java:仓库其余每个包都有 @NullMarked(如 client/gui/package-info.java),jspecify 的 @NullMarked 不向下继承,建议补一个以保持空值标注一致。
  • 嵌套接口名 Renderer 易与 1.21.5+ 新增的 net.minecraft.client.gui.render.Renderer 混淆,建议改名 SectionRenderHost 之类。
  • modid = "anvillib_registrum" 是字面量:一旦改 mod id,监听器会静默不注册、分区直接消失(无报错)。建议抽常量(仓库目前没有 MOD_ID,可顺手加在 Registrum/AbstractRegistrum)。
  • 接口方法名保留了 anvillib$ 前缀(原 @Unique 命名惯例),作为暴露给外部实现的接口方法,语义命名会更友好;renderTooltip() 里也可加注释说明分区为何迁出,防止后人又加回去。

🟢 看起来不错

  • 事件选型完全命中 NeoForge 官方意图(“below tooltips and the dragged stack”),比分区间自造 z 层级更稳。
  • pose 补偿方向与坐标空间已核实一致,pushMatrix/popMatrix 用 try/finally 包住。
  • 用「mixin 声明接口 + 静态监听器」代替改 mixin 注入点,改动面最小,也不新增 mixin 配置项;@Override 让编译期即可发现接口与实现不一致。
  • 分区悬停判定、长文本滚动、变体选择原有路径逻辑未被改动。

🧪 手工验证清单(建议写进 PR)

场景 期望
开启 JEI/REI 收藏预览 + 悬停分区 分区横幅可见、不被收藏预览抹掉
悬停分区 1s 以上 分区提示框正常出现且在最上层
变体选择器打开 + 悬停其内物品 有提示框、不被选择器盖住(对应警告 1)
按住物品拖拽跨过分区 拖拽物在分区之上
长文本分区 滚动/截断显示正常

结论: COMMENT(建议合并,非阻塞) — 机制与坐标/时序核对全部成立,主要缺口是「变体选择器仍提层」和「查看器优先级前提未写明」。标题已准确(英文 + 中文),无需修改。


由 Hermes Agent 审查(对应 head 68483fe9)

@Gugle2308

Copy link
Copy Markdown

💾 Self-improvement review: Patched references/gui-render-phase-pose-and-zdepth.md in skill 'menu-widget-interaction-pr-review' (1 replacement). · Patched SKILL.md in skill 'menu-widget-interaction-pr-review' (1 replacement).

@PigeonNian
PigeonNian merged commit 19fd580 into Anvil-Dev:dev/1.21.8 Oct 20, 2026
42 checks passed
@Gugle2308

Copy link
Copy Markdown

PR #156 的状态为 closed:按照 webhook 审查约束,此时无需发布审查意见,因此跳过。

如果我仍需要可选地把这份已关闭 PR 的 diff 留档分析,或者要复核已合并的改动,请把操作类型改为 synchronize 或 opened 再触发。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants