Skip to content

Fix legacy tool model textures 修复旧版共振器与重戟模型材质 - #5151

Merged
PigeonNian merged 1 commit into
Anvil-Dev:dev/1.21/1.6from
WhereisFff:fix/5149-legacy-tool-textures-1.21
Oct 3, 2026
Merged

PigeonNian merged 1 commit into
Anvil-Dev:dev/1.21/1.6from
WhereisFff:fix/5149-legacy-tool-textures-1.21

Conversation

@WhereisFff

Copy link
Copy Markdown
Contributor

@Gugle2308

Copy link
Copy Markdown
Collaborator

⚠️ Dangerous command requires approval:

cd /opt/data/workspace/AnvilCraft && mkdir -p /opt/data/workspace/tree5151 && git archive rvhead5151 src/main/resources/assets src/generated/resources/assets | tar -x -C /opt/data/workspace/tree5151 &...

Reason: Security scan — [MEDIUM] Archive extraction to sensitive path: Archive command 'tar' extracts to a potentially sensitive location

Reply /approve to execute, /approve session to approve this pattern for the session, /approve always to approve permanently, or /deny to cancel.

@Gugle2308

Copy link
Copy Markdown
Collaborator

代码审查摘要 — PR #5151

操作: opened(API 当前 state=open、draft=true、merged=false)
范围: 9 个文件(0 Java,全部为内置资源包模型 JSON)/ +27 −18 / 9 个 hunk —— 与 API additions/deletions/changed_files 完全一致(diff 未截断、无 ghost 文件)
问题: fixed #5149 · 分支 fix/5149-legacy-tool-textures-1.21 → dev/1.21/1.6


根因确认 ✅(判断准确)

资源包内两类模型原本就「对不上槽位」:

  1. 9 个 ember 父模型(自含 elements,共 704 处 "texture": "#0")把 slot 0 写成了具体贴图:
    "0": "anvilcraft:item/ember_metal_resonator",particle 同值。
  2. 20 个 frost / transcendence 模型全部是纯子模型,只覆盖 slot 1:
    {"parent":"anvilcraft:item/ember_metal_resonance_axe","textures":{"1":"anvilcraft:item/frost_metal_resonator"}}

父模型的 #0 从不引用 1 ⇒ 子模型覆盖的 1 无人使用,#0 始终解析到 ember 贴图 ⇒ 开启内置包后三种金属的多合一工具与重戟全部显示余烬材质。与 issue #5149(「所有多合一工具全都是余烬材质的模型」,Minecraft 1.21.1 / 1.6.0+snapshot.2389)完全吻合。

修复机制 ✅(成立,且是最小改动)

父模型改为「0 引用 1」:"0": "#1"、"1": <本金属贴图>、"particle": "#1"。合并后的纹理表在解析时是一张平表(子条目覆盖父条目),因此:

模型 合并后 slot 1 #0 解析 particle
ember 父模型(自身) ember_metal_resonator ember ✅(与改前一致,无观感变化) ember ✅
frost 子模型 frost_metal_resonator(子覆盖) frost ✅ frost ✅(顺带修好破坏粒子,此前也固定为余烬)
transcendence 子模型 transcendence_… transcendence ✅ ✅

官方先例(1.21.1 原版资源):block/cross 的 "particle": "#cross" 在文件内未定义,由子模型 block/dandelion 的 "cross" 提供;block/template_farmland 的 "particle": "#dirt" 与各面 #dirt/#top 同样由子模型 block/farmland 提供。即「"#x" 在合并后的纹理表上递归解析、父可引用子供给的槽位」是官方既有惯用法,本 PR 只是多一跳(0 → 1)。

⚠️ 注意:这是本仓库首次在模型中使用槽位引用(git grep 全树,形如 "x": "#y" 的纹理值仅出现在这 9 个新改文件),建议实机确认一次(见测试建议)。

