JianFeeeee
554ebc239a
M10c:mod 环境下寻路 —— 问运行时而非猜名字(+ 语义表与覆盖率报告)
用户要求:Create 与 Aeronautics 会引入大量原版没有的方块与危险区,
寻路必须一起优化。用户裁定:危险区用「表 + 命名推测并标记」,
动态机械用「警告 + 提高代价」。
## ★ 关键实测结论(本轮最重要)
我先按「给 mod 方块建语义表」做,实测覆盖率:
Create 643 个方块 → 显式表命中 9、命名规则推测 21、完全不识 613
覆盖率 4.7%
⇒ **手写表是死路**(64 mod / 1465 方块永远追不上)。
⇒ 但寻路真正需要的属性,**运行时全都有**:
Java 侧 blockinfo 已在读 BuiltInRegistries.BLOCK(**含 mod 运行时注册的方块**),
并返回 isSolid / destroySpeed / lightEmission / isAir / hasBlockEntity。
⇒ 正确做法是**问**,不是猜。
## 改动
新增 mcfold/solid.py:
- SolidSource 抽象:RegistrySolidSource(本机,快但无 mod)
vs RuntimeSolidSource(问 JVM,**含 mod**,准但要 JVM)
- 按 **state_id** 缓存(属性只依赖 state,不依赖坐标)
- attach_runtime() 批量探测(一次问一格要一次往返,批量才可用)
mcfold/pathfind.py:Terrain 改为「**先运行时缓存,再本机注册表**」;
can_dig 用 destroySpeed 判可挖(基岩官方约定是 -1 = 不可破坏),
不再靠名字猜「基岩挖不动」
新增 mcfold/modblocks.py(危险/会动这部分的表,配套覆盖率报告):
- 语义取���:ground/passable/hazard/breakable/solid/dynamic/carrier/unknown
- 三级来源:显式表 → 命名规则(**标记 inferred**)→ **如实说不认识**
- ★ vanilla 与 mod **分开算覆盖率**:vanilla 语义由注册表给,
把它算成「未知」会让人误以为「连石头都认不出」
WorldState:加 solid_cache 字段
## 判据
test_pathfind 19 → 24 项,新增 5 项:
- mod 方块优先用运行时 isSolid(本机注册表确实认不出)
- 不可破坏吃 destroySpeed(含基岩 -1 约定)
- 两边都无数据 ⇒ 不知道(**不谎称可走**)
- 覆盖率报告如实(且区分 mod/vanilla)
- 语义查询永远返回带 inferred 标记的结构
★ 写判据时踩了两个坑(都是 fixture 形状错,不是代码错):
1. `Chunk.sections[i]` 对应 y = MIN_Y + 16*i,MIN_Y=-64
⇒ 我按「第 0 个 section = y=0」写,查 y=0 拿到的是空气
2. 同一 section 内 16 格**只能一个值** ⇒ mod 方块与空气落同一 section 时,
空气格会变成 mod 方块(看着像代码 bug,其实是 fixture 形状问题)
⇒ 教训:**判据的 fixture 形状必须与被测代码的真实输入结构一致**。
226 项全通过。
2026-09-26 14:29:58 +08:00
..
2026-09-26 10:18:26 +08:00
2026-09-25 14:12:06 +08:00
2026-09-26 13:21:44 +08:00
2026-09-25 19:21:45 +08:00
2026-09-26 13:42:32 +08:00
2026-09-26 13:13:15 +08:00
2026-09-26 12:15:48 +08:00
2026-09-26 12:27:28 +08:00
2026-09-26 13:52:33 +08:00
2026-09-25 14:36:21 +08:00
2026-09-26 10:18:26 +08:00
2026-09-26 14:08:06 +08:00
2026-09-26 14:29:58 +08:00
2026-09-25 14:36:21 +08:00
2026-09-26 14:29:58 +08:00
2026-09-26 13:52:33 +08:00
2026-09-26 12:44:08 +08:00
2026-09-25 18:35:28 +08:00
2026-09-26 13:52:33 +08:00
2026-09-26 13:13:15 +08:00
2026-09-26 11:12:40 +08:00
2026-09-26 14:29:58 +08:00
2026-09-26 13:21:44 +08:00
2026-09-26 14:29:58 +08:00
2026-09-26 14:29:58 +08:00
2026-09-26 12:44:08 +08:00
2026-09-25 14:06:55 +08:00
2026-09-25 14:33:26 +08:00