Refactor pipe logic and add Pump block with crafting recipe#3794
Conversation
…ulations based on actual connection positions
- 移除未使用的 PumpBlock 和 Orientation 导入 - 调整 CelestialForgingAnvilPortalBlockItem 的导入位置 - 优化模块块初始化顺序
- 移除第三人称左右手的旋转设置 - 调整第三人称左右手的平移和缩放值 - 移除第一人称左右手的显示配置 - 移除地面和GUI的显示配置 - 修改头部的平移位置 - 更新固定视角的旋转和缩放设置 - 添加书架上放置的旋转配置
- 注册泵方块实体类型并添加流体处理器能力 - 实现泵的主动流体抽取和注入逻辑 - 添加泵与管道系统的连接和转换机制 - 实现泵的工作状态检测和电力消耗 - 添加泵的配方和物品模型 - 实现泵活塞动画渲染效果 - 添加泵放置时的朝向计算和管道对接逻辑
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 |
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 |
Reason: execute_code script execution. The script can spawn subprocesses or mutate files without passing through terminal command approval; approval is one-shot for this run. Reply |
Reason: execute_code script execution. The script can spawn subprocesses or mutate files without passing through terminal command approval; approval is one-shot for this run. Reply |
Reason: execute_code script execution. The script can spawn subprocesses or mutate files without passing through terminal command approval; approval is one-shot for this run. Reply |
|
我已仔细分析了整个 diff(1256 行,共涉及 16 个文件)。操作类型为 由于无法通过 API 直接发布到 GitHub(令牌不可用,未认证调用已被限流),以下是我的完整评审意见。 拉取请求 #3794 代码评审范围: 管道逻辑重构 + 新增 Pump(泵)方块及其合成配方 ✅ 核心设计评价
🔴 必须修复1.
2. Pump 的
🟡 建议修复3.
4.
5.
🟢 小问题 / 风格6. 合成配方第三行全空
7. PumpBlock 碰撞箱仅为中心 6×6×6 立方体
8. 生成模型文件末尾缺失换行符
|
- 移除自动对接管道的逻辑,避免意外的朝向反转 - 更新注释说明,默认输入端朝向目标方块,Shift 键反向 - 明确按住 Shift 键时的放置行为(输出端朝向目标方块)
|
审核完成。以下是完整的代码审查报告。 代码审查摘要 — PR #3794标题: Refactor pipe logic and add Pump block with crafting recipe 变更概述该 PR 做了两件事:
另外包含配方(2 活塞 + 1 管道 → 2 泵)、方块注册、BlockEntity 注册、标签、战利品表、Lang 文件等数据生成更新。 🔍 核心逻辑审查1.
|
- 修复注释中关于默认输出端朝向的描述 - 纠正放置时朝向计算逻辑,默认输出端朝向目标方块,Shift反向 - 调整活塞动画渲染代码顺序,确保注释与实现一致 - 优化活塞移动偏移量计算的代码结构
- 调整碰撞箱从 6x6x6 中心体 [5,5,5]→[11,11,11] - 修改为匹配模型元素 1/2/7 的尺寸 x[3,13] y[3,13] z[0,16]
- 将单一碰撞箱拆分为三个方向特定的碰撞箱(X、Y、Z轴) - 为NORTH_UP/SOUTH_UP朝向添加沿Z轴延伸的碰撞箱 - 为WEST_UP/EAST_UP朝向添加沿X轴延伸的碰撞箱 - 为UP_*/DOWN_*朝向添加沿Y轴延伸的碰撞箱 - 根据方块朝向动态返回正确的碰撞箱形状 - 修正了方块在不同方向下碰撞检测不准确的问题
|
Now I have a complete picture. Let me compile the review. 代码审查摘要 — PR #3794: Refactor pipe logic and add Pump block作者: Gu-ZT | 分支: 变更概览此 PR 为管道系统添加了 Pump(泵)方块:
🟡 警告1. JavaDoc 与实现不一致:输入端/输出端高度偏移符号
但实现中 // sourceCurPos 和 targetCurPos 各加一次 heightBonus
if (level.getBlockEntity(sourceCurPos) instanceof AbstractPipeBlockEntity be) {
sourceEffectiveY += be.getHeightBonus();
}
if (level.getBlockEntity(targetCurPos) instanceof AbstractPipeBlockEntity be) {
targetEffectiveY += be.getHeightBonus();
}这意味着泵在两端都提供 +10 加成,而不是输入端 +10、输出端 -10。由于泵的主动 建议: 要么修正注释描述(改为"输入端 +10,输出端不受影响"),要么根据方向实现符号区分——即当泵作为输入侧时提供 +10,作为输出侧时提供 -10。 2.
💡 建议3. 被动流体传输中的 heightBonus 可能双重叠加 在重构后的
如果连接链中存在两个泵(比如一个作为源、另一个作为目标的邻居),它们的 4. @Override
public IFluidHandler getFluidHandler() {
return new PumpFluidHandler();
}NeoForge 的能力系统会频繁调用 private final IFluidHandler fluidHandler = new PumpFluidHandler();
@Override
public IFluidHandler getFluidHandler() {
return fluidHandler;
}注意: 5. 第三行空配方行的放置习惯 配方的第三行是 ✅ 看起来不错
结论请求更改 — 符号不一致的 JavaDoc/实现需要澄清或修正(#1),建议修复 由 Hermes Agent 自动审查 |
- 导入 Axis 类用于旋转操作 - 移除 Direction 导入并改用 BakedModel 替代 ModelResourceLocation - 通过姿态变换应用 blockstate 旋转使活塞坐标系与模型对齐 - 将活塞模型沿 Z 轴方向移动改为在模型空间内进行变换 - 简化活塞偏移计算逻辑并优化姿态堆栈管理 - 更新渲染方法参数以直接使用烘焙模型对象 - 删除无用的方向变量和注释说明
|
我已完整审查了 PR #3794 的所有变更。以下是审查意见: 代码审查摘要PR #3794 — Refactor pipe logic and add Pump block with crafting recipe 🔴 关键
|
- 添加了 BaseEntityBlock 和 BlockEntity 相关接口实现 - 重构了注释以提高代码可读性 - 实现了 TickableBlockEntity 功能 - 优化了流体处理逻辑,增加电网供电检查 - 修复了红石信号和电网过载状态处理 - 更新了碰撞箱和方块状态处理逻辑
- 在Y轴方向移动-2像素以校正整体位置 - 将活塞1的Z轴偏移量改为Y轴偏移 - 将活塞2的Z轴偏移量改为Y轴偏移 - 注册新的泵活塞模型资源位置
- 应用负值旋转角度以校正 blockstate 与 JOML 坐标系之间的差异 - 调整旋转应用顺序为先 X 轴后 Y 轴以确保正确的变换矩阵乘法 - 添加注释说明坐标系差异及旋转顺序的重要性
- 将 PumpBlock 从 dev.dubhe.anvilcraft.block 移至 dev.dubhe.anvilcraft.block.fluid - 将 PumpBlockEntity 从 dev.dubhe.anvilcraft.block.entity 移至 dev.dubhe.anvilcraft.block.entity.fluid - 更新 AbstractPipeBlockEntity、PipeBlockEntity、PipeNodeBlockEntity 中的导入路径 - 更新 ModBlocks 和 ModBlockEntities 中的导入路径以匹配新的包结构 - 在 PipeBlockEntity 中提前声明 effectiveHeight 变量避免重复定义 - 优化 PumpBlockEntity 的客户端渲染逻辑,直接设置 working 状态
- 调整 AbstractPipeBlockEntity 中 PumpBlock 的导入位置 - 重新排序 ModBlockEntities 中 PumpBlockEntity 的导入顺序 - 重新组织 ModBlocks 中 PumpBlock 的导入并优化注解格式 - 调整 PipeBlockEntity 和 PipeNodeBlockEntity 中 PumpBlock 的导入顺序 - 优化 PumpBlockEntityRenderer 中的常量文档注释格式 - 重构 CelestialForgingAnvilBlock 的战利品表生成代码结构
|
现在我已经完成了全面分析,以下是 PR 审查: 代码审查摘要PR #3794 — 重构管道逻辑并添加 Pump 方块与合成配方 🟢 总体评价该 PR 结构清晰、文档完善。核心重构(将 🔴 关键问题1.
2. 两端均连接 Pump 时
🟡 警告1. 水平直管不再跳过 tick 逻辑 — 性能影响可忽略但需确认设计意图
2.
3. 生成资源文件缺少末尾换行符 (6 处)
4.
💡 建议1.
2.
3. 文档注释中
✅ 看起来不错
审查结论:需要修改(2 个关键问题需确认/修复 + 若干建议) |
|
我已完成对 PR #3794 的全面审查。以下是分析结果: 代码审查摘要结论:评论(有若干值得关注的警告和建议,无阻塞性问题) PR 标题: Refactor pipe logic and add Pump block with crafting recipe
|
- 修复泵输出方向判断逻辑,使用相反方向进行匹配检查 - 合并泵状态检查条件以简化代码流程 - 添加网络数据包同步功能到泵块实体 - 实现 getUpdatePacket 方法以支持客户端同步
- 修正了相邻流体处理器时泵输出端的方向计算 - 将方向参数从原始方向改为相反方向以确保正确流向 - 解决了泵无法正确向相邻流体处理器排液的问题
Reason: Security scan — [MEDIUM] Variation selector characters detected: Content contains Unicode variation selectors (VS1-256). These are commonly used in emoji sequences but may indicate steganographic encoding or obfuscation Reply |
- 移除 IFluidHandlerHolder 接口实现 - 删除 PumpFluidHandler 内部类及其相关方法 - 移除流体传输相关的逻辑处理代码 - 删除 lastTransferAmount 属性及 NBT 相关操作 - 简化客户端渲染器中的动画速度计算 - 移除流体传输相关的 tick 处理逻辑
|
现在我已经完整阅读了所有变更。以下是审查结果。 代码审查摘要PR #3794: 重构管道逻辑并添加泵方块与合成配方 🟢 主要变更
|
- 修正泵的方向判断逻辑,移除不必要的反向操作 - 更新泵端位置计算,确保正确的流体传输路径 - 移除泵块实体的能力注册以避免冲突 - 优化泵的工作状态检查逻辑 - 添加完整的流体传输实现,包括高度检测和管道连接处理
- 修正了泵连接时的方向参数传递错误 - 调整了管道追踪中相反方向的计算方式 - 统一了流体传输中的方向处理逻辑 - 修复了管道系统中高度累积的计算问题 - 优化了管道端点查找的递归调用参数 - 解决了泵连接检测中的方向反转错误
- 移除重复的流体传输代码并提取为独立方法 tickEndCount2 - 简化主逻辑中的条件判断和变量声明 - 优化泵连接检查的处理流程 - 统一不同管道类型的流体传输调用方式 - 提高代码复用性和维护性
- 移除了 @SuppressWarnings 注解中的冗余大括号和换行 - 将多行注解数组改为单行紧凑格式 - 保持了原有的 unused 和 CodeBlock2Expr 检查忽略功能
Reason: Security scan — [MEDIUM] Variation selector characters detected: Content contains Unicode variation selectors (VS1-256). These are commonly used in emoji sequences but may indicate steganographic encoding or obfuscation Reply |
Reason: Security scan — [MEDIUM] Variation selector characters detected: Content contains Unicode variation selectors (VS1-256). These are commonly used in emoji sequences but may indicate steganographic encoding or obfuscation Reply |
|
我已经收集了足够的资料。以下是我的审查: 代码审查:PR #3794 — 重构管道逻辑并新增 Pump(泵)方块作者: Gu-ZT 变更概述本 PR 对管道系统进行了重大重构,并新增了 Pump(泵)方块:
🔴 关键无
|
|
Now I have enough data for a thorough review. Let me compose my findings. PR #3794 代码审查摘要标题: Refactor pipe logic and add Pump block with crafting recipe 🔴 关键问题1. 生成资源文件缺失尾随换行符(POSIX 兼容性问题) 6 个新生成/修改的资源文件末尾缺少换行符,在 diff 中标记为
请检查数据生成器配置,确保新生成的文件末尾包含换行符。虽然对 JSON 解析无害,但 6/7 个新文件都缺少影响 POSIX 工具链(diff、patch、sed 行号计算)的一致性。
|
| 旧行为 | 新行为 |
|---|---|
| 两端水平直管/弯管 → 跳过(不传输流体) | 两端水平管 → 总是处理 |
旧代码:
// 水平直管 with 2 ends → 跳过
if (endCount == 2 && isStraight && !Direction.Axis.Y.equals(...)) { return; }
// 水平弯管 → 跳过
if (endCount == 2 && ...not UP/DOWN...) { return; }新代码移除了这些早期返回,对所有 2端管调用 tickEndCount2。目前功能等价,因为 moveFluidWithHeightCheck 对同 Y 水平两端返回(高度差为 0),但若有其他方块或未来 PR 改变了高度计算逻辑,此行为会静默激活水平管流体传输。建议在 tickEndCount2 顶部添加显式的水平管跳过检查,或在高度差为 0 时明确返回,以保持行为可预测。
3. PumpBlockEntity.tick 中 getPipeEnd 空指针保护
PumpBlockEntity.tick 第 37-42 行——getPipeEnd 返回 null 时,targetCurPos = pos(泵自身)、targetCurDir = sourceDir.getOpposite()。这意味着泵在无输出 PipeEnd 时仍会调用 moveFluidWithHeightCheck。对于输出端直接指向流体处理器(非管道)的情况,此行为正确(泵作为源端,处理器作为目标端),但对于无法定位 PipeEnd 的其他边缘情况(如区块未加载),泵可能会尝试以自身为终端传输流体,消耗不必要的计算资源。建议在 pumpEnd == null 时显式 return:
if (pumpEnd == null) {
// PipeEnd 不可达,跳过
return;
}💡 建议
4. tickEndCount2 中双泵端头的死锁(设计共识)
tickEndCount2 在管道两端都遇到泵时静默返回(两端源端检查都触发早期 return)。此行为合理(泵应自行管理流体),但建议在注释中明确说明此设计意图,防止未来修改时误认为遗漏。
5. moveFluidWithHeightCheck 签名破坏性变更
方法签名从 (Level, BlockPos, Direction, BlockPos, Direction) 变更为 (Level, BlockPos, Direction, BlockPos, Direction, int)。此 public static 方法若在 PR 外有其他调用者,会导致编译错误。经检查,当前代码库中所有调用者均包含在此 PR 中并已更新,但建议设置兼容性重载:
// 保持与旧 API 兼容
public static void moveFluidWithHeightCheck(Level level, BlockPos p1, Direction d1, BlockPos p2, Direction d2) {
moveFluidWithHeightCheck(level, p1, d1, p2, d2, 0);
}6. 配方产量建议
配方产出 2 个泵("count": 2),消耗 2 个活塞 + 1 根管道。考虑到泵消耗 32kW 电力且实现 10 m 扬程,产量 2 个是合理的 QoL(玩家通常需要多个泵来搭建抽水系统)。
7. 泵的碰撞箱分支简化
PumpBlock.getShape 对 X/Y/Z 轴使用三个 10×10×16 的盒子。分支逻辑是 switch 表达式,但 default 分支覆盖了 Z 轴以外的所有 Axis 值(X 和 Y 已单独列出,default 只可能命中 Z)。可显式指定 case Z 替代 default:
return switch (state.getValue(ORIENTATION).getDirection().getAxis()) {
case X -> SHAPE_X;
case Y -> SHAPE_Y;
case Z -> SHAPE_Z;
};✅ 设计亮点
- 高度偏移重构合理:将
heightBonus从 per-BE 的持久化字段改为递归传递的accumulatedHeight,消除了跨区块一致性问题 - 泵的透传追踪设计清晰:
getPumpPipeEnd处理双向穿透——管道端指向泵时自动透传,泵输出端指向管道时继续追踪到终端 - 红石/过载/电网三层控制:
PumpBlockEntity妥善处理红石信号→关闭、过载→关闭、正常供电→工作,状态同步通过flushState+setBlockAndUpdate完成 - 重入防护:
PumpBlockEntity.transferring字段标记用于防止IFluidHandlerrelay 时的无限递归 - 铁砧锤交互:实现了
IHammerChangeable接口,支持铁砧锤反转泵方向 - 泵放置时侧面直管自动转三通节点:
setPlacedBy中检测贴在侧面的直管并自动转换为PipeNodeBlock,保留原有管道连接 - 活塞动画渲染器:
PumpBlockEntityRenderer使用正弦/余弦交替驱动两组活塞模型,运动速度归一化(MAX_TRANSFER_RATE=500 mB/tick),视觉效果与流体量关联 - 语言文件完整:
en_us.json和en_ud.json均添加了泵的条目("block.anvilcraft.pump"),颠倒语言内容正确
📊 变更统计
| 类别 | 数量 | 说明 |
|---|---|---|
| Java 源文件 | 11 | 2 个重构 + 2 个新建(Pump + Renderer)+ 5 个小修改 |
| 生成资源 | 8 | blockstate + 2×lang + model + advancement + loot + recipe + tag |
| 手动资源 | 1 | models/block/pump.json——显示变换调整 |
| 新增行 | ~1200+ | 主要为 PumpBlock(214行)、PumpBlockEntity(168行)、Renderer(116行) |
| 删除行 | ~300+ | 主要为 heightBonus 移除和水平管跳过移除 |
| 无明显调试语句 | ✅ | 无 printStackTrace、System.out、TODO/FIXME |
| 无密钥泄露 | ✅ | 无 password/secret/token 等模式 |
| 无合并冲突 | ✅ | 无 <<<<<<</=======/>>>>>>> |
结论: 代码结构清晰,管道重构方向合理,Pump 块的功能实现完整(电力消费、红石控制、方向旋转、活塞动画、管道透传)。建议 解决资源文件尾随换行符问题,并考虑添加水平 2端管的显式跳过保护。整体质量良好,可合并。
- 添加了 infinite_collector 到碰撞免疫标签中 - 修复了泵在不同朝向下的模型旋转角度问题 - 添加了 SingularityCrystalItem 的导入语句优化 - 优化了 SmartBlockPlacerBlock 的属性获取方式 - 简化了 ConfiguredModel.builder 的引用方式 - 为 PumpBlock 添加了 checkBlockState 方法返回 false - 修复了 PumpBlockEntityRenderer 中 X 轴旋转方向的问题 - 更新了 PipeBlock 的 isFluidHandlerOrPump 方法以支持泵连接 - 修改了管道与泵连接时的连接逻辑判断 - 优化了泵放置时的朝向计算逻辑,支持垂直摆放 - 改进了泵放置后对相邻管道转换为节点的处理逻辑 - 添加了详细的 JavaDoc 注释说明各种情况下的行为
Reason: Security scan — [MEDIUM] Variation selector characters detected: Content contains Unicode variation selectors (VS1-256). These are commonly used in emoji sequences but may indicate steganographic encoding or obfuscation Reply |
Reason: script execution via -e/-c flag Reply |
|
Now I have all the context needed. Let me compile the full review. 代码审查摘要 — PR #3794标题: Refactor pipe logic and add Pump block with crafting recipe 🟢 主要变更
💡 建议1. // PumpBlockEntity.java:31-33
@Getter
@Setter
private boolean transferring;该字段声明为重入防护标志,但 tick 方法中从未对
2. 缺失中文翻译
"block.anvilcraft.pump": "泵"3. // PumpBlockEntity.java:19
// 提供输入端 +10 / 输出端 -10 的等效高度偏移。Javadoc 提到 4.
5. EOF 换行符缺失 所有 9 个生成资源文件和 1 个手动模型文件( ✅ 看起来不错
🔍 关键架构关注点(非阻塞)
|
- 删除了 transferring 字段及其相关注释 - 简化了 PumpBlockEntity 的内部状态管理 - 移除了用于防止 IFluidHandler relay 无限递归的保护机制
Reason: Security scan — [MEDIUM] Variation selector characters detected: Content contains Unicode variation selectors (VS1-256). These are commonly used in emoji sequences but may indicate steganographic encoding or obfuscation Reply |
|
I now have a complete picture of the PR. Here is the review: 代码审查摘要PR #3794 — 重构管道逻辑并新增 Pump(泵)方块及合成配方 🔴 关键1. 8 个生成资源文件缺少末尾换行符(POSIX 兼容性问题) 这些文件末尾缺少
|
|
Now I have comprehensive understanding of the PR. Let me compile the review. 代码审查摘要 — PR #3794: Refactor pipe logic and add Pump block with crafting recipe结论:请求更改(1 个严重问题,1 个警告,4 条建议) 🔴 严重1. Pump 直接连 Tank 时可能有死代码/无效传输路径 建议: 修复泵→Tank 直连的传输路径,或确保泵仅通过 PipeNode 管道网络进行传输(此时应由 PipeBlockEntity 的端头-泵透传逻辑处理)。
|
|
现在我已完整掌握了所有变更内容,可以撰写审查意见了。 代码审查摘要:PR #3794 — 重构管道逻辑并添加泵方块及合成配方结论:评论(有一些值得关注的观察,无阻塞性问题) 文件变更: 26 个文件(16 个 Java,10 个 JSON 资源),共 ~1,794 行 diff 🟢 主要变更(架构改革)1. 等效高度机制重构
2. 管道遍历引入 PumpBlock 识别
3. 管道系统全员适配 PumpBlock六个文件和所有管道类型均已同步更新:
4. 新增 PumpBlock + PumpBlockEntity
5. PumpBlock 注册 & 合成
|
Uh oh!
There was an error while loading. Please reload this page.