Skip to content

Separate block‑placement rules from interactive‑pickup rules 分离方块放置与交互拾取规则 - #4766

Merged
PigeonNian merged 1 commit into
Anvil-Dev:dev/1.21/1.6from
WhereisFff:dev/1.21/fix26
Sep 9, 2026
Merged

Separate block‑placement rules from interactive‑pickup rules 分离方块放置与交互拾取规则#4766
PigeonNian merged 1 commit into
Anvil-Dev:dev/1.21/1.6from
WhereisFff:dev/1.21/fix26

Conversation

@WhereisFff

Copy link
Copy Markdown
Contributor
  • 移除模型凹陷与细缝补齐算法及相关几何缓存
  • 全局放置改用方块原有选择形状,交互和破坏继续使用精确拾取
  • 同步多方块放置预览,处理模型空隙、可食用方块物品和实体遮挡
  • 将拾取、轮廓和 BER 排除规则改为支持资源包覆盖的黑名单,并缩减默认拾取例外
  • 升级砧库至 snapshot.521,通过动态目标排除接口应用黑名单

- 移除模型凹陷与细缝补齐算法及相关几何缓存
- 全局放置改用方块原有选择形状,交互和破坏继续使用精确拾取
- 同步多方块放置预览,处理模型空隙、可食用方块物品和实体遮挡
- 将拾取、轮廓和 BER 排除规则改为支持资源包覆盖的黑名单,并缩减默认拾取例外
- 升级砧库至 snapshot.521,通过动态目标排除接口应用黑名单
Copilot AI lite review requested due to automatic review settings September 9, 2026 08:49

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

⏳ Retrying in 2.5s (attempt 1/3)...

@Gugle2308

Copy link
Copy Markdown
Collaborator

⏳ Retrying in 4.1s (attempt 2/3)...

@Gugle2308

Copy link
Copy Markdown
Collaborator

❌ API failed after 3 retries — HTTP 503: Service temporarily unavailable

@Gugle2308

Copy link
Copy Markdown
Collaborator

⏳ Retrying in 2.4s (attempt 1/3)...

@Gugle2308

Copy link
Copy Markdown
Collaborator

⏳ Retrying in 5.8s (attempt 2/3)...

@Gugle2308

Copy link
Copy Markdown
Collaborator

❌ API failed after 3 retries — HTTP 503: Service temporarily unavailable

@Gugle2308

Copy link
Copy Markdown
Collaborator

API call failed after 3 retries: HTTP 503: Service temporarily unavailable

1 similar comment
@Gugle2308

Copy link
Copy Markdown
Collaborator

API call failed after 3 retries: HTTP 503: Service temporarily unavailable

@WhereisFff WhereisFff changed the title fix(selection): 分离方块放置与交互拾取规则 Separate block‑placement rules from interactive‑pickup rules 分离方块放置与交互拾取规则 Sep 9, 2026
@PigeonNian
PigeonNian merged commit 27e1f41 into Anvil-Dev:dev/1.21/1.6 Sep 9, 2026
2 checks passed
@Gugle2308

Copy link
Copy Markdown
Collaborator

PR #4766 已合并关闭(state: closedmerged_at: 2026-09-09T08:55:17Z,merge commit 27e1f41)。

按 webhook 审查规则:action 为 closed(且已合并)→ stop here,不发布审查评论。此 PR 已完成合并,无需再输出审查意见。

@Gugle2308

Copy link
Copy Markdown
Collaborator

分析完成。所有关键路径已交叉验证(黑名单 ID 注册表核对、Mixin 配置分区、删除残留扫描、与仓库内 BlockItem 子类的交互)。以下是审查意见:


代码审查摘要 — PR #4766

操作: edited
范围: 13 个文件(5 新增、1 删除、7 修改)/ 850 行 diff
分支: dev/1.21/fix26 → dev/1.21/1.6(MC 1.21.1 / NeoForge 21.1.238 / anvillib snapshot.520 → .521)

🔴 关键

  • PlaceInWaterBlockItem(捕蟹笼 crab_trap)的水体放置会被新重定向逻辑劫持UseOnContextMixinplayerClick 标记注入在 3 参构造器 (Player, InteractionHand, BlockHitResult),而 PlaceInWaterBlockItem.use() 内部恰好用同一个 3 参构造器构建自定义流体目标 context(new UseOnContext(player, usedHand, blockHitResult2),blockHitResult2 为 getPlayerPOVHitResult(Fluid.SOURCE_ONLY) 的水面命中),再 super.useOn(...)BlockItem.useOnnew BlockPlaceContext(ctx)BlockPlaceContextMixin 认为这是玩家点击并对它无条件重新 raycast

    • 重定向 clip 用 ClipContext.Block.OUTLINE, Fluid.NONE — 射线穿过水体打到水底/对岸,把「水面源方块格」换成「水底方块面」(水深 ≥2 时陷阱落点从点击的水面格下移到水底格上方);
    • 水深超过 blockInteractionRange() 时 clip 直接 MISS → rejectMissedPlacement 使 canPlace() 恒 false → 深水完全无法放置(旧代码放置成功)。

    根因是标记语义与实现错位:anvilcraft$isPlayerClick() 实际表示「经 3 参构造器创建」,而该构造器被本 mod 内部逻辑复用,无法区分真实包点击与内部重定向。建议:在 forPlacement 加前置判定——原始 context.getHitResult() 的命中方块非 anvilcraft namespace 时直接返回原 context(捕蟹笼的水方块命中会被跳过;正常放置场景的原始命中都在 anvilcraft 方块上,不受影响),同时天然规避下方 ⚠️ 第 2 条的无谓 clip。

