Skip to content

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

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

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

Conversation

@WhereisFff

Copy link
Copy Markdown
Contributor

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

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

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

Copy link
Copy Markdown

代码审查摘要 — PR #155

操作: opened(data-status="pullOpened",未合并)
范围: 2 个文件(1 新增 / 1 修改,无删除)· 105 行 diff · 纯 Java,无资源/生成数据变更
审查基线: head 0628ba75(开工与发布前各校验一次 refs/pull/155/head,diff md5 一致 975557a6,期间未前进)
目标分支: dev/1.21.4(MC 1.21.4 / NeoForge 21.4.157,据 gradle/libs.versions.toml)


🟢 关键点已离线核对通过(结论:核心改动是对的)

  1. 坐标基准转换正确 —— 这是本 PR 最容易写错的地方,作者写对了。
    从 NeoForge 1.21.4 的 AbstractContainerScreen.java.patch 可确认 ContainerScreenEvent.Render.Foreground 的投递点在 pushPose + translate(leftPos, topPos, 0) 之后、popPose 之前:

    p.pose().pushPose();
    p.pose().translate((float)i, (float)j, 0.0F);   // i=leftPos, j=topPos
    ...slot 物品渲染...
    this.renderLabels(p, mouseX, mouseY);
    NeoForge.EVENT_BUS.post(new ContainerScreenEvent.Render.Foreground(this, p, mouseX, mouseY)); // ← 这里

    而 anvillib$renderSections 内部用的是绝对屏幕坐标(bannerX = this.leftPos + GRID_LEFT - 1、bannerY = this.topPos + ...,全文件 8 处 leftPos/topPos)。因此监听器里的 translate(-getGuiLeft(), -getGuiTop(), 0) 正好把 pose 还原成绝对原点,与原有坐标系一致,不会整体偏移。pushPose/popPose 用 try/finally 包裹也正确。

  2. API 签名全部存在(对照 NeoForge ContainerScreenEvent.java):getContainerScreen() 返回 AbstractContainerScreen<?>、getGuiGraphics() / getMouseX() / getMouseY() 均为 21.4 实际成员;EventPriority.HIGHEST 语义即"最早执行",与文件头 javadoc"在配方查看器的前景与提示框之前绘制"一致。

  3. 注册链路正确:@EventBusSubscriber 默认 GAME 总线,而 Foreground 正是 NeoForge.EVENT_BUS 投递 → 总线匹配 ✔;modid = "anvillib_registrum" 与 module.registrum/gradle.properties 的 mod_id 完全一致(写错会静默不注册、分区整体消失——已排除);value = Dist.CLIENT 与仓库既有 AttachmentSync / AnvilCraft 的 ResonanceMiningClientEventListener 等模式一致。

  4. 专用服务器安全:新类虽在 common source set,但 Dist.CLIENT 门禁 + 仅由 anvillib_registrum.mixins.json 的 client 段(client.CreativeModeInventoryScreenMixin)引用 → 服务端不会加载,ContainerScreenEvent 缺失不致 NoClassDefFoundError。

  5. BANNER_Z 清理干净:全仓 git grep BANNER_Z 在 head 上零命中,无悬空引用;@Unique/CallbackInfo/At 等 import 仍被其余 5 处注入使用,无未使用 import。


⚠️ 警告(不阻塞,但请确认)

  • EventPriority.HIGHEST 的顺序保证是"软"的。
    HIGHEST 只能保证在同样走该事件的模组之前。若目标配方查看器(JEI / EMI / REI)改用 mixin 注入 AbstractContainerScreen.render(@tail)或 ScreenEvent.Render.Post,事件优先级完全不参与排序,本修复对它无效;若对方也注册 HIGHEST,两个同优先级监听器的先后取决于注册顺序(不稳定)。建议在 javadoc 里注明实测过的查看器与版本,否则将来"分区又消失"时无从判断是回归还是换了查看器。

  • this.hoveredSlot = null 的副作用时机前移了(CreativeModeInventoryScreenMixin.java:89)。
    以前它在 render 的 renderTooltip 注入点执行——即晚于其它模组的 Foreground 处理器;现在在 Foreground 事件里、且是 HIGHEST,早于它们。也就是第三方查看器在悬停分区横幅时读到的 hoveredSlot 由"非 null"变成"null"(不再画幽灵配方)。因为横幅覆盖的格子是 CreativeTabSections.arrange 里特意塞的 ItemStack.EMPTY 占位格(CreatureTabSections.java:99-101),实际影响可忽略,但属于行为变化,建议确认这是期望行为。


