Skip to content

Use data-driven cube selection for 26.1.2 为26.1.2接入数据驱动模型选取与描边 - #6113

Merged
PigeonNian merged 2 commits into
Anvil-Dev:dev/26.1/1.6from
WhereisFff:codex/cube-data-26.1
Nov 14, 2026
Merged

PigeonNian merged 2 commits into
Anvil-Dev:dev/26.1/1.6from
WhereisFff:codex/cube-data-26.1

Conversation

@WhereisFff

@WhereisFff WhereisFff commented Nov 14, 2026 •

Copy link
Copy Markdown
Contributor

feat(cube): 接入资源包驱动的模型选取与描边

  • 将方块命名空间启用和选取排除名单迁移至统一资源配置,保留现有方块的默认模式
  • 使整机与动态模型描边遵守统一模式及运行时排除,保留预览几何和方块实体部件排除配置
  • 补充资源包覆盖顺序、旧配置迁移和 KubeJS 接入说明
  • 将砧库及关联模块更新至 2.0.0+snapshot.686,使用已发布的资源包模型选取与描边功能
  • 同步最低依赖版本与配置文档

- 将方块命名空间启用和选取排除名单迁移至统一资源配置,保留现有方块的默认模式
- 使整机与动态模型描边遵守统一模式及运行时排除,保留预览几何和方块实体部件排除配置
- 补充资源包覆盖顺序、旧配置迁移和 KubeJS 接入说明
- 配套 Anvil-Dev/AnvilLib#280 的资源规则,依赖发布前使用本地构建联调
- 将砧库及关联模块更新至 2.0.0+snapshot.686,使用已发布的资源包模型选取与描边功能
- 同步最低依赖版本与配置文档,完成铁砧工艺的数据驱动模型接入
@WhereisFff
WhereisFff marked this pull request as ready for review November 14, 2026 11:46
Copilot AI balanced review requested due to automatic review settings November 14, 2026 11:46

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

PigeonNian
PigeonNian previously approved these changes Nov 14, 2026
@PigeonNian
PigeonNian merged commit f37e512 into Anvil-Dev:dev/26.1/1.6 Nov 14, 2026
2 checks passed

@Gugle2308 Gugle2308 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

结论:本 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。


💡 两条可跟进项(非阻塞)

  1. isTargetExcluded(state) 已成恒 false 的死条件:全树已无 CubeSelection.exclude(...) / registerTargetExclusion(...) 调用(我 grep 过 head 全仓),highlight 里 || CubeSelection.isTargetExcluded(state) 与 prepare 路径都必然不命中。留着用于给第三方/未来规则留口是合理的,但若定位「完全由资源配置决定」,可删或加注释说明保留原因。
  2. 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 Gugle2308 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

结论:同一 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)。判定为无影响,两条独立证据:

  1. 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 被丢弃。
  2. 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(不变) ⚠️ 15 个 outline 方块双份描边需实机确认(收敛点在库侧 if (event.isCanceled()) return;);💡 上述「解析失败 ⇒ 全 vanilla」建议补文档 + 加载日志
ageratum 145 的 675 内嵌模块 🟢 无需处理(FML 取最新 + 675↔686 逐字节相同)
迁移映射 / 制品与 API / CI 🟢 上一份审查已证,本轮无变化

依据 duplicate-review-detection-and-stop:head 未变且已有审查时只做增量,故不重复迁移映射、outlineTarget 双份描边推导、77 条映射表等已给出的结论。后续若无新提交(head 变化),将不再发布重复审查。

@Gugle2308 Gugle2308 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

结论:同一 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 双绿 🟢 前两份审查已证,无变化
待跟进(不变) ⚠️ 双份描边实机确认;💡 「解析失败 ⇒ 全 vanilla」的文档与日志补充
动作项 无。PR 已合并且 head 未变,后续如无新提交,本 PR 不再重复审查;若需继续处理上述两条,请另开 PR(我可在新 PR 上重跑判据)

标题已符合「英文 + 中文」规范,未做改动。

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.

4 participants