⚠️ 警告

  • tryPlaceFromAirItemStack.use() HEAD 内直接 stack.useOn(...),绕过 ServerPlayerGameMode.useItemOn — 该路径不触发 NeoForge PlayerInteractEvent.RightClickBlock(保护类 mod/领地拦截失效),gamemode 层检查仅在 allowed() 里复刻了子集(border/canInteract/mayInteract/mayBuild 有,spawn protection、事件层没有)。且该注入对所有 BlockItem 生效、由 useOn 的 PASS/FAIL 回退链路也可能触发——建议确认 1.21.1 服务端 useItemOn PASS/FAIL 是否回退 useItem(若回退,每次对不可放置方块右键都会额外跑一次 pick+useOn)。
  • disable_model_outline 通过 usesOriginalPicking() 的并集语义悄悄禁用精确拾取usesOriginalPicking = picking ∪ outline,而默认黑名单把 pipe×6、redstone_wire、large_cauldron、wip_block 放进了 outline 列表 → 这些方块全部从「精确拾取 + 立方体轮廓」退回「原版 AABB 交互」。与描述「交互和破坏继续使用精确拾取」存在出入;若管道/红线只是想关轮廓高亮而保留精确拾取,需拆分判定。请确认语义。
  • 黑名单解析失败静默降级 — 默认 json 中任一 ID 写错/类型不符/越权 namespace,readBlocks 抛异常 → reload catch 后 rules 保持 EMPTY → 整个黑名单失效(全部方块回到精确拾取),仅一条 warn 日志。已核对默认 json 的 12 个 ID 与 ModBlocks 注册全部一致 ✅,但建议对最低优先级(mod 自带)包的失败用更显眼的错误,或补 datagen 校验。

💡 建议

  • PlayerClick.anvilcraft$hasBlockHit() 与对应 @Shadow hitResult 无调用方 — 死代码,删掉或补用途。
  • 可食用/带 use 逻辑的 BlockItem(蛋糕类):瞄准 cube 空隙时原本是「空气点击→吃」,现在 tryPlaceFromAir 命中轮廓后若 useOn 返回 FAIL(非 PASS)会覆写返回值,吃被吞掉(既没放也没吃)。PASS 透传覆盖了大部分场景,此 FAIL 边角需实测确认。
  • 版本升级 anvillib snapshot.521CubeSelection.registerTargetExclusion API 与黑名单双源(anvillib 按 id 读包 + 本 mod 自读 model_selection_blacklist.json)关系建议在代码注释里说明,避免后续维护者困惑。

🟢 看起来不错

  • 黑名单 12 个 ID 逐一核对存在;资源包覆盖语义正确(getResourceStack 低→高优先级、高优解析失败回退低优、仅接受 anvilcraft namespace、Set.copyOf 不可变)。
  • 删除完整性极好:ModelInteractionGeometry(221 行)+ bakery 的 picking/interactions 缓存全链路移除,全树 grep 无残留引用Snapshot record 5→3 maps 收敛干净。
  • 两个新 Mixin 注册在 common 配置(非 client),服务端放置重定向可达;tryPlaceFromAirallowed() 复刻了 border/权限/冒险模式检查并补了实体遮挡检查,比裸 useOn 严谨。
  • BlockPlaceContextMixin.rejectMissedPlacementforPlacement 的 miss 降级配套完整,防止重定向 MISS 后仍按残留 blockPos 放置。

📋 声称验证表

声称 状态 对应文件
移除凹陷/细缝补齐算法及几何缓存 ModelInteractionGeometry.java(删 221 行)、ModelSelectionBakery interactions/picking 移除
全局放置用原选择形状,交互/破坏保持精确拾取 ⚠️ 3 个新 Mixin + BlockPlacementPicking(放置重定向 OUTLINE)✅;但 outline 列表经并集也退回原版拾取,见 ⚠️
同步多方块放置预览 BlockPlaceContext 构造器统一重定向覆盖预览路径(预览本体在 #4763);建议实测巨型砧
处理模型空隙/可食用方块/实体遮挡 ItemStack.use HEAD 注入 + tryPlaceFromAir(实体遮挡、FakePlayer/spectator 排除、edible PASS 透传)
黑名单化 + 缩减默认拾取例外 ModelSelectionBlacklist(新)+ json;例外 7→2(fish_tank/processing_table/crate/large_cauldron 移出)
anvillib snapshot.521 + 动态目标排除 libs.versions.toml、neoforge.mods.toml、AnvilCraftClient.registerTargetExclusion(本地无 anvillib 源,API 签名未核验)

🧪 测试建议

被测目标 推荐测试场景 优先级
PlaceInWaterBlockItem.use() 捕蟹笼:水深 1 / 深水(>交互距离) / 浅水点击水面放置回归 🔴
BlockPlacementPicking.tryPlaceFromAir 可食用 BlockItem 在空隙瞄准时吃 vs 放;对原版方块右键空气无副作用 🟡
ModelSelectionBlacklist.reload override 资源包全量替换、坏 json 回退低优先级、默认文件缺 ID 的日志 🟡
黑名单并集语义 管道/红石线交互是否仍精确拾取(确认行为变更是否有意) 🟡

结论: REQUEST_CHANGES — 架构方向清晰、删除与注册干净,但 playerClick 标记的构造器判定会劫持 PlaceInWaterBlockItem(捕蟹笼)的内部流体重定向,机制上几乎必然改变其放置行为(深水 MISS 后完全无法放置);建议按 🔴 的 namespace 前置判定修复后合并。PR 标题双语准确,无需修改。


由 Hermes Agent 审查

@Gugle2308

Copy link
Copy Markdown
Collaborator

💾 Self-improvement review: Patched SKILL.md in skill 'cube-selection-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.

4 participants