完整性检查 ✅

  • 9 个 ember 父模型全部覆盖;第 10 个 ember_metal_heavy_halberd_throwing.json 是纯子模型(parent: anvilcraft:item/ember_metal_heavy_halberd、无自有 textures)⇒ 继承 ember,无需修改,无漏改
  • 20 个 frost/transcendence 子模型中 18 个恰好只覆盖 1(无一个覆盖 0),2 个 *_heavy_halberd_throwing 无 textures(链到本金属 *_heavy_halberd)⇒ 覆盖键与被引用键现已对齐
  • 贴图存在性:引用的 6 张包内贴图({ember,frost,transcendence}_metal_{resonator,heavy_halberd}.png)均在包内 textures/item/ 下
  • 无 tintindex,这些物品也未注册 ItemColor(RegisterColorHandlersEventListener 只注册 PILL 与流体桶)⇒ 槽位别名不牵动着色层
  • 不动主资源:关闭资源包时行为零变化,回归面仅限开启包时

⚠️ 警告(既有问题,base 同样存在,但就在本 PR 触及的文件里)

  • old_resonator_heavy_halberd/.../ember_metal_heavy_halberd.json 的 overrides 只有 throwing 一条,缺 custom_model_data 1/2/3(spear/sword/mace);而同包 frost_metal_heavy_halberd.json、transcendence_heavy_halberd.json 与主资源 assets/anvilcraft/models/item/ember_metal_heavy_halberd.json 都是完整 4 条。HeavyHalberdItem(SPEAR_MODE=1 / SWORD_MODE=2 / MACE_MODE=3,轮盘切换时写入 CMD)⇒ 开启该包后余烬重戟切矛/剑/锤会回落成基础模型,包内 ember_metal_heavy_halberd_{spear,sword,mace}.json 对余烬本体不可达(目前仅被 frost/transcendence 子模型当父模型引用)。谐振器一族(CMD 1..4)包内/主资源完全一致,无需处理。建议顺手补齐三条 CMD(照抄 frost/transcendence 写法指向包内同名文件)。

