Skip to content

fix(block): fix advanced anvils consume too much repair items 修复铁砧修复工具时消耗数量异常 - #4341

Open
YocyCraft wants to merge 1 commit into
Anvil-Dev:dev/1.21/1.6from
YocyCraft:dev/1.21/anvil_fix
Open

fix(block): fix advanced anvils consume too much repair items 修复铁砧修复工具时消耗数量异常#4341
YocyCraft wants to merge 1 commit into
Anvil-Dev:dev/1.21/1.6from
YocyCraft:dev/1.21/anvil_fix

Conversation

@YocyCraft

Copy link
Copy Markdown
Contributor

@Gugle2308

Copy link
Copy Markdown
Collaborator

⚠️ Dangerous command requires approval:

curl -sL "https://api.github.com/repos/Anvil-Dev/AnvilCraft/issues/4334" | python3 -c "import json,sys; d=json.load(sys.stdin); print('TITLE:', d.get('title')); print('BODY:', (d.get('body') or '')[:2...

Reason: Security scan — [HIGH] Pipe to interpreter: curl | python3: Command pipes output from 'curl' directly to interpreter 'python3'. Downloaded content will be executed without inspection.
Safer: tirith run https://api.github.com/repos/Anvil-Dev/AnvilCraft/issues/4334 — or: vet https://api.github.com/repos/Anvil-Dev/AnvilCraft/issues/4334 (https://getvet.sh); 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

分析完成,信息足够写出审查意见。汇总所有已验证的事实:

