Skip to content

feat(registrum): 支持创造栏物品变体折叠与选择 - #104

Merged
WhereisFff merged 1 commit into
dev/1.21.1from
fff/1.21.1-16color-overlay
Aug 19, 2026
Merged

feat(registrum): 支持创造栏物品变体折叠与选择#104
WhereisFff merged 1 commit into
dev/1.21.1from
fff/1.21.1-16color-overlay

Conversation

@WhereisFff

Copy link
Copy Markdown
Contributor

No description provided.

- 自动识别原版 16 色物品族,并支持注册自定义变体组
- 在创造模式标签页折叠变体,提供右键 4x4 选择层
- 增加变体选择器渲染、交互逻辑及背景纹理资源
@Gugle2308

Copy link
Copy Markdown

I have a thorough understanding. Here is my review.


代码审查总结

结论:已审查 💬(0 个关键问题,2 个警告,4 个建议)

PR: #104 — feat(registrum): 支持创造栏物品变体折叠与选择
作者: @WhereisFff
修改文件: 9 个(+新增 6 个 Java/PNG −修改 2 个 Mixin)

功能:在创造物品栏中,将原版/模组的成组物品(如 16 色羊毛、陶瓦等)折叠为单个代表物品,右键点击弹出 4×4 变体选择叠加层。整体实现质量高——分层清晰(Registry 负责数据、Overlay 负责渲染、Screen Mixin 负责交互),线程安全与资源清理处理得当。以下是具体发现。

⚠️ 警告

  • CreativeVariantPickerOverlay.java:178-185top())— 叠加层无屏幕边界钳制,顶部槽位可能出屏。 叠加层以源槽为锚点向上展开 80px(sourceSlotTop - VERTICAL_GAP - TEXTURE_HEIGHT),且无任何 clamp / Math.max(0, ...)。当源槽位于物品网格上方几行时(创造栏无背包标签,topPos 可能很小甚至为负),叠加层顶部会渲染到屏幕外,用户无法看到/点击前几行的变体。建议在 render/contains/variantIndexAt 中共用同一个钳制后的 left/top(例如 top = Math.max(0, ...)),避免命中测试与渲染基准不一致。

  • CreativeVariantPickerOverlay.java:116(高亮 z 值)— 高亮层可能与手持物品 z 序冲突。 高亮在已 translate 到 BACKGROUND_Z=500 的帧内调用 renderSlotHighlight(..., HIGHLIGHT_Z=200),该调用会在此之上再 translate,有效 z≈700;而手持物品在 popPose 之后以 CARRIED_ITEM_Z=600 渲染。若拖着一个物品悬停在叠加层某个高亮格上方,高亮会盖过手持物品。建议把高亮移到帧外(以绝对 z 渲染)或降低其偏移,确保 手持 > 高亮 > 背景 的层级。

💡 建议

  • CreativeModeTabMixin.java:213-215fold 在服务端可折叠期间对 BuiltInRegistries.ITEM 做全表扫描。 discoverVanillaColorFamilies()synchronized 遍历整个物品注册表并做 16 色匹配,首次创建 CATEGORY tab 时在服务端同步执行。虽只跑一次、volatile 守卫正确,但这是服务端 tab 构建路径上的昂贵冷启动成本,建议在 FMLCommonSetupEvent 等启动早期主动预热一次,避免首开创造栏的卡顿。

  • CreativeVariantPickerRegistry.java:707-709 — 非法组抛 IllegalArgumentException,而不是返回/记录警告。模组调用 register/registerStacks 传 1 个或 17+ 个变体时会直接抛异常并可能让模组崩溃。作为库 API,建议改为宽松处理(跳过/记录)或至少文档明确约束。

  • CreativeVariantPickerRegistry.java:803-824 — 16 色族的 basePath 识别可能误匹配path.startsWith(color.getName() + "_") 且只要求 16 色齐全即判定为族。如果某个非颜色族物品恰好共享 basePath(如 white_...),会误折叠。当前"必须 16 色齐全"已大幅降低误判,但建议仅对明确的颜色族集合(羊毛、陶瓦、混凝土、玻璃等)白名单化,更可控。

  • CreativeModeInventoryScreenMixin.java:349-361 — tooltip 期间临时替换 hoveredSlot。通过 try/finally 保护是好的,但 getTooltipFromContainerItem 可能会触发物品能力/附加组件查询,依赖 hovered 槽位状态——若实现类正好有副作用会有隐患。整体可接受,仅提示风险。

✅ 表现良好

  • anvillib$clickPickerVariant(:520-534):临时 swap 源槽物品 → slotClickedfinally 恢复,巧妙复用原版创造栏放置逻辑且异常安全;因创造源槽不会被消耗,恢复语义正确。
  • 鼠标消费位掩码(:542-560)consumedMouseButtons 用位掩码精确跟踪,并在 removed 中清理,避免状态泄漏。
  • Render/命中测试的一致结构contains/variantIndexAt/render 共用 left()/top() 基准,variantIndexAt 对越界(含超出变体数)正确返回 -1
  • 命中测试几何与槽位渲染一致-1 偏移、18px 范围),且用 CONTAINER 精确过滤创造源槽。

🧪 测试建议

被测目标 推荐测试场景 优先级
CreativeVariantPickerOverlay.top() / variantIndexAt() 顶部/底部槽位时叠加层是否出屏、钳制后命中一致性 🟡
CreativeVariantPickerRegistry.fold() 组中仅部分成员在 tab 中时不应折叠(presentIn 全部匹配)、成员顺序变化、重复注册 sameItems 去重 🔴
CreativeVariantPickerRegistry.discoverVanillaColorFamilies() 16 色族完整/缺失、非法 basePath 误匹配 🟡
anvillib$clickPickerVariant swap→slotClicked→restore 后 sourceSlot 恢复为原物品、carried 正确写入变体、异常时 finally 恢复 🔴
anvillib$handleVariantOverlayClick 叠加层内左/右键、外部右键另一槽位(关闭旧+开新)、源槽右键关闭 🟡
mouseReleased/mouseDragged 位掩码 点击未释放/拖动时位掩码正确清理、不吞并无关点击 🟡
16-色叠加层 z 序 高亮与手持物品重叠时的渲染层级 🟢

由 Hermes Agent 审查

@WhereisFff
WhereisFff merged commit 53812ee into dev/1.21.1 Aug 19, 2026
20 checks passed
@Gugle2308

Copy link
Copy Markdown

PR #104 状态为 closed,按规则直接停止——不下载 diff、不分析、不发布评论。

(Webhook 审查规则第 1 条:closed/labeled → 停止。本次不输出任何审查意见。)

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