Skip to content

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

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

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

Conversation

@WhereisFff

Copy link
Copy Markdown
Contributor

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

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

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

Copy link
Copy Markdown

代码审查摘要 — PR #154 Fix creative section rendering 修复创造栏分区显示与提示框层级(1.21.1)

审查基线:head d4dbd10(refs/pull/154/head,期间未前进),base dev/1.21.1 @ 0f817d4;diff 校验 md5 8eaf3eb4… 两次抓取一致,新文件 blob 9a768e23 与 diff index 行吻合。
范围:2 个文件(2 Java,1 新增,0 删除)/ +37 −19 行,没有 ghost 文件、没有 \ No newline。


🟢 核心机制核对(已用权威源码取证,非推测)

核对项 结论 证据
ContainerScreenEvent.Render.Foreground 在 NeoForge 21.1.226 存在且 getter 齐全 ✅ neoforge-21.1.226-sources.jar → ContainerScreenEvent.java:getGuiGraphics()/getMouseX()/getMouseY(),Foreground 注释明确「在 foreground 元素之后、tooltip 与鼠标拖拽堆之前」
事件触发位置 ✅ 正是需要的时机 NeoForge 1.21.1 分支 AbstractContainerScreen.java.patch:事件贴在内层 pushPose(); translate(leftPos, topPos, 0) 块内、renderLabels 之后、拖拽物品块之前,块外才 popPose,且 RenderSystem.disableDepthTest() 全程有效
translate(-guiLeft, -guiTop) 是否是正确补偿 ✅ 精确逆运算 段落代码用的是绝对坐标(bannerX = this.leftPos + GRID_LEFT - 1、mouseX 绝对比较),而事件时 pose 已被 vanilla 平移 (leftPos, topPos);因此这里的负向平移把坐标系还原成绝对坐标,逻辑无需改动,数学正确
删除 BANNER_Z = 200 是否安全 ✅ 等价 旧注入点(super.render() 返回后)depth test 已被重新启用,故 z=200 既压过物品图标也压过 tooltip/配方查看器面板(正是描述第 2 条的症状);新注入点 depth test 关闭,z 不再参与遮挡判定,只靠绘制顺序,删掉它不会让横幅被本行物品盖住
hoveredSlot = null 是否仍然生效 ✅ 事件在 renderTooltip 之前触发,而 tooltip 是否绘制由 AbstractContainerScreen#renderTooltip 读 this.hoveredSlot 决定;清空时机仍在其之前 → 分区悬停时物品 tooltip 照旧被抑制
变体叠加层与分区 hover 的先后 ✅ 顺带修掉一个潜在隐患 anvillib$renderVariantOverlay 仍注入在 renderTooltip 的 INVOKE 前,现在一定在分区绘制之后执行,其 hoveredSection = null 不会被分区绘制覆盖(旧代码两个 @Inject 落在同一注入点,先后顺序取决于注册顺序)
modid "anvillib_registrum" ✅ 能真正注册 与 module.registrum/gradle.properties 的 mod_id=anvillib_registrum 一致;Dist.CLIENT 也保证这个引用 client-only 类的监听器不会进入专用服务器类校验路径(避免 NoClassDefFoundError 类启动崩溃)
Mixin 实现接口 ✅ 合法 mixin 声明 implements 会给目标类加上接口,anvillib$renderSections 为 public 且带 anvillib$ 前缀,无 refmap/命名冲突问题

另外值得肯定:分区绘制从「renderTooltip 之前」提前到 foreground 阶段后,会自然落到拖拽中的物品栈之下(原来会盖住鼠标上拿着的物品),层级语义更正确。


