Fix structure construction and preview, adjust fluid network loading and giant anvil collision 修复蓝图建造与预览并调整流体网络加载和巨型铁砧碰撞 - #4957
Conversation
WhereisFff
commented
Sep 20, 2026
- 分离蓝图配置、材料与容器内容,返还材料自带物品,支持缺料确认后放置空容器
- 校验方块实体与实体数据及操作权限,保留机器配置并转换方向和蓝图内部引用
- 修正蓝图自动朝向,优化建筑杖半透明预览及扫描仪预览缩放、居中和边框对齐
- 补充建筑杖放置音效,更新组件不匹配与容器缺料的中英文提示
- 延后流体容器能力检测,避免加载回调中同步查询其他区块
- 略微收缩下落巨型铁砧的碰撞箱
- 分离蓝图配置、材料与容器内容,返还材料自带物品,支持缺料确认后放置空容器 - 校验方块实体与实体数据及操作权限,保留机器配置并转换方向和蓝图内部引用 - 修正蓝图自动朝向,优化建筑杖半透明预览及扫描仪预览缩放、居中和边框对齐 - 补充建筑杖放置音效,更新组件不匹配与容器缺料的中英文提示 - 延后流体容器能力检测,避免加载回调中同步查询其他区块 - 略微收缩下落巨型铁砧的碰撞箱
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 |
代码审查摘要 — PR #4957操作: review_requested(正常审查) 🔴 关键1. if (config.contains("layerPositions") && placement.mirror() != Mirror.NONE) {
byte[] source = Arrays.copyOf(config.getByteArray("layerPositions"), POSITION_COUNT);
... mirrored[i - i % side + side - 1 - i % side] = source[i]; // 逐行反列
config.putByteArray("layerPositions", mirrored);
}
Direction right = facing.getClockWise();
... basePos.relative(right, column - RADIUS).relative(facing, RADIUS - row)而 → 结论:这里应该完全不动数组(旋转同样不需要,所以“只处理镜像、不处理旋转”的不对称恰好说明翻转是多余的)。反之若数组本意是“世界轴系绝对格”,那旋转和
|
| 声称 | 状态 | 对应实现 |
|---|---|---|
| 分离蓝图配置、材料与容器内容,返还材料自带物品 | ✅ | BuildingBlockMaterial.{extract,separateContents,withConfiguration}、BuildingMaterials.reserveBlock/returned、consume() |
| 支持缺料确认后放置空容器 | ✅ | BuildingMaterials.reserve() cells 分支(HAS_BOOK/HAS_RECORD=false + missingContents)→ contents_missing |
| 校验方块实体与实体数据及操作权限 | ✅ | requiresOperator(onlyOpCanSetNbt 排除 sign/lectern)、probe.onlyOpCanSetNbt()、nbt.id 校验;⚠ 拒绝提示复用 blocked |
| 保留机器配置并转换方向和蓝图内部引用 | ✅ | BlueprintBlockConfiguration.take/apply、transform(Facing/Valves/Ix…);🔴 layerPositions 镜像翻转两次 |
| 修正蓝图自动朝向 | ✅ | BlueprintPlacement.facingPlayer |
| 建筑杖半透明预览 / 扫描仪缩放居中边框对齐 | ✅ | building_rod_ghost fsh+json、BLOCK_GHOST RenderType、applyPreviewTransform、renderLevelBorder 共用 pose;💡 边框 Z 差 1 格 |
| 补充建筑杖放置音效 | ✅ | playPlacementSounds |
| 更新组件不匹配与容器缺料的中英文提示 | en_us/en_ud ✅;zh_cn ❌ 缺 contents_missing、旧语义未改 |
|
| 延后流体容器能力检测 | ✅ | ServerBlockEntityEventListener.onLoad + addContainerAfterLoad(doc 已更新);💡 每次都置 dirty |
| 略微收缩下落巨型铁砧的碰撞箱 | ✅ | makeBoundingBox().deflate(0.01) |
🧪 测试建议
| 被测目标 | 建议场景 | 优先级 |
|---|---|---|
BlueprintBlockConfiguration.transform |
同一蓝图分别以 rotation=NONE/90/180/270、mirror=LEFT_RIGHT/FRONT_BACK 放置含「智能方块放置器(POSITION 模式)」+「日晷」+「控制阀门」的结构,逐格比对选中格/日晷目标/阀门方向 | 🔴 |
BuildingMaterials.reserveBlock |
玩家提供「带内容物的箱子」+ 蓝图要求该箱子的内容物;断言内容物返还一次、放置后的箱子内容正确(不重复不丢失);take 跨多个同种容器时返还数量 = 内容数 × 取用数 |
🔴 |
BuildingBlockMaterial.separateContents/withConfiguration |
打包机/熔炉/唱片机/砲台等含遗留数据的机器:exact 与 mismatch 两段匹配是否按预期触发 component_mismatch,遗留数据是否来自实际消耗的物品 |
🟡 |
BlockEntityContentAdapter.extract(lectern/jukebox 分支) |
非法 Book(非成书/书与笔)、LootTable 箱子、非法 sign 文本 → 应得到 invalid_structure 而非异常穿透 |
🟡 |
BlueprintBlockConfiguration.sourceOrigin |
单台机器蓝图 / 多台机器蓝图 / 手工删除 x/y/z 的结构文件(期望 null → 丢弃 Ix/Iy/Iz) |
🟡 |
FluidNetworkManager |
加载含大量方块实体的区块后,网络重建次数与非容器注销正确性(避免每 tick 重建) | 🟢 |
结论: REQUEST_CHANGES — 整体方向与实现质量都不错(能力检测延后、内容物分离、校验链都站得住),但需要先确认 layerPositions 的坐标系语义(🔴 疑似二次镜像),并补齐 PR 自己声称的中文提示文案(
建议标题(本次 gh token 已失效,未自动修改:gh auth status → The token ... is invalid)
Fix blueprint building & preview; separate blueprint settings from contents; defer fluid container detection; shrink giant anvil hitbox 修复蓝图建造与预览:分离蓝图设置与容器内容、延后流体容器检测、收缩巨型铁砧碰撞箱
由 Hermes Agent 审查
跳过审查 — PR #4957 已关闭(closed)操作: closed 等待该 PR 重新打开( 由 Hermes Agent 处理 |
|
💾 Self-improvement review: Patched SKILL.md in skill 'building-rod-blueprint-review' (1 replacement). · Patched SKILL.md in skill 'coordinate-transform-pr-review' (1 replacement). · Patched SKILL.md in skill 'minecraft-modding' (1 replacement). · Patched references/blueprint-block-configuration-and-placement-frame.md in skill 'building-rod-blueprint-review' (1 replacement). |
|
分析完成。以下是审查意见(将直接由 webhook 发布到 PR 评论区)。 代码审查摘要 — PR #4957操作: opened(
|
| PR 声称 | 状态 | 对应实现 |
|---|---|---|
| 分离蓝图配置、材料与容器内容,返还材料自带物品 | ✅ | BuildingBlockMaterial(contents/Separated/withConfiguration)、BuildingMaterials.BlockSupply+returned→consume() |
| 缺料确认后放置空容器 | ✅ | reserve 逐 cell 预留;hasProperty(HAS_BOOK/HAS_RECORD)→false;新键 contents_missing |
| 校验方块实体数据 + 操作权限 | ✅ | id 比对、loadWithComponents try/catch、requiresOperator+onlyOpCanSetNbt、命令方块矿车拦截 |
| 保留机器配置、转换方向与蓝图内部引用 | ✅ | BlueprintBlockConfiguration.take/strip/transform(阀门 Face/Flow、layerPositions、Ix/Iy/Iz 重定位) |
| 修正蓝图自动朝向 | ✅ | BlueprintPlacement.facingPlayer(客户端 + 共享;注意相较旧客户端实现朝向翻转 180°,属预期修正,且经包同步) |
| 建筑杖半透明预览 / 扫描仪缩放·居中·边框对齐 | ✅ | BLOCK_GHOST+新着色器、applyPreviewTransform、cachedPreviewBounds、renderScannerBorder 重构、renderLevelLikeBlocks 抽取 |
| 补充放置音效 | ✅ | playPlacementSounds(蓝图 PLING / 非蓝图按方块音效去重) |
| 更新中英文提示 | en_us/en_ud 与生成器已更新;zh_cn.json 未同步(旧文案 + 缺新键) |
|
| 延后流体容器能力检测 | ✅ | addContainerAfterLoad 注释+实现、事件监听器、LevelChunkMixin 注释(代价见警告 1) |
| 略微收缩巨型铁砧碰撞箱 | ✅ | makeBoundingBox().deflate(0.01) |
结论: COMMENT(Approved with suggestions) — 未发现会阻塞合并的正确性缺陷;核心「配置/内容分离 + 数据校验 + 引用重定位」链路自洽且防御性不错。唯一建议合并前处理的是警告 1(流体网络脏标记语义变化带来的重建频率与饿死风险),其余为可选清理。
说明:本次
gh auth status显示 token 已失效(hosts.yml中 account Gugle2308 invalid),按约束未执行gh pr edit(也严禁export GITHUB_TOKEN),因此未自动改标题。建议标题:
Fix blueprint build/preview: split configs & container contents, validate BE/entity data, defer fluid capability checks, shrink giant anvil hitbox 修复蓝图建造与预览:分离配置与容器内容、校验方块实体/实体数据、延后流体能力检测、收缩巨型铁砧碰撞箱
由 Hermes Agent 审查
|
💾 Self-improvement review: Patched SKILL.md in skill 'minecraft-modding' (1 replacement). |