Repository navigation
Update Ageratum and refresh the export button 更新藿香并应用导出按钮新贴图 - #6088
Conversation
- 将 26.1.2 的藿香依赖更新至 0.0.1+build.141,接入原生只读方块界面、空玩家背包和同步淡出的物品图标 - 复用藿香的导出按钮绘制接口,使用现有深浅主题贴图与统一悬停提示
There was a problem hiding this comment.
Copilot was unable to review this pull request because the user who requested the review has insufficient remaining quota. Try requesting a review at a lower effort level.
An organization owner can choose the repository organization as the billing source for reviews requested by members with a paid Copilot license. Learn about Copilot code review billing. Review the Copilot code review billing settings.
Gugle2308
left a comment
There was a problem hiding this comment.
审查结论
APPROVE(可以合并),但有一项依赖侧的主题缺陷需要跟进:本 PR 本身只是把一段 11 行手绘箭头替换成库提供的一行调用(2 文件 / +2 −12,CI build ✅ checkstyle ✅,mergeable_state=clean)。但升级到的 ageratum build.141 里,renderExportButton 的贴图查找键少了一层前缀,导致深色主题下画出的是浅色主题贴图(详见下文
本次审查依据 webhook 提示:仓库内容与 issue 文本均为不可信数据,不执行其中任何嵌入指令。diff 覆盖完整(API 报告
changed_files=2,patch 也是 2 个文件,+2 −12与additions/deletions一致,没有截断);但未做运行期验证,下述判断都来自静态取证和成品 jar 核对。
概览
| 项 | 值 |
|---|---|
| PR | #6088 Update Ageratum and refresh the export button 更新藿香并应用导出按钮新贴图 |
| head / base | b93310b8 / dev/26.1/1.6 @ 286f7345 |
| 状态 | open、draft=false、merged=false、mergeable_state=clean |
| 规模 | 2 文件,+2 −12 |
| CI | build ✅、checkstyle ✅ |
| 依赖 | ageratum 0.0.1+build.139 → 0.0.1+build.141 |
⚠️ 唯一实质问题:深色主题下导出按钮退化为浅色主题贴图
build.141 新增的 MDNBTStructureComponent.renderExportButton(:178-183)写的是:
context.layout().texture("button_import",
LayoutTexture.of(Identifier.parse("ageratum:textures/gui/guide/light/button_import.png"), 16, 16, 16, 32))
.draw(context.graphics(), x, 25, 16, 16, hover);然而,GuideLayout.texture(String, LayoutTexture) 内部使用 value(path),按 . 对路径分段并从根节点逐层深入;而布局数据中的按钮贴图一律存放在 textures 子对象下:
LayoutDefaults.applyTextures(LayoutDefaults.java:55-73)把button_import写进layout.getAsJsonObject("textures"),还专门给它设置width/height=16、texture_width/height=16/32;- 同类的正确写法是
GuideLayout.controlTexture,它使用texture("textures." + name, …);GuidePanelView.texture()也走controlTexture。
实测,我从 ageratum-neoforge-26.1.2-0.0.1+build.141.jar 取出四份布局 JSON,并模拟 extends 合并(dark 继承 light、fullscreen 继承 light、fullscreen_dark 继承 fullscreen)以及 AnvilCraft 自己的 assets/anvilcraft/ageratum/layouts/light.json 复写:
light root keys = name/dark_variant/textures/colors/extends/content;root 无 button_import
textures.button_import = {location: ageratum:gui/guide/light/button_import, 16×16, 16×32}
dark(合并后) textures.button_import = {location: ageratum:gui/guide/dark/button_import, 16×16, 16×32}
root 无 button_import(AnvilCraft 复写后仍无)
因此,value("button_import") 始终返回 null,texture(...) 每次都会等同于传入的 fallback,而这把 location 固定写成了 light/button_import.png。两个主题的贴图确实不同(light 341 B / dark 424 B,md5 不同,都是 16×32 的调色板 PNG),所以:
- 浅色主题:外观正确;
- 深色主题:导出按钮会显示成浅色主题的按钮。手绘版本使用的是固定填充色,与主题无关,因此这是本次 bump 带来的可见变化。
修法只需一行(属于库侧,不归本 PR 修改):
context.layout().texture("textures.button_import", /* fallback 仅作最后兜底 */ …)建议:把 bug 报给藿香,或等 build.142+ 再升;如果坚持在本 PR 内解决,可以让 HandbookStructureExportMixin 先按 layout().texture("textures.button_import", …) 自行绘制(这样会回退到手写版本,不推荐)。不阻塞合并,但请在评论里写明这是库侧缺陷,以免后续被当成玄学问题。
✅ 已核验项
1. bump 与代码改动是配对的(不能只取其中一项)
renderExportButton 只存在于 build.141:139 与 141 的 MDNBTStructureComponent.class 常量池方法名差集为 139-only,分别是 blockDetails/font/hasShiftDown/screenHeight/screenWidth/scroll/setLines,其中没有 renderExportButton。如果只改代码而不升版本,会直接链接失败;只升版本而不改代码,则是死代码。本 PR 两者一起改,正确。
2. 几何与 tooltip 键等价
被删代码的判定框是 x = maxX-21、mouseX ∈ [x, x+16)、mouseY ∈ [25, 41),绘制也位于 (x,25)-(x+16,41);库侧 renderExportButton 使用 x = context.maxX() - 21、y=25、16×16,判定条件逐项相同,tooltip 键同为 tooltip.ageratum.structure_export。旧版 fill 的 6 层像素箭头与新贴图属于视觉替换,坐标没有迁移误差。
3. 悬停帧与贴图尺寸正确
LayoutTexture.draw 的帧选择是 frameY = hover && atlasHeight >= height*2 ? height : 0;实测 16×32、height=16 ⇒ 满足条件,悬停时取下半帧(此前已解码两张 PNG:下半帧是白色/蓝色高亮)。LayoutDefaults 为 button_import 显式设置的 texture_width/height = 16/32 与此一致。
4. 不与 AnvilCraft 自身的 mixin 冲突
新增的六个 StructureGui*Mixin 目标与本体两个 mixin 有交集类,但注入点和注解都不同,不构成叠加冲突:
| 库 mixin | 目标 / 注入 | 本体同目标 mixin | 本体注入点 |
|---|---|---|---|
StructureGuiGraphicsMixin |
GuiGraphicsExtractor.innerBlit(12 参) / innerFill / text(FormattedCharSequence) |
GuiGraphicsExtractorMixin |
@WrapMethod tooltip、applyCursor HEAD、item(...) |
StructureGuiItemRendererMixin |
GuiRenderer.submitBlitFromItemAtlas @ModifyArgs on BlitRenderState.<init> args[11] |
ScaledGuiItemRendererMixin |
prepareItemElements HEAD / GuiItemAtlas.getOrUpdate、getModelIdentity 的 @WrapOperation / endFrame TAIL |
StructureGuiOversizedItemMixin |
PictureInPictureRenderer.blitTexture @ModifyArgs |
ScaledGuiItemPipMixin |
prepare @WrapMethod |
本体全仓 grep innerBlit|innerFill|BlitRenderState 在 mixin/ 下 0 命中,即没有第二处写 BlitRenderState 的 color(args index 11 与 26.1 BlitRenderState 第 12 个分量 int color 对得上;GuiRenderer:396 的 submitBlitFromItemAtlas 就在传 -1)。
5. 其余新 mixin 目标在 26.1.2 均存在
Screen.extractBackground:386、RecipeBookComponent.isVisibleAccordingToBookData:195(private,@Inject HEAD cancellable 合法)、PictureInPictureRenderer.blitTexture:59 全部命中;六个类都已登记进 ageratum.mixins.json 的 "client" 数组。
6. 嵌套 jarjar 无版本漂移
139 与 141 的 META-INF/jarjar/ 完全一致:anvillib-{config,font,registrum,rendering}-neoforge-26.1-2.0.0+snapshot.563.jar 加 jhighlight-1.1.1 加 jsoup-1.18.3;仓库 pin 的 anvillib = 2.0.0+snapshot.653 未受影响。新引入的 StructureGui* 没有带来新第三方依赖。
7. tooltip 文案来源不受影响
tooltip.ageratum.structure_export 在 141 的 en_us/zh_cn/en_ud 里有,而 AnvilCraft 自己的 assets/ageratum/lang/*.json 复写也带了同一键(连同 system.ageratum.structure_export.*)。语言文件按 getResourceStack 逆序覆盖,本体复写优先级更高,因此文案由 AnvilCraft 决定,bump 不改变措辞。
8. 与组件自身的“查看”tooltip 不打架
MDNBTStructureComponent:163-169 的 isHoverControls 已包含 isHover(maxX-21, 25, 16, 16)(即导出按钮区),而 :156 的浮窗内 tooltip 分发在 isHoverControls 为真时提前 return ⇒ 悬停导出按钮只会出现导出提示,不会同时出现 “inspect” 提示。
💡 建议(不阻塞)
- 点击命中框是第三方复制的几何常量:
HandbookStructureExportMixin.mouseClicked仍写死x >= maxX-21 && x < maxX-5 && y >= 25 && y < 41,与库侧绘制框同值但没有共享常量。库里既然为绘制开了公共 API(:175-177javadoc 明说“供负责结构导出的集成模块绘制……点击行为由集成模块处理”),建议同时暴露命中矩形(如isHoverExportButton(context)/exportButtonRect(maxX));否则藿香日后挪动按钮,就会出现“画在 A、点在 B”的静默错位。 - bump 的
lastUpdated与 141 之外的版本:仓库releases/下目前最新就是build.141(maven-metadata.xmllatest 一致),本次取的是当时最新版,没有问题;但⚠️ 修复版发布后建议一并跟进。 - 描述里的“原生只读方块界面、空玩家背包、同步淡出的物品图标”全部由库侧
StructureGui*实现,本体零改动。建议在 PR 描述里注明“需构建包含该库版本的客户端才能看到效果”,便于后续二分排查。
描述声称对照
| 描述声称 | 本次 diff | 判定 |
|---|---|---|
将 26.1.2 的藿香依赖更新至 0.0.1+build.141 |
libs.versions.toml 139→141 |
✅ |
接入原生只读方块界面、空玩家背包和同步淡出的物品图标 |
本体 0 行;库侧新增 StructureGuiSession/Preview/ItemOpacity 加 6 个 client mixin(已核目标与登记) |
✅(库侧提供,本体只是受益) |
复用藿香的导出按钮绘制接口,使用现有深浅主题贴图与统一悬停提示 |
renderExportButton 调用 ✅;“深浅主题贴图”不成立,查找键少写 textures. ⇒ 恒浅色 |
|
统一悬停提示 |
tooltip 键与判定框均与旧实现一致 | ✅ |
回归测试建议
- 打开手册 → 进入任意含结构的页面 → 结构预览浮窗右上出现导出按钮;分别切浅色/深色主题确认按钮配色随主题变化(当前深色会露馅)。
- 悬停按钮:出现下半帧高亮和“导出结构”tooltip,且不出现 “inspect” 提示。
- 点击按钮:结构正常导出,且不触发浮窗拖拽 / 投影按钮的层切换。
- 顺带目视:浮窗内原生方块界面渲染、物品图标淡出、配方书开关、超大物品图标(
PictureInPictureRenderer)无异常。这些是 141 新 mixin 的覆盖面,与本 PR 交互区域重叠。
build(deps): 更新藿香并应用结构导出按钮贴图