💡 建议

  • 26.1 线同样受影响,需移植:dev/26.1/1.6(tip d30d52e80,2026-10-03)里 old_resonator_heavy_halberd 的 9 个 ember 父模型仍是 "0": <具体贴图>、子模型仍只覆盖 1 ⇒ 同一 bug 存在(该分支有持续移植流程,如 Continue porting some new content and bug fixes to 26.1 继续移植部分新内容和bug修复到26.1 #5143)。
  • 标题:内容准确,英文部分可更具体(未点明「内置资源包 + 材质继承」)。建议 Fix texture inheritance in legacy resonator/heavy halberd resource pack 修复旧版共振器与重戟资源包模型的材质继承。本次因 gh auth status 显示 token 失效(The token in /opt/data/home/.config/gh/hosts.yml is invalid)未代为修改,请作者/维护者处理(未按纪律导出凭据)。
  • format_version 在 1.9.0 / 1.21.6 / 1.21.11 间混用属 Blockbench 元数据(游戏忽略),无需处理,统一可减少后续 diff 噪音。

🟢 看起来不错

  • 最小改动方案:不重写 704 处 #0 面引用,只加一层引用;父模型自身渲染逐面不变
  • 顺带修正子模型的 particle(破坏粒子此前错用余烬贴图)
  • PR 目前为 Draft,改动面收敛、易于回滚

📋 声称验证表

声称 状态 证据
修复旧版共振器/重戟模型材质继承 (#5149) ✅ 9 个父模型 0→#1;子模型覆盖的 1 现被 #0 解析
fixed #5149 ✅ issue 现象(三金属全为余烬)根因即「子覆盖槽位无人引用」,已修
隐含:三金属全部修复 ✅ 18 个子模型覆盖键与被引用键对齐(枚举验证)
隐含:重戟各形态可用 ⚠️ 余烬重戟缺 CMD 1/2/3 overrides(既有,非本 PR 引入)

🧪 测试建议

被测目标 推荐场景 优先级
槽位引用解析(仓库首次使用) 开启 old_resonator_heavy_halberd,分别看余烬/霜冻/超越的谐振器与 4 形态工具贴图 🔴
子覆盖父槽位(合并语义) 切换谐振器 5 模式(AUTO/AXE/SHOVEL/HOE/PICKAXE)与重戟 4 形态,确认贴图随金属变化且形态正常 🔴
破坏/掉落粒子 打掉物品确认 particle 为对应金属贴图(此前固定余烬) 🟡
关闭资源包 关闭后渲染与此前一致(零回归) 🟡
余烬重戟形态 包开启下切矛/剑/锤,确认是否回落基础模型(对应 ⚠️) 🟡

结论: COMMENT(倾向 APPROVE) — 根因定位与修复方式正确、改动范围完整、对主资源与关闭包场景零回归;因 PR 仍为 Draft 且槽位引用系本仓库首次使用,建议实机三金属各一张截图确认后转正。⚠️ 的余烬重戟 CMD 缺项可顺手修,26.1 线需同步移植。


由 Hermes Agent 审查(webhook 自动投递,未额外发表评论;未导出任何凭据)

@WhereisFff
WhereisFff marked this pull request as ready for review October 3, 2026 04:37
Copilot AI balanced review requested due to automatic review settings October 3, 2026 04:37

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 reached their quota limit.

@Gugle2308

Copy link
Copy Markdown
Collaborator

💾 Self-improvement review: Patched SKILL.md in skill 'texture-asset-pr-review' (1 replacement).

@Gugle2308

Copy link
Copy Markdown
Collaborator

Verification complete. All claims cross-checked against both branches and the linked issue.

代码审查摘要 — PR #5151

操作: ready_for_review(PR 状态 pullOpened,mergeable_state: clean,未合并)
范围: 9 个文件(全部为资源包模型 JSON,无 Java/无新增/无删除)/ 144 行 diff
目标分支: dev/1.21/1.6(minecraft_version_range=[1.21,1.21.1)、mod_version=1.6.0)


🔎 根因确认(与 issue #5149 对账)

issue #5149《共振器旧模型资源包中所有模型都是余烬材质》复现步骤写明「拿出浮霜、超限的重戟、共振器,模型都是余烬的」,预期「各个材质的工具正确渲染自己材质模型」——与 diff 完全对应。

资源包结构(已在 base/head 两侧 git ls-tree 全量比对,共 30 个模型文件):

层 文件 textures
叶子(9 个,本 PR 修改) ember_metal_{resonator, resonance_axe/hoe/pickaxe/shovel, heavy_halberd, _mace, _spear, _sword} 修复前 "0": "anvilcraft:item/ember_metal_*"(硬编码)
变体包装(20 个,未改) {frost,transcendence}_* {"parent": ".../ember_metal_*", "textures": {"1": ".../frost_metal_*"}}
throwing 包装(3 个,未改) *_heavy_halberd_throwing 仅 parent + display

旧行为 = 变量 1 被覆写但父模型根本不引用 1:所有面用 "texture": "#0",而 0 被硬编码为余烬纹理,因此浮霜/超限子模型覆写的 "1" 完全失效 → 全部渲染为余烬材质。修复后叶子模型改为 "0": "#1" + "1": <本材质纹理>,子模型覆写的 "1" 得以传递到 #0 与 particle。修复方向正确,且与主资源包既有约定一致(主包同路径模型本身即 "1": "anvilcraft:item/ember_metal_gear",面全部引用 #1,子模型覆写 "1" → 同一套机制)。

✅ 已静态验证的等价性 / 完整性

  1. 余烬本体无回归:"0": "#1" → "1": "anvilcraft:item/ember_metal_resonator" 在同一文件内自解析,面引用 #0 的 90 处(pickaxe 为例)最终结果与修复前逐字相同;"particle": "#1" 同理。
  2. 叶子集合完整:全包 grep '"0": "anvilcraft:' 已无残留(none),且全包仅这 9 个叶子定义 "0",与「4 个重戟部件 + 5 个共振器多合一工具」一一对应;_throwing 为纯包装无需改。
  3. 子模型覆写键一致:20 个变体包装全部覆写 "1"(无一个覆写 "0"),父链可逐级传递(frost_heavy_halberd_throwing → frost_heavy_halberd → ember_heavy_halberd)。
  4. 纹理资源齐备:包内 6 张 PNG 与 "1" 指向的路径全部存在;texture_size 缺省(16×16)与 PNG 实际尺寸 16×16、模型最大 UV=16 三者自洽。
  5. 无循环引用:#0 → #1 → 具体路径 单层解析。

⚠️ 警告(唯一阻塞性建议)

  • 同一缺陷在 dev/26.1/1.6 上原样存在,需配套移植。 已 git fetch 到具名 ref rvbase2616 核对:该分支资源包内 同样有 9 个叶子文件硬编码 "0": "anvilcraft:item/ember_metal_*",变体包装(frost_metal_resonance_pickaxe、transcendence_resonator 等)覆写键同为 "1",父链结构一致 ⇒ 26.1 线上同一 bug 会复现。建议在本 PR 合并后开一个 26.1 端口 PR(同一 9 文件、同一 "0": "#1" 改法)。

💡 建议(非阻塞)

  • 加一道静态门禁:资源包 JSON 不过编译/数据生成管线,此类「子模型覆写 "1"、父模型不引用 "1"」的断链只能靠人工发现。可在 CI 加一条廉价校验:对包内每个 parent 指向同包叶子的包装文件,断言其覆写的纹理变量在祖先链中被引用(或更简单:断言叶子模型不出现 "0": "anvilcraft: 硬编码路径)。26.1 端口前也能先用这条命令做回归扫描。
  • 观察项(无需改动):包内 ember/frost/transcendence_metal_resonator.png 与主包同路径纹理字节完全相同,仅 *_heavy_halberd.png 与主包不同(真·旧版替换)。即本包对共振器多合一工具实际只换几何体、纹理沿用当前版;若设计意图如此则无问题,确认即可。
  • 小瑕疵(既有、非本 PR 引入):包内叶子模型 format_version 不统一(重戟族与 ember_metal_resonator 为 1.9.0、共振器工具族为 1.21.6、_throwing 为 1.21.11)。该字段 MC 不解析,可无视。

🟢 看起来不错

  • 改法极小且对称:9 个文件同一模式,"0": "#1" + "1": <concrete> + "particle": "#1",没有顺手重排/格式化无关内容(git diff --stat = 27+/18-,与 9×3 行改动吻合)。
  • 变量名 1 与主包同路径模型语义对齐,便于后续两个分支保持同构。
  • 叶子/包装分层清晰,_throwing 正确豁免。

📋 声称验证表

声称 状态 依据
fix: 修复旧版共振器和重戟模型的材质继承 (#5149) ✅ 9 个余烬叶子模型改为 "0": "#1" 并经静态推演确认覆盖 20 个变体包装
fixed #5149(浮霜/超限全部渲染为余烬) ✅ issue 复现项(frost/transcendence × 重戟/共振器)全部落在被修复的父链上
变更范围恰当(仅资源包模型) ✅ git diff --stat rvbase1216 rvhead5151 仅 9 个 JSON,无 Java/资源遗漏

结论: APPROVE —— 修复正确、最小且完整,余烬本体行为逐字不变,20 个变体包装的 "1" 覆写链路已全部核实可传递。唯一后续动作是在 dev/26.1/1.6 上开配套端口 PR(该线缺陷完全相同)。

建议标题(本次 gh auth status 显示 token 失效 —— The token in /opt/data/home/.config/gh/hosts.yml is invalid,故未自动修改):Fix legacy tool model textures for all metals 修复旧版共振器与重戟模型材质继承 —— 现标题准确,仅未点出「所有材质变体 / 继承」这一核心,改后可自助后续搜索。

🧪 验证建议

被测目标 推荐场景 优先级
内置包「Old Resonator & Heavy Halberd」 开启包后逐一取出余烬/浮霜/超限 × 共振器·多合一四件套·重戟族(含投掷态),确认各自材质(回归 issue #5149 复现步骤) 🔴
包内纹理继承链 关闭包确认主包模型不受影响;_throwing 与 custom_model_data overrides 指向的 4 个变体模型材质正确 🟡
dev/26.1/1.6 端口 PR 前用 git grep -n '"0": *"anvilcraft:' -- <pack> 断言计数为 0 🟡

由 Hermes Agent 审查

@Gugle2308

Copy link
Copy Markdown
Collaborator

⚠️ Dangerous command requires approval:

cd /tmp && curl -sL "https://piston-data.mojang.com/v1/objects/30c73b1c5da787909b2f73340419fdf13b9def88/client.jar" -o client1211.jar && ls -la client1211.jar && python3 -c "import zipfile;print('zipf...

Reason: script execution via -e/-c flag

Reply /approve to execute, /approve session to approve this pattern for the session, /approve always to approve permanently, or /deny to cancel.

@Gugle2308

Copy link
Copy Markdown
Collaborator

💾 Self-improvement review: Patched SKILL.md in skill 'texture-asset-pr-review' (1 replacement).

@PigeonNian
PigeonNian merged commit 05017a0 into Anvil-Dev:dev/1.21/1.6 Oct 3, 2026
2 checks passed
@Gugle2308

Copy link
Copy Markdown
Collaborator

PR #5151 的操作类型为 closed(且已合并,merge commit 05017a0)。按 webhook 约束第 1 条,closed/labeled 事件停止处理,不发布审查意见。

(无审查内容输出。)

@Gugle2308

Copy link
Copy Markdown
Collaborator

代码审查摘要 — PR #5151

操作: review_requested(PR 状态:open,mergeable=clean,未合并)
范围: 9 个文件 / +27 −18 行 — 全部为内置资源包模型 JSON,无 Java、无生成资源
实际分支: MC 1.21.1(dev/1.21/1.6,minecraft_version_range=[1.21,1.21.1),pack_format 34)


🔎 根因(已交叉验证,成立)

内置包 old_resonator_heavy_halberd 里 9 个余烬独立模型把贴图路径写死在纹理变量 0 上:

"textures": { "0": "anvilcraft:item/ember_metal_heavy_halberd", "particle": "…" }

而 elements 的 704 个面全部只引用 #0。包内 20 个材质变体模型(frost / transcendence 全系列)都以 parent 指向这 9 个模型并覆盖槽位 1:

{ "parent": "anvilcraft:item/ember_metal_heavy_halberd_mace", "textures": { "1": "anvilcraft:item/frost_metal_heavy_halberd" } }

这与主资源(新模型)的约定完全一致:主模型 ember_metal_resonator.json 里是 "1": "anvilcraft:item/ember_metal_gear",frost_metal_resonator.json 用子模型覆盖 1。

⚠️ 但旧模型的贴图槽只有 0、没有 1 ⇒ 20 个变体模型的 "1" 覆盖是死键,三种材质全部落到余烬贴图。这正是 #5149 报告的现象(浮霜/超限的共振器、重戟全渲染成余烬)。问题定性准确。

✅ 修复正确性验证(逐项实取,非推测)

检查 证据 结果
链式引用是否合法("0": "#1" / "particle": "#1") 下载 vanilla 1.21.1 client.jar(26836906 B,尺寸与 version json 一致)内 assets/minecraft/models/block/cube_column.json = "particle": "#side"、"down": "#end";cube_bottom_top.json、orientable_with_bottom.json 同理,vanilla 全库命中 4000+ 处「纹理变量→另一变量」 ✅ 合并后再解析引用,不会报 Unable to resolve texture due to reference chain
惯用法一致性 与 vanilla block/oak_log.json(子覆盖 side/end)↔ cube_column.json(父 "down": "#end")完全同构;也与本仓库主资源的 1 槽约定一致 ✅ 标准做法
余烬默认外观是否等价 改动前后 0/1 字面量路径完全相同(含包自带的 16×16 旧贴图 ember_metal_{heavy_halberd,resonator}.png) ✅ 余烬材质视觉不变(#5149 未投诉余烬错)
修复覆盖是否完整(最关键) 拉取 head 分支全部 30 个包内模型逐个分类 ✅ 见下表
JSON 语法 / 键自洽 / 无环 9 个文件全部 json.load 通过;keys={0,1,particle},faces 仅引用 #0,0→1→字面量无环 ✅
diff 完整性 API changed_files=9 / additions=27 / deletions=18 与 patch 完全吻合(9×(+3/−2));无 ghost file、无 No newline ✅ 无静默截断

覆盖完整性核对表(包内 30 个模型)

类别 数量 说明 状态
余烬独立模型(含 elements) 9 本 PR 修改的正是这 9 个,一个不漏(未出现常见遗漏如 _mace/_sword/_spear) ✅
ember_metal_heavy_halberd_throwing 1 仅 parent: …ember_metal_heavy_halberd,无 textures,自动继承 ✅ 无需改动
frost / transcendence 变体 20 parent + 覆盖 1;修复后覆盖由死键转为真实生效 ✅ 无需改动

🔴 关键问题

  • 无。

⚠️ 警告

  • 无阻塞项。唯一需要人工确认的是实机渲染(资源包无 CI/自动化覆盖),见下方测试建议。
  • 语义提示(符合预期,非缺陷):particle 由固定余烬贴图改为 #1,即破坏粒子随材质变化;主资源模型本身不定义 particle(0 处命中),所以这只是包内行为。若维护者希望粒子恒为余烬色,只需回退该行。

💡 建议(非阻塞)

  • 可去掉一层间接:既然 0 只是 1 的别名,直接把 704 处 "texture": "#0" 改为 "#1" 并删除 "0" 键,写法与主资源模型对齐、少一层解析。当前实现完全正确,纯风格取舍。
  • PR 描述过简(仅两行 fix:/fixed #5149),建议补一句「变体模型的 1 覆盖此前因旧模型未暴露 1 槽而失效」的根因,便于回溯。
  • 建议标题(gh CLI 未认证 — hosts.yml token invalid,本次未自动修改):Fix legacy tool model texture inheritance in old_resonator_heavy_halberd pack 修复内置旧版共振器/重戟资源包的模型材质继承

🟢 看起来不错

  • 改动最小且精准命中根因,无越界改动(未触碰另两个内置包、未改 Java、未重排文件)。
  • 采用与 vanilla / 主资源统一的「父模型暴露别名槽 + 子模型覆盖」约定,未来新增材质只需在包内加一个变体文件即可自动生效。
  • 9 个独立模型全部覆盖;20 个变体无需改动——修复面与根因面严格对应。

📋 声称验证表

声称 状态 证据
fix: 修复旧版共振器和重戟模型的材质继承 (#5149) ✅ 9 个独立旧模型 0 → #1(faces 仍 #0,链式解析生效);20 个变体的 1 覆盖由死键转为生效
fixed #5149 ✅ issue #5149(1.21.1 / 1.6.0+snapshot.2389,「所有多合一工具全是余烬材质」)根因与修复一致;余烬默认渲染字节级不变,浮霜/超限正确路由到各自旧贴图

🧪 测试建议(资源 PR,无自动化覆盖 → 建议实机验收)

被测目标 验证场景 优先级
old_resonator_heavy_halberd 包 启用该内置资源包,分别取出余烬 / 浮霜 / 超限的共振器 + 重戟(含剑/矛/锤/投掷及斧/镐/锹/锄变体),期望:各材质显示本材质旧版贴图,无紫黑(missing texture);日志无 Unable to resolve texture due to reference chain 🔴
包外回归 关闭该资源包:新模型外观不受影响(本 PR 仅改包内文件) 🟡
其它内置包 outline_cullface / transparent_cauldron 启用后无变化(无继承关系) 🟢

结论: APPROVE ✅ — 根因定位准确、修复方式与 vanilla/主资源约定一致、9 个独立模型全覆盖无遗漏、diff 干净(+27/−18),无阻塞问题。建议合并前按上表做一次三材质实机确认。


由 Hermes Agent 审查

@Gugle2308

Copy link
Copy Markdown
Collaborator

💾 Self-improvement review: Patched SKILL.md in skill 'texture-asset-pr-review' (1 replacement).

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.

[Bug] 共振器旧模型资源包中所有模型都是余烬材质

4 participants