💡 建议

  • module.registrum 的 client/ 包缺 package-info.java:该模块 21 个包中 19 个都有(含 client/gui/package-info.java),本 PR 是第一个直接落在 client/ 根包的类,顺手补一个更一致。
  • 包位置:AnvilCraft 侧同类监听器惯例在 client/event/(如 client/event/WheelLifecycleEventListener),放 client/ 根包略不统一,可不改。
  • 跨分支一致性:origin/dev-1.21.1 上同一 mixin 仍保留 anvillib$BANNER_Z = 200(第 46 行)与 render 内 renderTooltip 注入(第 77 行)。若 1.21.1 也存在同样的提示框遮挡/分区消失问题,需要另开 backport PR;否则请确认这是有意只修 1.21.4。
  • 层级回归的实测点:去掉 z=200 后横幅降到 z=0。按当前布局横幅格是空占位格,不会与槽位物品(z≈100~232)互相遮挡;拖动中的物品(z=232)现在画在横幅之上——与改动前结果相同(改动前横幅在 renderTooltip 点绘制、z=200 < 232)。建议实测一遍:悬停分区横幅(高亮 + 长文本滚动)、拖动物品经过横幅、以及开着配方查看器时的提示框。

📋 声称验证表

PR 声称 状态 依据
在配方查看器绘制前景前绘制创造栏分区 ✅ 改为 ContainerScreenEvent.Render.Foreground + HIGHEST,早于其它 Foreground 订阅者
移除分区额外的渲染高度与层级提升 ✅ anvillib$BANNER_Z = 200 及 translate(0,0,BANNER_Z) 均删除,全仓无残留引用
防止遮挡配方查看器提示框 ✅(逻辑自洽) 绘制时机前移 + z 归零,两者都不再与查看器提示框争夺前后层级;具体看查看器实现(见警告 1)
保留分区悬停提示、长文本滚动及变体选择交互 ✅ renderSections/renderSection/renderBannerText/renderVariantOverlay/renderTooltips 主体零改动,仅入口从 @Inject 换成 @Override

结论: APPROVE(COMMENT 级改进项) — 改动内聚、坐标系与事件语义经 NeoForge 21.4.157 补丁与 API 源码双向核对无误,BANNER_Z 清理彻底,无新增服务端风险。两条警告都属于"顺序/时机依赖第三方模组"的可观测性建议,不构成阻塞。PR 标题 Fix creative section rendering 修复创造栏分区显示与提示框层级(1.21.4) 已符合格式,未做修改。

由 Hermes Agent 审查(对应 head 0628ba75)

@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).

@Gugle2308

Copy link
Copy Markdown

🌿 Roseau API Breaking Change Report

Module Status Breaking Changes
codec ✅ Compatible 0
collision ✅ Compatible 0
cube ✅ Compatible 0
config ✅ Compatible 0
integration ✅ Compatible 0
moveable-entity-block ✅ Compatible 0
network ✅ Compatible 0
rendering ⚪ Skipped —
space-select ✅ Compatible 0
font ✅ Compatible 0
util ✅ Compatible 0
explosion ✅ Compatible 0
rpc ✅ Compatible 0
math ✅ Compatible 0
multiblock ✅ Compatible 0
recipe ✅ Compatible 0
registrum ✅ Compatible 0
sync ✅ Compatible 0
wheel ✅ Compatible 0
main ✅ Compatible 0

Full CSVs: see the Artifacts section of this workflow run.

@PigeonNian
PigeonNian merged commit c1d6b37 into Anvil-Dev:dev/1.21.4 Oct 20, 2026
40 checks passed
@Gugle2308

Copy link
Copy Markdown

这是关闭操作,按约束1应停止,不发布评论。

PR #155 已被关闭(closed),我现在按要求停止处理,不进行审查评论。

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