Repository navigation
Fix creative section rendering 修复创造栏分区显示与提示框层级(1.21.1) - #154
Conversation
- 在配方查看器绘制前景前绘制创造栏分区,避免配方收藏预览导致分区消失 - 移除分区额外的渲染高度与层级提升,防止遮挡配方查看器提示框 - 保留分区悬停提示、长文本滚动及变体选择交互
代码审查摘要 — PR #154
|
| 核对项 | 结论 | 证据 |
|---|---|---|
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 阶段后,会自然落到拖拽中的物品栈之下(原来会盖住鼠标上拿着的物品),层级语义更正确。
⚠️ 建议(非阻塞)
-
module.registrum/.../client/缺package-info.java— 该模块其它每个包(client/gui、mixin、mixin/client、util、builders/*…)都带
@javax.annotation.ParametersAreNonnullByDefault + @MethodsReturnNonnullByDefault + @FieldsAreNonnullByDefault。
本类是该包的第一个文件,包级空值默认注解因此缺失,与全模块约定不一致。建议随 PR 补一个client/package-info.java。 -
modid 硬编码 vs 仓库约定 — 全仓库其它模块统一写
@EventBusSubscriber(modid = XxxLib.MOD_ID, ...),只有这里写字符串字面量。module.registrum目前没有@Mod类/MOD_ID 常量,建议补一个Registrum.MOD_ID(或常量持有类)后引用它。这不是风格洁癖:@EventBusSubscriber的 modid 不匹配时是静默不注册(无任何日志/异常),分区会整体消失且极难排查,把 id 收敛成一个常量能避免后续改mod_id时漏改。 -
格式化风格 — 新文件用同行
{,而被修改的 mixin 及模块内其余代码用独立行{(Allman)。建议与周围代码对齐。 -
Renderer缺少契约说明 — 这个接口是整个改动最不直观的一环:实现方必须按绝对 GUI 坐标绘制,因为监听器会抵消容器屏幕的 pose 平移。建议在接口 javadoc 上写明,否则以后新增实现者很容易自己再叠一次leftPos/topPos偏移。 -
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 审查
|
💾 Self-improvement review: Patched SKILL.md in skill 'menu-widget-interaction-pr-review' (1 replacement). |
|
PR #154 的事件类型是 closed,命中了该技能第 1 条硬约束:操作类型为 closed 或 labeled 时立即停止,不发布评论。 因此按照该约束:
如果这个 PR 之后被重新打开(reopened)或被标记为 ready_for_review,请再触发一次,我会按完整流程审查「创造栏分区渲染 + 提示框层级」这部分改动。 |
fix(registrum): 修复创造栏分区显示与提示框层级