Fix Anvil Hammer not rotating blocks 修复铁砧锤无法旋转方块的问题 - #4661
Conversation
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. Reply |
Reason: script execution via -e/-c flag Reply |
|
FlexibleMultiPartBlock 方块(如 TradingStationBlock、LargeLaserBlock、AccelerationRingBlock)都实现 现在我已完全掌握所有链路。整理审查结论。先确认一处细节—— 检查完成。现在我对整个改动有了完整理解,可以输出审查意见了。 代码审查摘要 — PR #4661操作: synchronize 改动概览
🔴 关键:短按无 GUI 可旋转方块会双重旋转文件: 新代码短按路径对无 GUI 且无交互消费的可旋转方块(如
服务端两条链路都会旋转:
验证链(基于
另外: 建议:短按路径二选一——要么只发
|
| 声称 | 状态 | 对应实现 |
|---|---|---|
| 修复 1:与功能方块交互不再立即打开 GUI | ✅ | hammerInteraction → interactWithBlock 返回 true 时不发旋转包 |
| 修复 2:可旋转非功能方块短按可旋转 | 能旋转,但双转(HammerUsePacket + HammerChangeBlockPacket 叠加) | |
| 修复 3:长按可打开旋转轮盘 | ✅ | wheel 构建逻辑保留,RELEASE 时才判定短按 |
| 仅影响 26.1(请求拉 26.1 分支) | ✅ | 分支目标 dev/26.1/1.6 |
结论: REQUEST_CHANGES — 修复方向正确,但短按路径会同时发送 HammerUsePacket(服务端 change() 旋转)和 HammerChange*Packet(服务端 setBlock 旋转),对无交互消费的可旋转方块(正是 issue 2 的目标场景)造成双重旋转,且两种旋转序列(HammerRotateBehavior 自定义 vs cycle() 枚举序)方向不一致。需要选择单一旋转链路后再合并。
🧪 测试建议
| 被测目标 | 推荐测试场景 | 优先级 |
|---|---|---|
processHammerPress RELEASE 短按分支 |
短按无 GUI 可旋转方块(如溜槽)→ 断言只旋转 1 次(服务端只收 1 个旋转包) | 🔴 |
hammerInteraction 状态残留 |
长按方块 A 中途提前 return → RELEASE 断言不发包/不误发 | 🔴 |
sendHammerChangeBlockPacketToServer |
FlexibleMultiPartBlock 无 FACING 属性时静默、FACING 与 HORIZONTAL_FACING 分支 |
🟡 |
短按 BlockComparatorBlock |
交互消费(PRECISE 切换)时不得再发旋转包 | 🟡 |
| 长按旋转轮盘 | 轮盘选中状态 → 只发 1 个 HammerChange*Packet |
🟢 |
由 Hermes Agent 审查
|
💾 Self-improvement review: Patched SKILL.md in skill 'network-packet-pr-review' (1 replacement). · Patched SKILL.md in skill 'github-webhook-pr-review' (1 replacement). |
Reason: script execution via -e/-c flag Reply |
|
重要修正: 受双重旋转影响的方块范围:
双重旋转确认必现:短按这些方块时,服务端 还有一个细节:observer/lightning_rod 的 现在验证 base 中短按是否有同样问题(base 短按只发 HammerUsePacket → 单次 change 旋转 ✅ 无双旋)。base 短按: 嗯,这让我重新理解 bug 2:base 短按普通可旋转方块(如活塞,无 IHammerChangeable、无 tag)→ HammerUsePacket → 服务端 change → EMPTY → 不旋转 ✅ bug 2 成立("非功能方块无法旋转")。而 head 用 HammerChangeBlockPacket(cycle 直接 setBlock)→ 旋转 ✅ 修复。但 head 对 IHammerChangeable 方块引入双重旋转(base 是单次 change)。 所以 head 的修复方向正确但引入了双包竞态。 最后,检查一下 还有一个边缘情况: 现在整理最终审查。还要确认 head 中 以及代码风格:diff 中 还有 最终审查输出结构:
关于标题:PR 标题 "Fix Anvil Hammer not rotating blocks 修复铁砧锤无法旋转方块的问题" 准确清晰,无需修改。 让我最后确认 head 中 再确认一个关键点:短按 release 时 但注意: 好,还有一个真正的隐患:短按普通方块(EMPTY change)时,HammerUsePacket 服务端 最终:确认 好,写审查。另外按 skill 要求给出测试建议(可选)。以及不需要改标题。所有关键验证完成。我已完整掌握修复逻辑、bug 机制和引入的新问题。整理最终审查意见: 代码审查摘要 — PR #4661操作: opened(审查) 背景与根因分析26.1 移植(#3491)把 1.21 的
head 的修复思路(wheel 立即打开 + 释放时按按住时长分发)方向正确,能修复上述三个问题,但引入了一个严重的新问题。 🔴 关键问题1. 短按可旋转方块时双包发送 → 服务端双重旋转 短按(≤4 ticks)释放时:
服务端会处理两个包:
受影响方块(
且两次旋转方向不一致: 建议:短按路径( 2. 短按轮盘闪现(UX 回归) 建议:wheel 延迟到
|
| PR 声称 | 状态 | 说明 |
|---|---|---|
| 与功能方块交互总是立即打开界面 | ✅ 修复 | 长按可旋转方块改走 wheel;property==null 立即交互语义保留 |
| 短按可旋转非功能方块无法旋转 | ✅ 修复(有副作用) | cycle 旋转生效,但 IHammerChangeable 方块双旋(🔴 问题 1) |
| 长按无法打开旋转轮盘 | ✅ 修复 | wheel 按下帧即打开,长按释放触发选中 action |
结论: REQUEST_CHANGES — 修复方向正确、三个 bug 均已覆盖,但短按路径双包发送导致 IHammerChangeable 方块(滑动轨道、观察者、避雷针、重型铁门等)每次短按旋转两次,且短按轮盘闪现是明显 UX 回归。建议先修复双包问题(HammerUsePacket 移出短按路径)再合并。
🧪 测试建议
| 被测目标 | 推荐测试场景 | 优先级 |
|---|---|---|
openHammerWheel + release 短按路径 |
对 SlidingRailBlock/observer 短按一次,断言服务端只收到一个旋转包、方块只旋转一格 | 🔴 |
| 短按 vs 长按分发 | 按下 2 ticks 释放(短按)与 6 ticks 释放(长按),断言短按 cycle 一格、长按 wheel 选中项生效 | 🟡 |
| 有菜单方块(漏斗/发射器) | 短按断言打开菜单且不旋转;长按断言 wheel 旋转且不开菜单 | 🟡 |
| 静态字段清理 | release 后断言三个 hammerWheel* 字段为 null;模拟 player==null 中断后下次点击无残留误触发 | 🟢 |
由 Hermes Agent 审查
|
💾 Self-improvement review: Patched SKILL.md in skill 'github-webhook-pr-review' (1 replacement). |
|
关键确认完成。 审查意见已成形。这是 draft PR,按 skill 规则「converted_to_draft → 仅报严重问题,省略风格建议,以 comment 级别发布」。标题「Fix Anvil Hammer not rotating blocks 修复铁砧锤无法旋转方块的问题」准确(修复不可旋转问题),无需修改。 汇总审查发现: 代码审查摘要 — PR #4661操作: converted_to_draft 核心变更
🔴 关键问题
|
| 声称 | 状态 | 说明 |
|---|---|---|
| 与功能方块交互不再立即打开界面 | 短按功能方块仍开 GUI(HammerUsePacket 无条件发);长按轮盘不受影响 | |
| 可旋转非功能方块短按可旋转 | ✅ | fallback HammerChangeBlockPacket 生效(普通方块);但 IHammerChangeable 方块双路径叠加 |
| 可旋转方块长按打开轮盘 | ✅ | openHammerWheel 长按路径构建轮盘 + onHoldKeyPressed 正常 |
结论: REQUEST_CHANGES — 修复方向正确(短按 fallback + 长按轮盘分离),但 hammerInteraction 无条件发送 HammerUsePacket 导致:(1) 功能方块短按仍开 GUI(声称 #1 未兑现);(2) IHammerChangeable 方块短按服务端双路径叠加(自定义 change 被 cycle 覆盖 + 统计/音效双触发)。建议短按对非功能方块仅发 HammerChangeBlockPacket、抑制 HammerUsePacket,并恢复短按不打开轮盘。
审查完毕。这是 draft PR,我按规则仅报关键问题、省略风格类建议。核心结论:需要修改——hammerInteraction 无条件发 HammerUsePacket 造成双路径叠加,且声称修复的「功能方块界面」问题未真正解决。
|
💾 Self-improvement review: Patched SKILL.md in skill 'network-packet-pr-review' (1 replacement). · Patched SKILL.md in skill 'github-webhook-pr-review' (1 replacement). |
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. Reply |
|
关键分析点已齐。对照 base 分支(dev/26.1/1.6 的 FETCH_HEAD)确认这是 26.1 分支专有 bug、以及 AnvilLib 的 |
Reason: script execution via -e/-c flag Reply |
Reason: script execution via -e/-c flag Reply |
|
💾 Self-improvement review: Patched references/client-event-order-double-packet.md in skill 'github-webhook-pr-review' (1 replacement). · Patched SKILL.md in skill 'github-webhook-pr-review' (1 replacement). |
Reason: script execution via -e/-c flag Reply |
Reason: script execution via -e/-c flag Reply |
|
I now have a complete understanding of the fix. Let me verify one last edge case — the 代码审查摘要 — PR #4661操作: 背景与根因我对比了 base(
🔴 关键无阻塞性关键问题。修复逻辑正确,行为等价性已验证。
|
| 声称 | 状态 | 对应文件 |
|---|---|---|
| 修复交互方块后跳出铁砧界面 | ✅ | WheelLifecycleEventListener.processHammerPress (defer 到 release) |
| 短按可旋转方块可旋转 | ✅ | processHammerPress release 分支 (interactWithBlock false → HammerChangeBlockPacket) |
| 长按可打开旋转轮盘 | ✅ | openHammerWheel (轮盘条件 >=4 移入 release) |
| 26.1 专修(不回移植 1.21) | ✅ | 目标分支 dev/26.1/1.6 |
🧪 测试建议
| 被测目标 | 推荐测试场景 | 优先级 |
|---|---|---|
processHammerPress release 分支 |
单次右键可旋转方块 → 旋转生效;交互方块 → 仅打开界面不跳铁砧 | 🔴 |
openHammerWheel property==null 路径 |
非可旋转方块右键 → 正确触发 HammerUsePacket 交互 |
🟡 |
sendHammerChangeBlockPacketToServer |
FlexibleMultiPartBlock 无 FACING 属性 → 不发包 | 🟢 |
| 快速切换目标 | 轮盘打开时快速右键另一方块 → release 使用正确快照 | 🟡 |
结论: APPROVE — 修复逻辑正确,行为等价性验证通过,服务端校验完整。两个警告均为非阻塞性的边缘竞态,可在后续迭代优化。
由 Hermes Agent 审查
|
|
|
python 被禁用,我直接用 diff 内容 + 基础文件构造新版本核心函数。基于 diff 的改动,新 现在从 diff 的完整上下文中梳理最终逻辑。关键部分重读 diff 第 25-77 行(新的 openHammerWheel)和第 124-158 行(新的 processHammerPress): 新
新
这解决了 3 个 bug。现在深挖潜在问题: 问题 A:轮盘选中条目后, 问题 B:短按(<4 tick)时 但等等—— 问题 C: 问题 D: 问题 E(关键):猜测性循环的信任风险
问题 F:短按交互方块(interactWithBlock 返回 true)时不再发 HammerUsePacket? 重新理解 Bug 1: 手持铁砧锤右键功能方块(有 GUI,如箱子)→ 客户端 实际上更可能:旧代码 property==null 分支在 我怀疑 Bug 1 的根因是:旧代码 property==null 时 关键审查点收敛为: 🔴 关键问题:
💡 建议:
现在验证编译正确性: 还有一个重要点:diff 第 69-73 行——新代码把 发现一个真正的逻辑漏洞: 看新代码第 69-73 行区域 + 第 54-56 行: if (property == null) {
return WheelLifecycleEventListener.hammerInteraction.get();
}
if (player == null) return false;
...
if (gameTime - WheelLifecycleEventListener.hammerKeyTime >= 4) {
if (WheelLifecycleEventListener.hammerWheelCache.isEmpty()) return false;
CONTROLLER.onHoldKeyPressed(...);
hammerKeyWasDown = true;
}
hammerWheelTargetPos = targetPos;
hammerWheelNextBlockState = level.getBlockState(targetPos).cycle(property);
return true;当 等等: 不对,重看新代码流程(property != null 时):
关键:第 4 步的 shift / !mayBuild / !ableToUse / possibleStates.isEmpty() 分支都直接 return,不赋值 hammerWheelTargetPos/NextBlockState! 若玩家长按 ≥4 tick 且(shift 或不能建造或不可用),RELEASE 时 但若玩家短按 <4 tick(立即释放):
若短按且 possibleStates.isEmpty():
若短按且 shift:
若短按且 !mayBuild / !ableToUse:
所以赋值只在构建成功(cache 非空)或 <4 时发生——逻辑上是安全的。但有个微妙问题:
问题 G: 问题 H: 问题 I(真正的 bug 候选):RELEASE 时 问题 J: 结论: 逻辑上 3 个 bug 修复都是合理的,边界处理基本正确。主要审查意见集中在:
再检查一件事:diff 中 还需要确认 最后一个潜在问题:
同一个方块,短按旋转方向与长按轮盘选择的 cycle 顺序可能不同——但轮盘显示的是 检查基础代码:基础代码 property != null 且 对 FACING:旧 = HammerRotateBehavior.rotate(WEST→UP→DOWN→NORTH→EAST→SOUTH 特殊顺序);新 = WEST 状态下:旧 → UP;新 → EAST。旋转方向不一致! 这是一个真实的行为差异——虽然「旋转」功能恢复了(Bug 2 修复),但旋转的循环顺序变了,可能与玩家的预期(以及 HammerRotateBehavior 的文档行为)不符。不过:26.1 的轮盘 建议: 短按猜测用 好,审查意见已足够充分。整理输出。先确认 PR 标题是否准确:标题「Fix Anvil Hammer not rotating blocks 修复铁砧锤无法旋转方块的问题」——修复了 3 个问题(含旋转),标题 OK,无需修改。 最后再快速核对 diff 中的一处:新代码第 46-53 行 哦!我明白了—— 但 Bug 1 的修复核心明确:PR 把 property==null 分支改为「交互成功才发 HammerUsePacket,且只在 RELEASE 时交互一次」。若旧代码的问题是每次 RightClickBlock 都执行 interactWithBlock + 发包(按住时重复触发),PR 改为 RELEASE 时一次性交互——消除了重复打开/重复发包。这是合理的修复方向。 好,输出审查。结论:APPROVE(逻辑正确,修复了 3 个 bug),带 2-3 个 等等,还要确认一个编译问题:新代码
还有一处:新代码第 34 行 最终审查输出。分析完成。所有关键路径已通过基础分支代码( 代码审查摘要 — PR #4661操作: synchronize/edited 修复机制梳理Bug 1(功能方块交互后跳回铁砧界面): 旧代码 Bug 2(短按无法旋转): 旧代码短按( Bug 3(长按无法打开轮盘): 旧代码
|
| 声称 | 状态 | 对应实现 |
|---|---|---|
| 修复与功能方块交互后跳出铁砧界面 | ✅ | openHammerWheel property==null 分支改为惰性交互 + 条件发包 |
| 修复短按可旋转方块无法旋转 | ✅ | RELEASE 时 <4 + 交互失败 → sendHammerChangeBlockPacketToServer |
| 修复长按无法打开旋转轮盘 | ✅ | > 4 → >= 4 边界修正 |
| Fixes #4459 | ✅ | 三处修复均落在 WheelLifecycleEventListener 核心状态机 |
🧪 测试建议
| 被测目标 | 推荐测试场景 | 优先级 |
|---|---|---|
openHammerWheel + processHammerPress |
短按(<4t)/ 长按(≥4t)/ 边界(恰 4t)的轮盘打开与旋转行为;possibleStates 空、shift、无权限的短路路径 |
🔴 |
AnvilHammerItem.interactWithBlock |
useItemOn 返回 TRY_WITH_EMPTY_HAND/PASS/FAIL/CONSUME 时与 useWithoutItem 的组合矩阵 |
🟡 |
| 猜测旋转方向 | 对比 cycle(property) 与 HammerRotateBehavior.rotate 在 FACING=WEST 等状态下的结果差异 |
🟡 |
结论: APPROVE(建议合并) — 三个 bug 的修复逻辑正确、边界处理严谨,TRY_WITH_EMPTY_HAND 回退与 >= 4 边界均为合理修复。
由 Hermes Agent 审查
|
I reached the maximum iterations (90) but couldn't summarize. Error: <title>504 Gateway Time-out</title>504 Gateway Time-outopenresty |
|
💾 Self-improvement review: Patched SKILL.md in skill 'github-webhook-pr-review' (1 replacement). |
Reason: script execution via -e/-c flag Reply |
|
💾 Self-improvement review: Patched SKILL.md in skill 'github-webhook-pr-review' (1 replacement). |
|
💾 Self-improvement review: Patched references/client-event-order-double-packet.md in skill 'github-webhook-pr-review' (1 replacement). · Patched SKILL.md in skill 'github-webhook-pr-review' (1 replacement). |
Reason: script execution via -e/-c flag Reply |
|
关键确认:
所有证据齐备。写最终审查报告: 代码审查摘要 — PR #4661操作: synchronize 变更概览
🔴 关键问题1. 短按旋转路径绕过
2.
3.
|
| 声称 | 状态 | 对应实现 |
|---|---|---|
| 修复与功能方块交互后跳出铁砧锤界面 | ✅ | TRY_WITH_EMPTY_HAND 回退 + 交互延迟到 RELEASE |
| 修复可旋转非功能方块短按无法旋转 | ✅ | RELEASE 短按 fallback HammerChangeBlockPacket(但旋转语义改变,见问题 1) |
| 修复可旋转方块长按无法打开轮盘 | ✅ | >= 4 守卫 + hammerKeyWasDown 延迟置位 |
| Fixes #4459 | ✅ | issue 确认"右键可旋转方块无法呼出转盘" |
结论: REQUEST_CHANGES — 修复方向正确(TRY_WITH_EMPTY_HAND 与长按守卫是真正的根因修复),但短按旋转路径从 change() 切换到 HammerChangeBlockPacket 引入了行为回归(PumpBlock 网络不同步、旋转方向改变、click 触发器丢失)。建议要么保留短按走 HammerUsePacket(服务端 change()),要么在 HammerChangeBlockPacket 中补齐所有 IHammerChangeable.change() 的特殊逻辑(至少 PumpBlock.markDirty 必须保留)。
让我重新审视一个点确保结论准确:新短按路径到底发不发 HammerUsePacket?hammerInteraction.get() 中 interactWithBlock 返回 true 才发 HammerUsePacket。对非功能可旋转方块(无 provider、useItemOn/useWithoutItem 均 PASS)→ interactWithBlock false → 不发 HammerUsePacket → 发 HammerChangeBlockPacket ✅ 我的分析正确。
最后确认 cycle(FACING_HOPPER) 枚举序:FACING_HOPPER 是 DirectionProperty(Direction 枚举序)。Direction 枚举序是 DOWN, UP, NORTH, SOUTH, WEST, EAST(26.1 与历代一致)。cycle 从当前值取 values()[ordinal+1 % 6]。✅
报告完成。
|
💾 Self-improvement review: Skill 'tool-block-interaction-pr-review' created. · Patched SKILL.md in skill 'tool-block-interaction-pr-review' (1 replacement). |
|
所有验证完成。 现在输出最终审查。这是 synchronize 操作(PR 更新推送),需要完整审查。核心结论:修复方向正确,短按路径保留了 代码审查摘要 — PR #4661操作: synchronize(PR 更新推送) 变更概览
修复验证(对照 #4459 三个症状)
✅ TRY_WITH_EMPTY_HAND 处理正确
|
| 声称 | 状态 | 对应实现 |
|---|---|---|
| 修复交互后跳出铁砧界面 | ✅ | anvilHammerUseItem(双端 RightClickItem 取消) |
| 修复短按无法旋转 | ✅ | RELEASE 一次性 hammerInteraction.get() → HammerUsePacket |
| 修复长按无法开轮盘 | ✅ | >= 4 守卫 + onHoldKeyPressed 时机修正 |
结论: APPROVE — 三个症状的修复方向与实现均正确,且相对早期版本保留了 change() 自定义副作用(PumpBlock/ChuteBlock 语义未丢失)。警告 1/3 为低概率或既有边界,不阻塞合并。标题已准确描述修复内容,无需修改。
由 Hermes Agent 审查
|
💾 Self-improvement review: Patched SKILL.md in skill 'tool-block-interaction-pr-review' (1 replacement). |
|
验证全部完成。PR 标题已是英中双语格式,无需修改。 代码审查摘要 — PR #4661操作: synchronize(open) 🔴 关键问题未发现。
|
| 声称 | 状态 | 对应实现 |
|---|---|---|
| 功能方块交互后不再跳出便携铁砧界面 | ✅ | WheelLifecycleEventListener 短按 RELEASE 一次性交互 + hammerKeyTime 守卫 |
| 短按可旋转方块无法旋转(修复) | ✅ | RELEASE < 4 分支调 hammerInteraction.get() → HammerUsePacket |
| 长按无法打开旋转轮盘(修复) | ✅ | >= 4 守卫 + onHoldKeyPressed 仅在长按分支 |
| 移植 1.21 副手方块放置逻辑 | ✅ | shouldPlaceOffhandBlock + 双端 anvilHammerUseItem(与 1.21 分支 AnvilHammerItem.shouldPlaceOffhandBlock 逐行一致) |
| Fixes #4459 | ✅ | issue 仍 open,PR 描述关联 |
🧪 测试建议
| 被测目标 | 推荐测试场景 | 优先级 |
|---|---|---|
WheelLifecycleEventListener.processHammerPress |
短按(<4 tick)/ 长按(≥4 tick)边界、RELEASE 无重复触发、按住期间每 tick 不重复发包 | 🔴 |
AnvilHammerItem.interactWithBlock |
TRY_WITH_EMPTY_HAND 回退 useWithoutItem、非 PASS 交互判定、功能方块 GUI 打开 |
🔴 |
SimpleChuteBlock.change() |
简易溜槽 vs 磁性/简易磁性溜槽嘴对嘴破坏(新增覆盖)、普通旋转序 WEST→DOWN→NORTH | 🟡 |
AnvilHammerItem.shouldPlaceOffhandBlock |
副手空/锤子/非 BlockItem、黑名单/炼药锅/可拆除方块、可修改方块 | 🟡 |
HammerChangeFlexibleMultiPartBlockPacket |
轮盘选中 FACING/HORIZONTAL_FACING/无朝向属性三路分支 | 🟢 |
结论: APPROVE — 修复方向正确,短按保留 HammerUsePacket(自定义 change() 副作用完整),长按/短按时序守卫无重叠,副手放置移植与 1.21 分支一致。唯一需确认的是 SimpleChuteBlock.change() 嘴对嘴检测扩展至磁性变体是否为有意行为(commit 2b03579 声称是),建议作者在描述中注明。
由 Hermes Agent 审查
|
💾 Self-improvement review: Patched SKILL.md in skill 'tool-block-interaction-pr-review' (1 replacement). · Patched references/chute-family-helper-consolidation.md in skill 'tool-block-interaction-pr-review' (1 replacement). · Patched references/pr4661-hammer-path-switch-session.md in skill 'tool-block-interaction-pr-review' (1 replacement). |
|
I now have a complete, verified picture of the PR. All paths, imports, and base-versus-head states are confirmed. Let me compose the review. 代码审查摘要 — PR #4661操作: synchronize(5 文件,130+/58-,约 359 行 diff;PR 分支 8 commits, 🔴 关键无阻塞问题。短按路径判定:RELEASE 分支
|
| 声称 | 状态 | 对应文件 |
|---|---|---|
| 修复:与功能方块交互打开界面后,等待一小段时间后跳出铁砧锤铁砧界面 | ✅ | WheelLifecycleEventListener(hammerInteraction lambda + RELEASE 一次性交互) |
| 修复:可旋转非功能方块短按无法旋转 | ✅ | WheelLifecycleEventListener(RELEASE < 4 触发 interactWithBlock → HammerUsePacket → useBlock) |
| 修复:可旋转方块长按无法打开旋转轮盘 | ✅ | WheelLifecycleEventListener(>= 4 守卫 + hammerKeyWasDown) |
| 摘取 #4669(简易溜槽 vs 磁性/简易磁性溜槽嘴对嘴破坏) | ✅ | SimpleChuteBlock.change()(isChuteBlock + getFacing 归拢) |
| 移植 1.21 分支的副手方块放置逻辑 | ✅ | AnvilHammerItem.shouldPlaceOffhandBlock + ClientBlockEventListener/BlockEventListener.anvilHammerUseItem(RightClickItem cancel) |
| Fixes #4459 | ✅ | 上述修复的根因对应 |
结论: APPROVE
修复方向正确,短按保留 HammerUsePacket/change() 完整副作用链,长按轮盘时序正确,副手放置双端对称,静态字段清理完整。上述
🧪 测试建议
| 被测目标 | 推荐测试场景 | 优先级 |
|---|---|---|
processHammerPress RELEASE |
短按(<4 tick)旋转 1 次且仅 1 次;长按(≥4 tick)开轮盘且 RELEASE 不再旋转 | 🔴 |
openHammerWheel 交互 lambda |
副手方块 + 普通不可修改方块:轮盘不打开、方块放置成功、HammerUsePacket 是否仍发出 | 🔴 |
interactWithBlock TRY_WITH_EMPTY_HAND |
门/按钮(SUCCESS)与无交互方块(FAIL)的短按行为对比 | 🟡 |
SimpleChuteBlock.change() |
简易溜槽 vs 磁性/简易磁性溜槽嘴对嘴破坏;旋转序 WEST→DOWN→NORTH→(E/S 顺时针) | 🟡 |
shouldPlaceOffhandBlock |
黑名单/炼药锅/可拆除方块不放行;副手非 BlockItem 不放行 | 🟢 |
由 Hermes Agent 审查
(补充:标题无需修改——现有 "Fix Anvil Hammer not rotating blocks 修复铁砧锤无法旋转方块的问题" 已准确覆盖修复内容。)
|
💾 Self-improvement review: Patched SKILL.md in skill 'tool-block-interaction-pr-review' (1 replacement). · Patched references/pr4661-hammer-path-switch-session.md in skill 'tool-block-interaction-pr-review' (1 replacement). |
本 PR 修复了下列手持铁砧锤时出现的问题:
这些问题仅出现于 26.1 的版本,故请求直接拉取至 26.1 分支。
此外,本 PR 还摘取了 #4669 的更改,并从 1.21 分支移植了铁砧锤的副手方块放置逻辑。
Fixes #4459