Fix chute placement preview over containers 修复溜槽对准容器时的放置预览 - #5121
Conversation
- 按溜槽首轮交互规则检查原始点击位置和方向的物品容器,恢复主手放置预览 - 保留创造板条箱及仓储端口的中心交互,以及副手、潜行和其他方块的既有交互优先级
|
审查完成。以下内容将作为 PR 评论输出(未执行任何 代码审查摘要 — PR #5121 Fix chute placement preview over containers 修复溜槽对准容器时的放置预览操作: opened(PR 仍为开放式; ✅ 一致性核对(本 PR 的核心不变量:预览判定 == 实际放置优先级)新分支(
🟢 看起来不错
|
| PR 声称 | 状态 | 证据 |
|---|---|---|
按 ChuteBlockItem.onItemUseFirst 优先级检查原始点击位的 IItemHandlerHolder 或点击面能力 |
✅ | 表达式逐字一致,同用 getClickedPos()/getClickedFace() |
| 保留创造板条箱及仓储端口的中心/边缘判定 | ✅ | 新分支位于 isStorageInteraction 早退之后;PlacementInteractions.java:37(isStorageInteraction → return false)未被改动 |
| 副手仍遵循主手容器交互优先级,潜行及其他方块行为不变 | ✅(行为未变) | 新分支要求 MAIN_HAND;isSecondaryUseActive 早退在其之前;MenuProvider/StorageBlockEntity/交互方块 分支原样保留。 |
仅修改 PlacementInteractions.java |
✅ | git 3-dot:1 file changed, 9 insertions(+) |
| 未提交 GameTest 或相关测试资源 | ✅ | 无新增文件;仓库内亦无 PlacementInteractions 相关测试 |
clean build / Checkstyle 通过 |
⚪ 未复现 | 无构建环境(本次仅静态核对 import 分组与行序,未见新增告警来源) |
| 2880 组外置运行时回归、336 组恢复 / 2544 组不变 | ⚪ 无法复现 | 依赖 MC 运行时;版本号(NeoForge 21.1.238)与 libs.versions.toml 一致,陈述可信 |
🧪 测试建议
| 被测目标 | 推荐测试场景 | 优先级 |
|---|---|---|
PlacementInteractions.allowsPlacement() |
参数化用例钉死不变量:主手溜槽 + 能力容器(含 DOWN 面为 null 的粉碎台/冲压台)→ true;创造板条箱/仓储端口中心点击 → false;副手溜槽 + MenuProvider 容器 → 记录期望值以固化取舍 |
🟡 |
ChuteBlockItem.onItemUseFirst vs allowsPlacement |
二者共用抽出的 isContainerPlacementTarget() 后加一个「同一 UseOnContext 下两处判据同真同假」的断言,防止未来漂移 |
🟡 |
结论: APPROVE — 修复方向正确、实现极小且与 onItemUseFirst 的优先级精确对齐;由于只作用于客户端预览闸门、且其后仍有 BuildingRodService 的放置可行性校验,「假预览」风险已闭环。两条
由 Hermes Agent 审查
|
💾 Self-improvement review: Patched SKILL.md in skill 'tool-block-interaction-pr-review' (1 replacement). |
Reason: recursive delete Reply |
代码审查摘要 — PR #5121操作: ready_for_review(PR 状态 open,未合并;base ✅ 核心逻辑核验:新分支与
|
| 场景(主手溜槽) | 实际 onItemUseFirst |
预览 allowsPlacement |
一致 |
|---|---|---|---|
机器 / 容器(BaseMachineBlockEntity implements MenuProvider, IItemHandlerHolder) |
useOn() 尝试放置 → 消耗交互,GUI 打不开 |
新分支 → true(修复前落在 entity instanceof MenuProvider → false)✅ 正是 #5120 的症状 |
✅ |
| 创造板条箱 中心 | isStorageInteraction → PASS → 方块 useItemOn 收纳物品(CreativeCrateBlock.useItemOn:51-56) |
第 38 行 → false |
✅ 保留 |
| 创造板条箱 边缘 | isStorageInteraction=false → useOn() 放置 |
新分支 → true(旧代码第 58-61 行同样 true) |
✅ 保留 |
| 仓储端口/合并器 中心(主手) | PASS → 端口交互 |
第 38 行 → false |
✅ 保留 |
| 仓储端口 边缘 / 副手 | useOn() 放置 |
新分支或第 53 行 !isStorageInteraction → true |
✅ 保留 |
| 潜行 | useOn() 放置 |
第 39 行(先于新分支)→ true |
✅ 不变 |
无能力且非 MenuProvider 的普通方块 |
super.onItemUseFirst → PASS → 方块交互 |
第 56/58-61 行原逻辑 | ✅ 不变 |
MAIN_HAND 限定是必要且正确的:预览的 hand 选择是「选中槽非 BlockItem 才取副手」,而副手溜槽对准可交互容器时主手路径会先被方块交互消耗(与 issue 里「手上拿溜槽时无法交互容器」的描述一致)——因此副手不显示预览正是实际行为。
✅ 已独立复算的 PR 声称
| 声称 | 结果 |
|---|---|
仅改 PlacementInteractions.java,未提交测试资源 |
✅ git diff --stat 1 file, +9/−0;无 GameTest |
| 4 种溜槽物品 | ✅ CHUTE/MAGNETIC_CHUTE/OVERFLOW_CHUTE/SIMPLE_MAGNETIC_CHUTE,均在 PLACEMENT_PREVIEW 标签内(修复对溜槽预览确实生效) |
git diff --check 通过 |
✅ 复算通过 |
| Checkstyle 无告警 | ✅ 新增行最长 121 字符(文件内既有最长 135),import 顺序 dev.dubhe.* → net.minecraft.* → net.neoforged.* 正确 |
| 2880 组外置运行时回归 |
💡 建议(非阻塞)
- 判据重复、有漂移风险 —— 新分支复刻了
ChuteBlockItem的能力判定。该判定如今已有 3 处消费者(ChuteBlockItem.onItemUseFirst、ItemStackMixin:51、本预览门控)。建议抽成ChuteBlockItem的公共静态谓词(如ChuteBlockItem.willAttemptPlacement(UseOnContext)),由onItemUseFirst与预览共用;否则将来改动ChuteBlockItem的优先级时,预览会静默失配(这正是 [Bug] 溜槽放置预览 #5120 的成因类型)。 - 描述遗漏了一处波及面(方向上正确) —— 新分支的
getCapability一路会让「能力只来自注册表、且不是IItemHandlerHolder」的方块从false翻成true,典型是StorageBlockEntity(CapabilitiesEventListener:303为它注册了storageItemHandler,而旧代码第 57 行显式return false)。这与onItemUseFirst的通用分支一致(持溜槽时该交互确实会被 item 路径消耗,FAIL亦然),属正确修复,但 PR 描述只提到「容器」,建议补一句并确认回归用例的 15 种目标覆盖到 storage block。 - 记录一个边界(无需改) —— 多方块容器(BE 只在主部件,预览侧用
getMultipartMainPartPos的menuPos取实体,而新分支与onItemUseFirst一样只看getClickedPos()):点击子部件时两处都取不到能力 → 预览不显示,实际交互也落到方块 GUI,自洽。 - 测试建议 —— 2880 组外置运行时回归无法进 CI,建议补一条 GameTest/单元用例把这条判据钉住:
| 被测目标 | 建议场景 | 优先级 |
|---|---|---|
PlacementInteractions.allowsPlacement() |
主手溜槽 × BaseMachineBlockEntity/箱子 → true;创造板条箱 中心 false / 边缘 true;潜行 true;副手 false;旁观者/空玩家 false |
🔴 |
与 ChuteBlockItem.onItemUseFirst 的一致性 |
对上述同一批 context 断言「预览 true ⇔ 交互被 item 路径消耗」 |
🟡 |
结论: APPROVE(comment 级)— 无阻塞问题
修复点选得准(根因是预览门控只看 MenuProvider,未复用 ChuteBlockItem 的溜槽优先级),改动最小、与 onItemUseFirst 判据严格同构,中心/边缘、潜行、副手语义均保留。仅建议消除判据重复并补充描述/回归覆盖。PR 标题已准确(双语),无需修改;另:本机 gh token 已失效,本次未做任何标题变更。
由 Hermes Agent 审查
|
💾 Self-improvement review: Patched references/placement-preview-gate-mirroring.md in skill 'tool-block-interaction-pr-review' (1 replacement). · Patched SKILL.md in skill 'tool-block-interaction-pr-review' (1 replacement). |
代码审查摘要 — PR #5121操作: ✅ 正确性验证(先说结论:镜像关系成立)新增守卫与 blockEntity instanceof IItemHandlerHolder
|| level.getCapability(Capabilities.ItemHandler.BLOCK, clickedPos, clickedFace) != null
→ this.useOn(context) // 真的会放置
|
| 声称 | 状态 | 证据 |
|---|---|---|
| 恢复 #5120(溜槽对准容器的放置预览) | ✅ | 守卫镜像 ChuteBlockItem.onItemUseFirst:37-39;额外覆盖 StorageBlockEntity 系(LARGE_CRATE / SHULKER_CONTAINER / 超维存储站) |
仅修改 PlacementInteractions.java |
✅ | diff 仅 1 文件,base 54 行 → head 63 行(+2 import、+7 守卫),与 fork head 文件逐行一致 |
| 保留创造板条箱/仓储端口中心-边缘判定 | ✅ | 新守卫位于 isStorageInteraction → false(第 4 步)之后,中心点击不会进入守卫 |
| 副手仍遵循主手容器交互优先级 | 行为满足(守卫限 MAIN_HAND),但与 ChuteBlockItem 手无关的第二分支存在判据差异,建议注释固化 |
|
| build / Checkstyle 通过、无新增告警 | 环境无 gradle/JDK;改动行导入归入 net.minecraft.* 之后的 net.neoforged.*,与 ChuteBlockItem 风格一致,未见明显风格偏差 |
|
| 2880 组点击场景回归、336 组预览恢复 | 仓库内无测试资源,外部编排不可复核(与 PR 自述相互印证) | |
| 未提交 GameTest/测试资源 | ✅ | diff 中无测试文件 |
🧪 测试建议
| 被测目标 | 推荐场景 | 优先级 |
|---|---|---|
PlacementInteractions.allowsPlacement(溜槽 + 容器) |
主手溜槽 → true;副手同场景 → false;大板条箱/潜影集装箱/超维存储站各一例 |
🔴 |
| 同上(仓储端口 / 创造板条箱) | 中心点击 → false(开界面);边缘点击 → true;潜行 → true |
🔴 |
| 预览 ⟺ 真实行为一致性(防漂移) | 同一 (目标, 手, 面, 中心/边缘) 组合断言 allowsPlacement ⟺ onItemUseFirst != PASS,可直接复刻 PR 声称的矩阵 |
🟡 |
| 客户端安全性 | 手持溜槽悬停仓储方块(单机 + 联机)观察日志与客户端存储副本 | 🟡 |
| 多方块非主体部件 | 溜槽点击多方块容器非主部件时预览/实际是否一致(现存残余,非本 PR 引入) | 🟢 |
结论: ✅ LGTM — 建议合并(附带 3 条非阻塞确认项)
改动最小、与真实放置判据逐字对齐,未发现回归;唯一系统性风险是"同一判据在两处复制 + 预览从纯读变成每帧客户端能力探测"——建议后续把容器判定抽成共享谓词并补一致性测试。PR 标题 Fix chute placement preview over containers 修复溜槽对准容器时的放置预览 已准确且中英齐备,未修改标题(gh pr edit 无需执行)。
由 Hermes Agent 审查
|
💾 Self-improvement review: Patched SKILL.md in skill 'tool-block-interaction-pr-review' (1 replacement). · Patched references/placement-preview-gate-mirroring.md in skill 'tool-block-interaction-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 |
Reason: script execution via -e/-c flag Reply |
|
审查完成。以下是本次审查结果(action= 代码审查摘要 — PR #5121操作: 结论先行改动逻辑正确、范围最小、与 🔴 关键
|
| 声称 | 状态 | 对应证据 |
|---|---|---|
按 onItemUseFirst 优先级检查原始点击位置的 IItemHandlerHolder 或点击面物品能力 |
✅ | 表达式与 ChuteBlockItem.java:37-39 逐字一致;用 getClickedPos/getClickedFace 而非 menuPos |
| 保留创造板条箱及仓储端口的中心/边缘判定 | ✅ | L38(isStorageInteraction 早退)与 L52-54 均未改动且排在新增分支之前 |
| 副手仍遵循主手容器交互优先级 | ✅(附 |
新增分支 MAIN_HAND 门控成立;但仓储端口分支对副手返回 true,手性规则不统一(见建议) |
| 潜行行为保持不变 | ✅ | isSecondaryUseActive() → true 仍在前 |
| 其他方块行为保持不变 | ✅ | 分支以 instanceof ChuteBlockItem 门控,且只在 PLACEMENT_PREVIEW 标签内的方块上触发(chute / magnetic_chute / overflow_chute / item_splitter 四个 item 都是 ChuteBlockItem) |
| fixed #5120 | ✅ | issue #5120 仍 open(State: open,label 🐛 Bug),症状与靶点一致;原版箱子/木桶只提供能力而非 IItemHandlerHolder,由能力分支修复 |
补充核对项(不阻塞):预览在客户端执行,修复依赖「客户端也存在方块物品能力」。AnvilCraft 自身经
@EventBusSubscriber(modid=...)(无Dist限制,CapabilitiesEventListener.java:37)注册 ⇒ 双侧可用;NeoForge 的原版容器 provider 亦按侧注册。建议合入前在游戏内对原版箱子/木桶实机确认一次预览恢复(并被#5120报告者路径覆盖)。
结论: APPROVE(可合并) — 逻辑正确、改动最小,可直接合并;上述
PR 标题
Fix chute placement preview over containers 修复溜槽对准容器时的放置预览已准确且中英双语,无需修改(另:gh auth status显示 token 已失效,本次亦未执行任何gh改动,符合 webhook 约束)。
🧪 测试建议
| 被测目标 | 推荐测试场景 | 优先级 |
|---|---|---|
PlacementInteractions.allowsPlacement() |
主手溜槽对准原版箱子/木桶(能力路径)→ 有预览;对准创造板条箱/仓储端口中心 → 无预览、边缘 → 有预览;DEBUG-HIT 面朝向各 6 面各测一次 |
🔴 |
| 同上 | 副手溜槽对准容器 → 确认预期行为(当前无预览),锁定手性规则 | 🟡 |
PlacementInteractions.allowsPlacement()(回归) |
工作台/铁砧/按钮/门/活板门 → 仍不显示预览 | 🟡 |
| 存储类 provider 副作用 | 持溜槽反复扫过板条箱/大型板条箱/潜影集装箱 → 客户端无异常、存储终端显示不错乱 | 🟡 |
由 Hermes Agent 审查
代码审查摘要 — PR #5121操作: edited 🟢 核心结论:修复方向正确,判据与真实交互逐字一致
|
| 声称 | 状态 | 依据 |
|---|---|---|
按 onItemUseFirst 优先级检查原始点击位置的 IItemHandlerHolder/点击面能力 |
✅ | 与 ChuteBlockItem.java:37-39 逐字一致 |
| 保留创造板条箱及仓储端口的中心/边缘判定 | ✅ | isStorageInteraction → false(:38)仍在新分支之前;该方法潜行返回 false |
| 副手仍遵循主手容器交互优先级 | ✅(口径见建议 2) | 新分支限定 MAIN_HAND,副手路径未改动 |
| 潜行及其他方块行为保持不变 | ✅ | :39 未动,其后分支未动 |
仅修改 PlacementInteractions.java、未提交测试 |
✅ | API: 1 file/+9/-0;仓库无测试源集 |
结论: COMMENT(建议按 CLIENT_COPY 幽灵条目),与文件自身契约冲突。
建议标题(gh auth status 显示 token 已失效,本次未自动修改):Fix chute placement preview over item-handler blocks 修复溜槽对准容器时的放置预览 —— 原标题可用,但 "over containers" 容易被读成只针对容器方块,实际判据是"任何暴露物品处理能力的方块(含机器/能力方块)"。
🧪 测试建议
| 被测目标 | 推荐场景 | 优先级 |
|---|---|---|
PlacementInteractions.allowsPlacement() |
主手溜槽 × {创造板条箱中心/边缘、仓储端口、板条箱、大板条箱、原版箱子、AnvilCraft 机器、潜行} 共 14 组,逐组与服务端 ChuteBlockItem.onItemUseFirst 的实际结果对照 |
🔴 |
| 同上(副作用) | 准星停在板条箱上数秒后,检查客户端 BE getId() 是否被改成随机值、Storages.CLIENT_COPY 是否多出条目 |
🔴 |
| 原版容器能力 | 客户端 Level.getCapability(Capabilities.ItemHandler.BLOCK, …) 对箱子/桶是否非空(决定 issue 场景是否真修好) |
🟡 |
由 Hermes Agent 审查(diff 经 patch-diff.githubusercontent.com 匿名获取,交叉核对了 head 623a6677 与 base 956c11b4 的源码)
|
💾 Self-improvement review: Patched SKILL.md in skill 'perf-optimization-pr-review' (1 replacement). |
|
💾 Self-improvement review: Patched references/placement-preview-gate-mirroring.md in skill 'tool-block-interaction-pr-review' (1 replacement). · Patched SKILL.md in skill 'tool-block-interaction-pr-review' (1 replacement). |
|
PR #5121 状态为 closed,按 webhook 规则(closed/labeled → 停止)不进行审查、不发布评论。 已停止,未下载 diff、未执行任何 gh 评论命令。 |
fix(client): 修复溜槽对准容器时的放置预览 (#5120)
ChuteBlockItem.onItemUseFirst的优先级,检查原始点击位置的IItemHandlerHolder或点击面的物品处理能力,恢复主手溜槽对准容器时的预览。