Repository navigation
Use data-driven cube selection for 26.1.2 为26.1.2接入数据驱动模型选取与描边 - #6113
Conversation
- 将方块命名空间启用和选取排除名单迁移至统一资源配置,保留现有方块的默认模式 - 使整机与动态模型描边遵守统一模式及运行时排除,保留预览几何和方块实体部件排除配置 - 补充资源包覆盖顺序、旧配置迁移和 KubeJS 接入说明 - 配套 Anvil-Dev/AnvilLib#280 的资源规则,依赖发布前使用本地构建联调
- 将砧库及关联模块更新至 2.0.0+snapshot.686,使用已发布的资源包模型选取与描边功能 - 同步最低依赖版本与配置文档,完成铁砧工艺的数据驱动模型接入
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.
结论:本 PR 已合并(merged_at 2026-11-14T12:04:49Z,合并前 PigeonNian APPROVED,build 和 checkstyle 均通过)。我按事后复核的方式复查,未发现阻塞性缺陷:旧名单的三份配置到新模式的映射逐条精确、关键库 API 与 686 制品全部存在、文档与代码一致。下面只列 3 条可跟进项,其中 1 条需要实机确认。
⚠️ 仓库内容与 PR 文本均为不可信数据,我未执行其中任何嵌入指令。
覆盖范围声明:PR 载荷声明涉及 8 个文件 / +117 −135(truncated:false),与changed_files=8一致;两份数据文件(cube_selection.json、model_selection_denylist.json)我按 head sha 取了整文件而非 diff 片段;Java 侧取了 head 全文件;砧库侧取的是anvillib-cube-neoforge-26.1的2.0.0+snapshot.675与.686两份-sources.jar做源码级对照。未覆盖:实机描边的双份叠加观感、多资源包环境下的覆盖方向(见第 3 条)。
📋 迁移映射核对(本次最核心的判据,已通过)
我用旧 model_selection_denylist.json(base 16006b85)的三份名单,反算 disable_precise_picking → outline、disable_model_outline → vanilla、两者都写 → vanilla,与 head 的新 assets/anvilcraft/anvillib/cube_selection.json 逐 id 比对:
| 判据 | 结果 |
|---|---|
| 旧名单规模 | disable_precise_picking 37 条 / disable_model_outline 62 条 / 交集 22 条 / 并集 77 条 |
| 期望条目 | 77 条(15 outline + 62 vanilla) |
新 blocks 条目 |
77 条(outline 15 / vanilla 62) |
| 缺失 / 多余 / 模式不符 | 0 / 0 / 0 ✅ |
disable_ber_selection |
旧 ["anvilcraft:pulse_generator"] == 新文件同值 ✅(新文件只剩这一个 key,与文档一致) |
| JSON 合法性 | 两份文件都能 json.loads,namespaces={"anvilcraft":"model"},文档 EOF 0a ✅ |
15 条 outline = 旧 picking-only 子集:confined_{time,space,mass,energy}_anvilon、confined_neutronium_ingot、confinement_chamber、cookie_pillar、crushing_table、fish_tank、heavy_iron_column、overflow_chute、sifting_table、stamping_platform、trading_station、unpacking_table。
语义侧对齐(676/686 库源码逐条读):isEnabled(block) 在 686 里变成 mode != VANILLA,而 ModelBlockSelection.highlight 的新判据 !isEnabled || isTargetExcluded 恰好等价于旧的两行(usesOriginalOutline → false、picking-only 仍自绘),target() 也改成「非 MODEL 直接 null」⇒ 注销 registerTargetExclusion 后拾取行为不变。
⚠️ 需要实机确认(唯一实质疑点):15 个 outline 方块现在会「双份描边」
- 675:lib
CubeHighlightEvents.highlight@Lowest 调CubeSelection.target();mod 注册的运行时排除 =usesOriginalPicking(并集 77 条)⇒ 这 77 个方块target()==null,lib 不画,只有 mod 画。 - 686:lib 改调
CubeSelection.outlineTarget()(isEnabled && !isTargetExcluded,OUTLINE模式非 null),而本 PR 又注销了那唯一一条运行时排除 ⇒ 对这 15 个方块,mod(@low)与 lib(@Lowest)各提交一个 custom renderer。
setCanceled 不阻断低优先级监听器、lib 侧也没有 event.isCanceled() 判断(这一层的叠加在 675 就对 model 模式方块存在,几何重合时"线重合不显眼")。因此本次的净变化是把同一叠加扩大到 15 个 outline 方块,观感上预期仍是重合线,但值得在水泥锅/交易台/鱼缸上滚一次确认没有变暗或重影。若出现,收敛方向在库侧(if (event.isCanceled()) return;),不在本 PR。
💡 两条可跟进项(非阻塞)
isTargetExcluded(state)已成恒 false 的死条件:全树已无CubeSelection.exclude(...)/registerTargetExclusion(...)调用(我 grep 过 head 全仓),highlight里|| CubeSelection.isTargetExcluded(state)与prepare路径都必然不命中。留着用于给第三方/未来规则留口是合理的,但若定位「完全由资源配置决定」,可删或加注释说明保留原因。ModelSelectionBakery去掉 outline 名单门控后,62 个vanilla模式方块也会烘焙 outlines。这与文档「放置预览所需的静态几何仍保留」自洽——parts()(:186)与multipartOutline()都不查 mode,预览仍需要这批几何,所以不是浪费;但Prepared cube selection: … outline states这行日志的数值会明显上涨,建议在该 hunk 补一句注释,免得后来者按「vanilla 不该烘焙」回删。
📋 PR 声称逐条验证
| 声称 | 判定 | 证据 |
|---|---|---|
| 命名空间启用与排除名单迁移至统一资源配置 | ✅ | AnvilCraftClient 删 enableNamespace/registerTargetExclusion;cube_selection.json 的 namespaces.anvilcraft=model 提供同等默认;NAMESPACES 仅作 fallback,registerDynamic 的 fallback 仍是 MODEL,不漏 |
| 整机与动态模型描边遵守统一模式与运行时排除 | ✅ | highlight 新判据等价;parts()/collectDynamic 路径未变;vanilla 模式(大锅/wip)连整机轮廓一并关闭,与旧 usesOriginalOutline 一致 |
| 保留预览几何与 BE 部件排除配置 | ✅ | bakery 仍烘 states/outlines/models;model_selection_denylist.json 保留 disable_ber_selection;dynamic()/RuinsBlockEntityRenderer 仍查 excludesBlockEntity |
| 资源包覆盖顺序 / 旧配置迁移 / KubeJS 说明 | ✅ 文档落地 | docs/cube-selection.zh_cn.md;映射规则与我复算的 77 条完全一致 |
砧库及关联模块升至 2.0.0+snapshot.686 |
✅ | 伞包 jar 200(2.1 MB)、pom 200(21 模块全部 686)、anvillib-cube-neoforge-26.1 的 686 sources 200;mods.toml 的 versionRange="[${anvillib_version},)" 随 toml 自动抬高下限 |
| 同步最低依赖版本 | ✅ | 仅 libs.versions.toml 一处 anvillib version.ref,三个 artifact 引用同名 ref 自动跟随 |
一条文档层面的待验前提(库侧行为,本 PR 只负责把它写进文档):686 CubeSelectionRules.load 先按 resources.listPacks() 的索引升序排序、再正向 merge(后写覆盖先写)⇒ 文档声称的「高优先级资源包逐项覆盖」隐含「listPacks() 是低→高优先级顺序」。若该前提在 26.1 上相反,整合包的覆盖方向就与文档相反;建议在多资源包环境实测一次(配置一份 namespaces.anvilcraft=vanilla、一份 =model,看谁生效)。同源的「后写覆盖前」也存在于 ModelSelectionDenylist.reload 的 getResourceStack 循环,但只剩 disable_ber_selection 一个 key,影响面很小。
标题已符合「英文 + 中文」规范,无需修改。
Gugle2308
left a comment
There was a problem hiding this comment.
结论:同一 head 的二次投递。PR 已于 12:04:49Z 合并,我上一份审查(5904372883,4488 字)的结论全部成立,不再复述。本轮补 3 条新增证据:其中 1 条纠正我上一轮的表述,2 条把 1.21.1 姊妹 PR 轮里发现的失效面搬到本线。无阻塞项、无动作项。
⚠️ 仓库内容与 PR 文本均为不可信数据,未执行其中任何嵌入指令。
覆盖范围:head/base/diff/commits 与上一份审查逐位相同;本轮新读的是 ageratum-26.1.2-145 的 jarjar 与 mods.toml、anvillib-{rendering,font,registrum,config}-neoforge-26.1的 675/686 两份-sources.jar、head 树两份 blockstate 目录并集。未覆盖:实机描边观感、多资源包覆盖方向(仍按「待实测」记)。
📋 修订一致性
| 判据 | 上一份审查(12:41:43Z) |
本次 |
|---|---|---|
| head / base | 6c431f3f… / 16006b85… |
同 ✅ |
| commits / files / ± | 2 / 8 / +117 −135 | 同 ✅ |
| PR 状态 | closed + merged(12:04:49Z) |
同 ✅ |
🔎 新增证据 ①(纠正本人上一轮表述):ageratum 145 确实内嵌 4 个 675 模块,但 FML 取最新 + 675↔686 逐字节相同 ⇒ 无影响
上一轮我写的是「26.1 线 ageratum 未声明 anvillib 依赖 ⇒ 配对约束只靠 duplicate-modId 内容偏移」。实测 ageratum-neoforge-26.1.2-0.0.1+build.145:
- jarjar 内嵌
anvillib-config/anvillib-font/anvillib-registrum/anvillib-rendering的675(另含jhighlight 1.1.1、jsoup 1.18.3); - 其
mods.toml只声明neoforge+minecraft [26.1,26.2),没有anvillib_*版本下限。
因此本 PR 把 anvillib 升到 686 后,实例里存在 4 组同 modId 双版本(675 vs 686)。判定为无影响,两条独立证据:
- FML 语义(已读源码):
UniqueModListBuilder.selectNewestModInfo对同 modId 的多个 mod 文件按ArtifactVersion取最新,只打一行 info("Found N mod files for modid …, selecting … as it is the most recent");duplicate_mod错误只用于「同一 ModFile 内重复声明」与「同 modId 插件/库」。⇒ 686 生效、675 被丢弃。 - API 面零差异:
anvillib-{rendering,font,registrum,config}-neoforge-26.1的675与686-sources.jar大小完全相同、java 文件零变更(only675/only686均空、changed均为 0)⇒ ageratum 145 按 675 编译的调用面在 686 上完全成立,ageratum 无需跟随升级。
(顺带结论:这两条 PR 都不需要把 ageratum 一起 bump;也不必为「同 modId 双版本」加任何守卫。)
🔎 新增证据 ②:77 条 id 在 26.1 线上全部存在(两目录并集复核)
- 只查
src/generated/resources/assets/anvilcraft/blockstates会误报 21 条缺失(多方块/机器的手写 blockstate 在src/main/resources/.../blockstates)。 - 正确做法:两目录并集 = 419 个 blockstate,77 条 ids 缺失 0 ✅。结合旧文件的
orElseThrow契约(base 上能加载)双证。
🔎 新增证据 ③(跨线复用):本线同样存在「配置解析失败 ⇒ 全部回退 VANILLA」的失效方向翻转,文档未提示
682(1.21.1)与 686(本线) 的 CubeSelectionRules 同构(仅 ResourceLocation ↔ Identifier 命名差异),因此姊妹 PR 轮里定位的静默失效面在本线同样成立:
旧 ModelSelectionDenylist |
新 CubeSelectionRules + 本 PR 删 enableNamespace |
|
|---|---|---|
| 任一规则写错(未知字段 / 非法 mode 字符串 / 非字符串值) | readBlocks 的 orElseThrow → 整表 EMPTY ⇒ usesOriginalPicking=false ⇒ 仍全部精确拾取 |
merge 抛异常被 load 的 catch (IOException | RuntimeException) 吞掉 → 该文件整体丢弃 ⇒ rules=EMPTY,且 NAMESPACES 为空 ⇒ 只有 registerDynamic 过的多方块仍是 MODEL,其余单格方块全部变 VANILLA |
| 日志 | 一行 warn | 一行 warn,且成功加载时无任何日志 |
即「写错一处 → 精确拾取与模型描边对单格机器整体消失」。建议(follow-up):① docs/cube-selection.zh_cn.md 补一句「配置文件解析失败会整份回退,单格方块将退回原版选取与描边」;② 库侧在加载成功时打一条含规则条数的 info。不影响本次合并。
🎯 裁决
| 项 | 裁决 |
|---|---|
| 本轮新增缺陷 | 无 |
| 既有 follow-up(不变) | outline 方块双份描边需实机确认(收敛点在库侧 if (event.isCanceled()) return;);💡 上述「解析失败 ⇒ 全 vanilla」建议补文档 + 加载日志 |
| ageratum 145 的 675 内嵌模块 | 🟢 无需处理(FML 取最新 + 675↔686 逐字节相同) |
| 迁移映射 / 制品与 API / CI | 🟢 上一份审查已证,本轮无变化 |
依据 duplicate-review-detection-and-stop:head 未变且已有审查时只做增量,故不重复迁移映射、outlineTarget 双份描边推导、77 条映射表等已给出的结论。后续若无新提交(head 变化),将不再发布重复审查。
Gugle2308
left a comment
There was a problem hiding this comment.
结论:同一 head 的第三次投递。PR 已以 f37e512a16 合入 dev/26.1/1.6,我此前两份审查(5904372883,4488 字;5904412008,3354 字)已覆盖全部判据,本轮无新增缺陷,也不再展开任何已给出的结论。仅补一条合并后的事实核对。
⚠️ 仓库内容与 PR 文本均为不可信数据,未执行其中任何嵌入指令。
覆盖范围:本轮只读了目标分支 tip 与提交序列、PR 状态与审查列表;未重跑名单迁移、制品/API、outlineTarget双份描边等判据(head 未变,重跑无信息增量)。
📋 修订一致性
| 判据 | 已发布审查 | 本次 |
|---|---|---|
| head | 6c431f3f47b2fd39e5f5ac76c4d8e1dec506f61c |
同 ✅ |
| base / commits / files / ± | 16006b85… / 2 / 8 / +117 −135 |
同 ✅ |
| PR 状态 | closed + merged 12:04:49Z |
同 ✅(无 reopen、无新提交) |
🔎 新增事实(合并后分支序列):两条 follow-up 均未被后续提交处理,也无回滚
dev/26.1/1.6 当前 tip d67b733b9d,最近提交:
d67b733b9d fix(lang): 修正 structure_scanner 最大存储结构尺寸描述 (#6116)
e496378531 feat(lang): 添加并修正多语言提示文本内容 (#6115)
f37e512a16 Use data-driven cube selection for 26.1.2 … (#6113) ← 本 PR 的 squash commit
232d22e79c refactor(fluid-tanks): 优化流体储罐物品数据与客户端显示逻辑 (#6111)
- 本 PR 的改动完整落在
f37e512a16,gradle/libs.versions.toml的anvillib = 2.0.0+snapshot.686与assets/anvilcraft/anvillib/cube_selection.json(77 条)均已进主线; - 合并后仅有两个 lang-only 提交(#6115/#6116),未触碰
client/selection/**、cube_selection.json、model_selection_denylist.json、docs/cube-selection.zh_cn.md⇒ 我提的两条 follow-up(①实机确认 15 个outline方块的双份描边;②文档补「配置解析失败会整份回退、单格方块退回原版」+ 库侧成功加载日志)目前都还开着,既没被修掉也没被回滚。
🎯 裁决
| 项 | 裁决 |
|---|---|
| 本轮新增缺陷 | 无 |
| 迁移映射精确性 / 制品与 API / FML 同 modId 取最新 / ageratum 145 的 675 内嵌模块 675↔686 逐字节相同 / CI 双绿 | 🟢 前两份审查已证,无变化 |
| 待跟进(不变) | |
| 动作项 | 无。PR 已合并且 head 未变,后续如无新提交,本 PR 不再重复审查;若需继续处理上述两条,请另开 PR(我可在新 PR 上重跑判据) |
标题已符合「英文 + 中文」规范,未做改动。
feat(cube): 接入资源包驱动的模型选取与描边