分析结论汇总:

  • PR 在 4 个高级铁砧菜单(Ember/Frost/Royal/Transcendence)的 createResult() 开头加了完全一致的空左槽守卫 → 委托给原版 super.createResult()
  • AnvilMenuResult.createResult() 本身已有空左槽守卫(第 80-84 行,字段复位是 2026-07-17 Recipe change and more improvement and bug fix 调整配方以及一些其它优化和修bug #4177 才补上的)
  • 原版 onTake(NeoForge patch 确认):repairItemCountCost > 0 时按数缩减,== 0 时清空整个右槽
  • mayPickup 自定义子句读取 result.noCostInRenaming && result.onlyRenaming,而 vanilla 路径不会复位 onlyRenaming
  • multiphase mixin 不冲突;repairUsingItem 循环本身按需计数正确

代码审查摘要 — PR #4341

操作: opened
范围: 4 个文件(4 Java, 0 新增, 0 删除)/ 60 行 diff
内容: EmberAnvilMenu / FrostAnvilMenu / RoyalAnvilMenu / TranscendenceAnvilMenucreateResult() 开头各加 4 行:左槽为空时委托原版 super.createResult() 并返回。

🔴 关键

无。

⚠️ 警告

  • FrostAnvilMenu / TranscendenceAnvilMenu — 空左槽路径不再复位 result.onlyRenamingmayPickup 读到的状态会过期
    mayPickup 自定义子句为 super.mayPickup(...) || this.result.noCostInRenaming && this.result.onlyRenaming。旧自定义路径每次调用 result.createResult() 都会把 onlyRenaming 复位为 false(AnvilMenuResult 第 76 行);而 super.createResult()(原版路径)完全不触碰这个字段。对开启了 noCostInRenaming() 的 Frost/Transcendence:一次免费改名计算把 onlyRenaming 置 true 后,只要左槽一空,mayPickup 的自定义子句就恒为 true。当前因原版空槽路径同时清空了结果槽而不会实际取走物品(惰性无害),但这是把菜单可拾取性耦合到了计算对象的过期状态上——建议在守卫分支里显式 this.result.onlyRenaming = false(或抽取一个重置方法),保持与自定义路径对称。

  • repairItemCountCost 语义不对称(与 [Bug] 铁砧工艺系列铁砧修复工具时材料消耗异常 #4334 同类隐患的潜在复燃点)
    旧自定义路径空左槽时会把 repairItemCountCost 复位为 0(第 75 行);原版 AnvilMenu.createResult 只在非空分支内重置该字段(NeoForge patch 确认),空左槽时保留上一次的陈旧值。而原版 onTake 的消费逻辑是:repairItemCountCost > 0 时按数缩减右槽,== 0 时清空整个右槽。修复后取走修复结果(左槽变空)的瞬间,repairItemCountCost 会停留在上一次的修复数而不是 0——虽然当前流程因结果槽同步被清空而不会触发误消费,但这个陈旧值与 onTake 的全清分支组合是 [Bug] 铁砧工艺系列铁砧修复工具时材料消耗异常 #4334 所描述的"材料一次性全没"的经典机制。建议在守卫里同步 this.repairItemCountCost = 0,让空左槽状态与自定义路径完全等价。

💡 建议

  • 守卫条件与 AnvilMenuResult 内部早退条件不完全一致:自定义路径对 inputLeft.isEmpty() || !canStoreEnchantments(inputLeft) 都返回空结果,菜单守卫只拦 isEmpty()。两条路径在"左槽不可附魔"下行为恰好一致(都出空结果),无功能缺口,但建议统一条件以免未来自定义路径新增空左槽分支时失配。
  • "fixed [Bug] 铁砧工艺系列铁砧修复工具时材料消耗异常 #4334" 的验证说明:当前分支的 AnvilMenuResult 已自带空左槽守卫(且 Recipe change and more improvement and bug fix 调整配方以及一些其它优化和修bug #4177 补了字段复位),自定义路径与 vanilla 路径在空左槽下产出的结果/经验/材料数等价——本次修复的实际行为差异很小(主要是 vanilla 尾部自带的 broadcastChanges() 与不复位 result 对象状态)。issue 报的 snapshot.2109 可能早于 Recipe change and more improvement and bug fix 调整配方以及一些其它优化和修bug #4177(2026-07-17),建议在 PR 描述中补充复现/验证步骤(如:64 个修复材料 + 需 2 个材料的工具 → 取走后断言仅消耗 2 个),以便回归测试确认修复点。
  • 4 个菜单的 guard 是复制粘贴的 4 份相同代码,未来若需同步修改(如补字段复位)容易漏改——可考虑抽到共享父类或 HammerOpenedAnvilMenu 接口的 default 方法。

🟢 看起来不错

  • 4/4 高级铁砧菜单覆盖一致(Ember/Frost/Royal/Transcendence),改动最小、位置正确(createResult 开头)。
  • 未动 PortableAnvilMenu(纯原版逻辑,无此问题)和 CelestialForgingAnvilMenu(独立 AbstractContainerMenu 体系),范围精准。
  • AnvilMenuMixin 的 multiphase 注入无冲突(该 mixin 在非双 multiphase 输入时直接放行原版逻辑)。
  • repairUsingItem 的消耗循环本身按需计数(以所需数量为上限,不以堆叠数为上限),正常修复路径的消耗量计算是正确的。

📋 声称验证表

声称 状态 说明
修复 #4334(修复材料消耗过多) ⚠️ 部分 空左槽委托原版逻辑是合理防御,但当前分支自定义路径空左槽行为已等价;核心消耗逻辑(onTake + repairItemCountCost)未改动,建议补充复现验证

🧪 测试建议

被测目标 推荐测试场景 优先级
4 个 AnvilMenu.createResult() 64 材料 + 需少量材料的工具 → 取走结果 → 断言仅消耗所需数量(repairItemCountCost 🔴
取走结果后(左槽空) 结果槽为空、cost=0、repairItemCountCost 被正确复位 🔴
Frost/Transcendence 免费改名 改名后左槽清空 → mayPickup 不得允许空结果槽拾取 🟡
EmberAnvilMenu(锤子打开变体) openedHammerSource 路径下走一遍修复-取走-清空流程 🟡
修复后再次放入新工具 第二次修复只消耗新工具所需数量(无陈旧状态残留) 🟡

结论: APPROVE(建议合并) — 改动最小且安全,4 菜单一致;两条警告(onlyRenaming/repairItemCountCost 在空左槽路径不复位)为防御性改进,建议作者顺手在守卫里补上字段复位,使空左槽行为与自定义路径完全对称,彻底闭合 #4334 的"材料全消"机制。


由 Hermes Agent 审查

@Gugle2308

Copy link
Copy Markdown
Collaborator

💾 Self-improvement review: Patched SKILL.md in skill 'minecraft-mod-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] 铁砧工艺系列铁砧修复工具时材料消耗异常

2 participants