Skip to content

Fix ProduceHeat and Heliostats 修复产热配方结果和定日镜相关问题 - #4350

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

Fix ProduceHeat and Heliostats 修复产热配方结果和定日镜相关问题#4350
QiuShui1012 wants to merge 1 commit into
Anvil-Dev:dev/1.21/1.6from
QiuShui1012:chore/1.21/1.6

Conversation

@QiuShui1012

Copy link
Copy Markdown
Collaborator
  • 修复了定日镜在相同 xz 坐标最顶部不为定日镜时仍然可以堆叠放置的问题
  • 修复了 Distance 类的三种距离边界不符合预期的问题
  • 修复了 Distance 类可能返回可变方块位置的问题

@Gugle2308

Copy link
Copy Markdown
Collaborator

所有关键路径已交叉验证完毕(含本地克隆 origin/pr4337_new 与目标分支 FETCH_HEAD 的差异规避)。以下是审查意见。


代码审查摘要 — PR #4350

操作: opened
范围: 2 个文件(2 Java,0 新增,0 删除)/ 153 行 diff

📋 声称验证表

声称 状态 对应文件 验证说明
定日镜同 xz 堆叠检测修复 HeliostatsBlockEntity.java 新循环逐格检查,修复旧检查语义颠倒(详见下文)
Distance 三种距离边界修复 Distance.java <<= 统一、CHEBYSHEV 补 abs()、MANHATTAN 真菱形
Distance 不再返回可变位置 Distance.java withinManhattan/betweenClosed 替换为全新不可变 BlockPos

🔴 关键问题

无。

行为分析

1. HeliostatsBlockEntity — 旧检查确实是颠倒的(修复正确)

旧代码 getHeightmapPos(...).below() 检查的是"最高方块下面一格",直接堆叠两座定日镜(A@Y0、B@Y1,B 为最高)时:

  • A(下方):below(最高Y1) == Y0 == 自身 → 跳过;但被上方 3×3 检查(B 非空气非半透明)正确判为 OBSCURED ✓
  • B(上方)below(最高Y1) == Y0 是定日镜且 ≠ 自身 → 被错误判为 OBSCURED ✗——明明是最顶部应正常工作的那个

新循环 for (y = selfY+1; y < heightmapPos.getY(); y++) 改为检查 self 与最高方块之间所有方块,语义正确:B 循环为空 → 正常工作 ✓;A 仍由 3×3 上方检查兜底 ✓。propagatesSkylightDown=false(方块不透光)确认亮度检查可兜底隔空堆叠场景。修复方向正确。

2. Distance — 三处边界修复均为真实 bug

  • CHEBYSHEV 缺 abs()(旧 isInRange):Math.max(deltaV.x, deltaV.z) 无绝对值,负象限坐标(如 (−10, 0))max = 0 < distance 恒为 true——距离检查完全失效。新代码补 Math.abs
  • 边界不一致:旧 isInRange 严格 <,而 getAllPosesInRangewithinManhattan/betweenClosed/radiusSq)全部是包含 <=——两者语义互相矛盾。新代码统一为 <=
  • MANHATTAN 返回整立方体:旧 BlockPos.withinManhattan(center, d, d, d) 三轴各自限制在 [-d, d] 的完整盒状区域(曼哈顿距离只影响遍历顺序),与 CHEBYSHEV 的 betweenClosed 集合完全相同;新代码实现真菱形 |x|+|z|+(竖直?|y|) <= d这是"产热配方结果"修复的核心:唯一调用方 ProduceHeat.java:67getAllPosesInRange(center.below().getCenter()))此前会加热曼哈顿距离 2d 的对角锅,如 DEFAULT(MANHATTAN, 1, horizontal)会误热 3×3 四角而非仅十字邻位 ✓

3. 可变位置修复(真实风险):旧 MANHATTAN/CHEBYSHEV 分支的迭代器每次返回同一个被复用的 MutableBlockPos——调用方若 List.copyOf(iterable) 收集会得到 N 个相同坐标。新迭代器经 center.offset() 每次返回全新不可变 BlockPos ✓(ProduceHeat 当前立即消费无碍,但 API 契约已修正)

4. 顺带修正:EUCLIDEAN 由 int 平方改为 (double) 运算,消除 distance > 46340 时的 int 溢出;新增 distance < 0 防御(CODEC 可反序列化负值);isInRange 目前无调用方(已核实目标分支仅 ProduceHeatgetAllPosesInRange),<= 改动暂为休眠但语义统一。

⚠️ 警告

  • HeliostatsBlockEntity — 循环 y < heightmapPos.getY() 排除了最高方块本身:若最高方块恰为定日镜且中间隔有透明方块(如 A@Y0、玻璃@y1、B@Y2),下方 A 的循环只检查到玻璃、亮度检查又被玻璃放行 → A 仍可工作,堆叠残留。建议改为 y <= heightmapPos.getY()(直接堆叠场景由 3×3 上方检查覆盖,无回归;self 为最高时循环仍为空)。若"透明方块上方可工作"是既有设计(3×3 检查明确放行 HalfTransparentBlock),则此残留属设计取舍,确认一下即可。

💡 建议

  • HeliostatsBlockEntityvalidatePos 每 tick 执行,新循环每格一次 getBlockState,列高通常很小,无性能顾虑;但定日镜密集 + 高柱场景可考虑仅对 y 差 > 0 时才进入循环(已有 y+1 < heightmapY 隐式短路,实际已满足)。
  • Distance — 新统一迭代器对 MANHATTAN 仍遍历整盒(每次 center.offset 分配新对象)。大距离(如 d=32 → 65³ ≈ 27 万次分配)时 GC 压力略增;当前仅 ProduceHeat 使用且距离很小,可接受,无需改动。

🟢 看起来不错

  • (double) this.distance * this.distance 的强转位置正确(作用于第一操作数,避免 int 溢出)
  • 新迭代器状态机(offsetZ 后置自增、逐层重置)逐项推演覆盖完整、终止正确;distance/verticalDistance 捕获为 effectively-final,匿名类字段初始化正确
  • List.of() 空迭代与 false 短路对负距离的处理干净
  • checkPos 可变对象仅用于 getBlockState 读取,无别名泄漏

结论: APPROVE — 三处声称全部落实且为真实 bug 修复:定日镜堆叠检查语义颠倒被纠正、CHEBYSHEV 缺失 abs() 与 MANHATTAN 盒状迭代是产热配方结果错误的根源、可变位置契约已修正。仅一个边界取舍(循环排除最高方块)建议作者确认。

🧪 测试建议

被测目标 推荐测试场景 优先级
Distance.getAllPosesInRange MANHATTAN d=1 horizontal:应恰为 5 个位置(十字+中心),不含四角;CHEBYSHEV 应为 3×3;EUCLIDEAN 边界格(如 d=1 的 (±1,0))应包含、d+1 不包含 🔴
Distance.isInRange 负象限坐标(−d,−d)三类距离均应按各语义判定;distance<0 返回 false 🟡
HeliostatsBlockEntity.validatePos 直接堆叠两座:顶部 SUCCESS、底部 OBSCURED;隔空堆叠:下方 NO_SUN/OBSCURED;透明方块间隔 + 顶部定日镜场景确认预期 🔴

由 Hermes Agent 审查

@Gugle2308

Copy link
Copy Markdown
Collaborator

💾 Self-improvement review: Patched references/mc-spatial-logic-review.md in skill 'minecraft-mod-pr-review' (1 replacement). · 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.

2 participants