Add concrete fluid behavior. 添加水泥流体行为 - #4982
PigeonNian wants to merge 2 commits into
Conversation
PigeonNian
commented
Sep 21, 2026
- resolved [TODO] 水泥流体行为 #4972
- 新增 CementFluid 流体类型,支持多彩色彩,通过 Color 进行区分 - 实现水泥流体的源头方块和流动方块,继承自 BaseFlowingFluid - 随机刻逻辑中支持源头沉降,如果下方为空则整体下移 - 添加水泥凝固机制,源头有概率与周围两层流动水泥一同凝固成混凝土方块 - 识别重复随机刻派发,避免源头多次重生导致数量异常增加 - 实现触碰糖块、粘液块与蜂蜜块时凝固或下移行为的特殊逻辑 - 优化宽广区域内的向下寻路算法,限定单次搜索上限,不影响服务器效率 - 在 ModFluids 注册新水泥流体,替换旧的基类实例化为 CementFluid 实例
Reason: script execution via -e/-c flag Reply |
|
All verification done. Here is the review (posted as the reply): 代码审查摘要 — PR #4982「Add concrete fluid behavior 添加水泥流体行为」操作: opened ✅ 核心诊断已用 1.21.1 原版字节码核实(不是推测)作者注释里"同一格每刻被派发两次随机刻"的判断完全正确,逐条证据(Mojang 1.21.1 client_mappings + 混淆客户端字节码):
所以:液态路径(液态混凝土方块)与流体状态路径会各掷一次,不去重时凝固概率确实是 1−0.75²≈43.75%,去重方向正确。实时状态守卫( 🔴 关键问题未发现阻塞性缺陷(编译面:覆写签名/可见性、
|
| 声称 | 状态 | 依据 |
|---|---|---|
resolved #4972 |
本环境 gh token 失效、GitHub API 401,无法读取 issue 的验收细则;请确认"糖块只挡凝固 / 粘液只挡下移 / 蜂蜜两者都挡"这三条与 issue 描述一致(尤其"糖块阻止凝固"的直觉相反方向) |
|
| 水泥流体世界行为 | ✅ | CementFluid.java 新增沉降 + 双层凝固 + 三方块交互,ModFluids 注册已切换 |
| 源头不再成倍增殖 | ✅ | 实时状态守卫 + 同刻去重,已按原版派发链核实 |
结论: COMMENT(建议合并前处理 Level、concrete() 的非空契约,以及确认 64 格搜索上限在宽台面上的表现是否符合设计。
标题建议(本次因 gh 未认证未自动修改,gh auth status = token invalid):
Add world behavior for cement fluid (source settling + solidify into concrete) 添加水泥流体的世界行为(源头沉降与凝固为混凝土)
现标题 "Add concrete fluid behavior" 的英文部分有歧义(易读成"新增一种混凝土流体",而实际是"给水泥流体加世界行为")。
🧪 测试建议
| 被测目标 | 推荐测试场景 | 优先级 |
|---|---|---|
CementFluid.randomTick |
同刻双派发下凝固概率≈25%(统计 10k 次)、移动后第二次派发不生成新源头 | 🔴 |
findLowerFlow |
半径 5 台面成功下沉 / 半径 6~7 台面触发 MAX_SETTLE_SEARCH 的行为是否符合预期;金字塔交错水流不会串到隔壁水股 |
🟡 |
solidify |
环 1/环 2 精确命中 amount 7/6;两个相邻内圈格指向同一外圈格时用 Set 去重(不重复写块、不重复触发更新) | 🟡 |
| 三方块交互 | 糖/粘液/蜂蜜分别只阻止其对应行为;蜂蜡边界(对角不算接触) | 🟡 |
CementFluid.Source/Flowing |
getAmount/isSource/默认 LEVEL=7 与 createLegacyBlock() 一致,桶拾取仍正常 |
🟢 |
由 Hermes Agent 审查(diff: patch-diff.githubusercontent.com 匿名获取,md5 8646530947f39ac43262d49525ddab18;原版 API 用 Mojang 1.21.1 mappings + 客户端字节码离线核对)
|
💾 Self-improvement review: Patched references/style-check-ci-gate-verification.md in skill 'offline-pr-evidence-verification' (1 replacement). · Patched SKILL.md in skill 'offline-pr-evidence-verification' (1 replacement). |
代码审查摘要 — PR #4982「Add concrete fluid behavior 添加水泥流体行为」操作: 🔴 关键问题无阻塞性缺陷:覆写签名与可见性(
|
| 声称 | 状态 | 依据 |
|---|---|---|
resolved #4972 |
已核到 issue 正文:源头沉降 / 25% 源头+两圈凝固为原版混凝土 / 糖只挡凝固、粘液只挡下移、蜂蜜两者都挡 / 性能要求 —— 实现逐条对应 ✅;唯「level6 和 level7」的数字空间需按上面 |
|
| 添加水泥流体世界行为 | ✅ | CementFluid.java(新增 293 行)+ ModFluids 注册切换到 CementFluid.Source/Flowing |
| 源头不再成倍增殖 | ✅ | 实时状态守卫 + 同刻去重(派发链已按原版字节码核实) |
结论: COMMENT(建议保持 Draft 直到 Level、确认 64 格上限在宽台面上的表现。
标题建议(本次 gh auth status = token invalid,无法自动修改,故未执行 gh pr edit):
Add world behavior for cement fluid (source settling + solidify into concrete) 添加水泥流体的世界行为(源头沉降与凝固为混凝土)
现标题英文部分「Add concrete fluid behavior」有歧义,容易读成「新增一种混凝土流体」,实际是「给水泥流体新增世界行为」。
🧪 测试建议
| 被测目标 | 推荐场景 | 优先级 |
|---|---|---|
CementFluid.randomTick |
同刻双派发下凝固概率≈25%(1 万次统计);沉降后第二次派发不再生成源头 | 🔴 |
findLowerFlow |
台面半径 5 成功沉降 vs 半径 6~7 触发 MAX_SETTLE_SEARCH 的行为确认;金字塔交错水流不串到隔壁水股 |
🟡 |
solidify |
精确命中 amount 7/6 两圈;相邻内圈格指向同一外圈格时 Set 去重(不重复写块/触发更新) | 🟡 |
| 三方块交互 | 糖/粘液/蜂蜜各只阻止其对应行为;对角不算接触 | 🟡 |
由 Hermes Agent 审查(diff: patch-diff.githubusercontent.com 匿名获取,md5 8646530947f39ac43262d49525ddab18;原版行为用 Mojang 1.21.1 client_mappings + 混淆客户端字节码离线核对:tickChunk/LiquidBlock/FlowingFluid/DefaultedMappedRegistry)
|
💾 Self-improvement review: Patched references/head-sha-freshness-and-prior-review-verification.md in skill 'github-webhook-pr-review' (1 replacement). · Patched SKILL.md in skill 'minecraft-modding' (1 replacement). |
- 改为计划刻驱动水泥源头逐格下沉,避免源头在随机刻中重复复制 - 源头下沉时优先挪动最近的源头,保持源头数量稳定不变 - 限定搜索方向为四个水平方向加正上方,避免够到无关水体 - 调整凝固概率从 0.25 降至 0.1,防止过快凝固 - 只认实时流体状态,防止快照导致的重复操作或错判 - 添加判断接触糖块、粘液块和蜂蜜块时的特殊处理,控制下移及凝固行为 - 实现重复随机刻派发识别,避免同一刻多次凝固判定 - 规范水泥颜色判断,确保源头与流动部分正确区分和处理
Reason: script execution via -e/-c flag Reply |
|
分析完成。以下是审查意见: 代码审查摘要 — PR #4982操作: synchronize
无删除文件、无 ghost 文件、无 EOF 缺换行、无 TODO/调试残留。增量构成本 PR 全部内容,无越界改动。
🟢 核对通过(含证据)1. 内嵌
2. 用到的 API 在 1.21.1 全部存在: 3. 覆写 4. 5.
⇒ 本 PR 把 6. 源头是「挪」不是「复制」,落点确实生成真源头: 7. 颜色映射完整: 8. 与 issue #4972 的交互约定一致:粘液块→不下移、糖块/蜂蜜块→不凝固、蜂蜜块→两者都不,
|
| issue 要求 | 状态 | 对应实现 |
|---|---|---|
| 把最近的「高一格源头」挪到流动部分已到达的更低格 | transferSourceDown + findNearestSource(BFS,含 Direction.UP,限 64 格、纵向 ±1) |
|
| 25% 概率凝固 | SOLIDIFY_CHANCE = 0.1F |
|
| 源头 + 附近 level6/level7 流动部分一起凝固为对应颜色混凝土 | ✅ | solidify + isFlowOfAmount(7/6),先取内圈再扩外圈、Set 去重 |
| 接触糖块的源头不凝固、也不引发凝固 | ✅ | isSolidifyBlocked 含 SUGAR_BLOCK |
| 接触粘液块的源头不移动走 | ✅ | isMoveBlocked 含 SLIME_BLOCK |
| 接触蜂蜜块的源头两者都不 | ✅ | 两个守卫均含 HONEY_BLOCK |
| 避免性能问题、不产生大量同 gt 运算 | — |
🧪 测试建议
| 被测目标 | 推荐场景 | 优先级 |
|---|---|---|
transferSourceDown / findNearestSource |
阶梯、金字塔、垂直落差:源头逐格下沉;全程源头数量恒为 1(反复倒/收,统计源头格数) | 🔴 |
isDuplicateDispatch |
固定随机源,统计 N 次随机刻的实际凝固比例应为 ~10%(若去重失效会变成 ~19%,可直接暴露双派发) | 🔴 |
solidify |
定格验证:源头 + 两圈流动部分同时变混凝土;内圈/外圈 Set 去重(相邻内圈共享外圈格不会被重复写) | 🔴 |
| 边界 | 世界底部 y=minBuildHeight 处倒水泥(setBlockAndUpdate 失败路径);区块边界/未加载区块 |
🟡 |
| 三色阻挡 | 糖块 / 粘液块 / 蜂蜜块分别贴源头:不凝固 / 不下移 / 两者都不 | 🟡 |
| 异色相邻 | 两种颜色水泥相邻流动:源头落点已有异色流动部分时会被覆盖(当前只检查了 isSource()),确认是否符合预期 |
🟡 |
| 性能 | 大型平台/斜坡一次性倒满 16 色水泥,观察 MSPT 与同 gt BFS 次数 | 🟡 |
结论: COMMENT — 核心机制(源头下移、双派发去重、两圈凝固、颜色映射、Source/Flowing 等价替换)经字节码与 mappings 逐项核对成立且实现干净,注释质量也高于平均水准。合并前请明确两点:(1) 凝固概率 10% 是否有意偏离 issue 的 25%;(2) 计划刻触发带来的下沉节奏与同 gt BFS 负载是否满足 issue 的性能约束(最好附实测)。另外建议顺手修掉 Level 强引用与忽略 setBlockAndUpdate 返回值这两处。
由 Hermes Agent 审查
📎 附带说明(不属本 PR):本次把两条可复用核对手法写进了 github-code-review 技能——新增 scripts/mc_method_bytecode_dump.py(免 JVM 读方法体字节码)与 references/fluid-random-tick-double-dispatch.md(LiquidBlock ↔ FluidState 双派发机制、NeoForge BaseFlowingFluid 等价替换核对表),下次遇到自定义流体 PR 不用再重推一遍。
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 |
|
All checks done. Here is the review. 代码审查摘要 — PR #4982操作:
结论先行:未发现编译错误、崩溃路径或物品/方块丢失缺陷;实现与 TODO #4972 的规格逐条对应。 有 2 处与规格的数值/节奏偏差、1 处 NeoForge 事件约定、1 处单例状态问题建议确认(均非阻塞)。 ✅ 已交叉核对通过(附证据)
|
| 规格条目 | 状态 | 实现位置 |
|---|---|---|
| 源头被选中且流动部分已到更低一格 → 把最近的高一格源头挪下来 | ✅ | spread → transferSourceDown + findNearestSource(BFS 含 Direction.UP、` |
| 无法下移时按概率凝固(源头 + 附近 level6/7 流动部分 → 对应色原版混凝土) | randomTick → solidify(SOLIDIFY_AMOUNT_RING_1/2 = 7/6) |
|
| 源头只「挪」不「复制」,数量守恒 | ✅ | 落点已是同色源头则放弃并源;原格 setBlockAndUpdate(..., AIR) |
| 接触糖块的源头不凝固、也不引发凝固 | ✅ | isSolidifyBlocked(SUGAR_BLOCK) |
| 接触粘液块的源头不移走 | ✅ | isMoveBlocked(SLIME_BLOCK) |
| 接触蜂蜜块的源头既不凝固也不移走 | ✅ | 同时出现在两个判定里 |
| 避免大量同 gt 运算/性能问题 | ✅ | 每格每 tick 最多一次下沉;BFS 只入队水泥格,受 MAX_SOURCE_SEARCH = 64 兜底 |
| 触发方式可不同,但间隔要差不多 | 计划刻 5 gt/格 |
🧪 测试建议
| 被测目标 | 推荐场景 | 优先级 |
|---|---|---|
CementFluid.randomTick |
同一 gt 同格两次派发只掷一次骰(去重);跨维度/跨世界切换后去重不误判 | 🔴 |
transferSourceDown |
阶梯/金字塔边缘由流动格触发;落差直落(源头在正上方);落点已有同色源头(不并源、总数不变);源头相邻糖/粘液/蜂蜜时行为分别符合规格 | 🔴 |
solidify |
内圈 amount=7、外圈 amount=6 两圈都转换;相邻两个内圈格指向同一外圈格时只写一次;非本色的流动水泥不被误转 | 🟡 |
findNearestSource |
直落场景必须命中(回归「完全不触发」);超出 MAX_SOURCE_SEARCH 返回 null 且不移动 |
🟡 |
concrete() |
16 个 Color 全部解析到 minecraft:<color>_concrete;结果被缓存(只查一次注册表) |
🟢 |
标题建议
PR 英文标题写成了 "Add concrete fluid behavior",但本 PR 加的是水泥(cement,类名 CementFluid)的流体行为,concrete(混凝土)是它的产物——中文标题「添加水泥流体行为」是对的。建议改为:Add cement fluid behavior 添加水泥流体行为。本次 gh auth status 显示 token 已失效(The token in /opt/data/home/.config/gh/hosts.yml is invalid),故未自动修改。
结论: COMMENT — 无阻塞性缺陷,逻辑与规格逐条对应且关键常量(环 7/6、isLegacyLevel 换算、去重必要性)经字节码/mappings 实测无误;建议先与维护者确认
由 Hermes Agent 审查
|
💾 Self-improvement review: Skill 'custom-fluid-behavior-pr-review' created. · Patched SKILL.md in skill 'gas-system-pr-review' (1 replacement). |