⚠️ 建议(非阻塞)

  1. module.registrum/.../client/ 缺 package-info.java — 该模块其它每个包(client/gui、mixin、mixin/client、util、builders/*…)都带
    @javax.annotation.ParametersAreNonnullByDefault + @MethodsReturnNonnullByDefault + @FieldsAreNonnullByDefault。
    本类是该包的第一个文件,包级空值默认注解因此缺失,与全模块约定不一致。建议随 PR 补一个 client/package-info.java。

  2. modid 硬编码 vs 仓库约定 — 全仓库其它模块统一写 @EventBusSubscriber(modid = XxxLib.MOD_ID, ...),只有这里写字符串字面量。module.registrum 目前没有 @Mod 类/MOD_ID 常量,建议补一个 Registrum.MOD_ID(或常量持有类)后引用它。这不是风格洁癖:@EventBusSubscriber 的 modid 不匹配时是静默不注册(无任何日志/异常),分区会整体消失且极难排查,把 id 收敛成一个常量能避免后续改 mod_id 时漏改。

  3. 格式化风格 — 新文件用同行 {,而被修改的 mixin 及模块内其余代码用独立行 {(Allman)。建议与周围代码对齐。

  4. Renderer 缺少契约说明 — 这个接口是整个改动最不直观的一环:实现方必须按绝对 GUI 坐标绘制,因为监听器会抵消容器屏幕的 pose 平移。建议在接口 javadoc 上写明,否则以后新增实现者很容易自己再叠一次 leftPos/topPos 偏移。

  5. EventPriority.HIGHEST 的边界 — 只有在其它前景监听器优先级更低时才保证「先画」;若某配方查看器也用 HIGHEST,实际顺序取决于注册顺序。现有注释已表达意图,可接受,仅提示。


📋 声称验证表

声称 状态 依据
在配方查看器绘制前景前绘制分区,避免分区消失 ✅ 机制成立 事件早于所有 HIGHEST 以下的 foreground 监听器;同时 depth test 关闭后 z 不再造成异常层叠
移除额外渲染高度与层级提升,防止遮挡配方查看器提示框 ✅ BANNER_Z 声明与唯一使用点均已删除,全文件无残留引用(grep 无命中),且新阶段 z 无意义
保留分区悬停提示、长文本滚动及变体选择交互 ✅ anvillib$renderTooltips(AFTER renderTooltip)、renderBannerText 的滚动分支、mouseClicked/keyPressed/mouseScrolled 注入与 hoveredSlot 托管均未改动;hoveredSection 写入点仍在 tooltip 读取之前

结论: COMMENT(可合并,建议顺手补 1、2 项) — 未发现逻辑或层级上的缺陷:坐标补偿与 vanilla pose 精确互逆,z 提升的删除在当前 depth test 关闭的阶段是等价变换,交互路径完整保留。剩余问题集中在包级注解缺失、modid 常量化与格式一致性,均不阻塞。

🧪 测试建议

被测目标 场景 优先级
分区渲染层级 装 JEI/EMI,展开配方书签预览、悬停配方条目,确认横幅不消失、不压住配方 tooltip 🔴
z 提升移除 横幅所在行的物品图标是否仍被横幅正确覆盖(painter order 而非深度) 🔴
tooltip 互斥 悬停分区 vs 悬停物品格,确认只出一个 tooltip;打开变体选择器时分区 tooltip 让位 🟡
长文本滚动 首行溢出文案在悬停时滚动、非悬停时截断 🟡
拖拽物品 手持物品栈横过分区行,物品栈需在横幅之上 🟢
专用服务器 启动确认无 NoClassDefFoundError(Dist.CLIENT 生效) 🟢

备注:PR 标题已是 <英文> <中文> 格式且描述准确,无需修改;本次 gh 登录态失效(token invalid),故未执行 gh pr edit。


由 Hermes Agent 审查

@Gugle2308

Copy link
Copy Markdown

💾 Self-improvement review: Patched SKILL.md in skill 'menu-widget-interaction-pr-review' (1 replacement).

@PigeonNian
PigeonNian merged commit 397b2be into Anvil-Dev:dev/1.21.1 Oct 20, 2026
41 checks passed
@Gugle2308

Copy link
Copy Markdown

PR #154 的事件类型是 closed,命中了该技能第 1 条硬约束:操作类型为 closed 或 labeled 时立即停止,不发布评论。

因此按照该约束:

  • 未下载 diff,也未做代码分析
  • 未执行任何 gh pr review、gh pr comment 或其他发表评论的或修改操作
  • 未触碰任何凭据导出

如果这个 PR 之后被重新打开(reopened)或被标记为 ready_for_review,请再触发一次,我会按完整流程审查「创造栏分区渲染 + 提示框层级」这部分改动。

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