流体系统
了解 Rebar 流体系统的工作原理和使用方法
最后更新时间
作者:Idra
流体点是什么?
流体点是您点击后用来放置管道的红/绿/灰方块。共有 3 种类型:INPUT(绿色)、OUTPUT(红色)和 CONNECTOR(灰色)。INPUT 和 OUTPUT 挂载在方块上,负责流体的存取;CONNECTOR 只负责连通其他流体点。
要为您的机器创建流体连接点,您可以调用 FluidPointInteraction.make(...)。
流体方块
PylonFluidBlock
任何带流体输入/输出的方块都必须实现 PylonFluidBlock。通过这个接口,您可以从输入点请求流体、向输出点供应流体,并定义方块如何存取流体。觉得抽象?请参阅下文"Ticking"部分了解具体工作方式。
有关用法信息,请参阅 PylonFluidBlock Javadocs。
PylonFluidBufferBlock
大多数流体机器都需要在内部存储流体。比如压榨机有一个默认容量 1000mB 的内部缓冲区,用来存植物油。因为这种情况太常见了,我们专门做了 PylonFluidBufferBlock 接口来处理,让您的方块可以很方便地管理流体缓冲区。
有关用法信息,请参阅 PylonFluidBufferBlock Javadocs。
PylonFluidTank
另一种常见需求是"流体 tank"——一次只存一种流体,但可以切换存储不同类型的流体。PylonFluidTank 就是实现这种模式的组件。
有关用法信息,请参阅 PylonFluidTank Javadocs。
物理与虚拟流体点
流体点分为物理流体点和虚拟流体点两种。物理流体点负责显示方框和处理玩家交互,内部持有一个虚拟流体点。这个区分乍一看有点绕,但能让底层逻辑保持简洁。
物理流体点本质上就是虚拟流体点的包装层,您几乎不需要关心它。后文提到"流体点"时,指的都是虚拟流体点。
虚拟流体点包含以下属性:UUID(方便引用)、类型、已连接的流体点、所属方块等。如果流体点是 INPUT 或 OUTPUT 类型,其所属方块必须实现 PylonFluidBlock。
分段
流体的管理依赖"分段"(Segment)机制。分段就是一组互相连通的流体点的集合,包含了该分段内所有已连接的流体点。举个例子(横线代表管道):
A---B-----C D--E F这里 A、B、C 在同一个分段,D 和 E 在另一个分段,F 单独一个分段。
如果拆掉 B 和 C 之间的管道,A 和 B 会形成新分段,C 也单独成为一个新分段,旧分段随之消失。反过来,如果接通 C 和 D,那么 A/B/C 和 D/E 两个分段就会合并成一个新的。
Ticking
分段是流体 ticking 机制的基础。每个分段每隔几个游戏刻 tick 一次(具体间隔取决于服务器配置)。流体分段被 tick 时,会依次执行以下步骤:
- 调用分段内每个方块的
getRequestedFluids,收集各方块请求的流体类型和数量。 - 遍历每种可供应的流体。
- 如果该流体不在分段的允许列表中,跳过。
- 如果没有任何方块请求该流体(即所有方块的
fluidAmountRequested返回 0),跳过。 - 找到至少有一个方块在请求的流体后,使用轮询算法从各供应方尽可能抽取流体,抽取量取决于管道传输能力和请求量。
- 再做一轮轮询,这次是把流体分配给各需求方,尽量均匀分发。
流体流速和允许的流体
我们通常需要限制管道的流体传输速度。精确控制每根管道的流速既困难又消耗性能,所以我们的做法是按分段来限制流速。同样,限制允许通过的流体类型(比如木管道不允许热流体)也是按分段来配置的。
这也解释了为什么不同类型的管道不能直接对接——合并后的分段到底该用哪根管道的流速配置?
当两个分段合并时,系统会任选其中一个分段的流速和允许流体列表作为新分段的配置。当分段分裂时,旧分段的配置会保留到各个新分段中。
管道放置逻辑
这段代码太复杂了,不打算在这里展开解释。如果您需要修改这部分代码,祝您好运。