TilePump
事实基准:
/Users/evlos/a/mirror/BuildCraft(master,minecraftVersion = 1.7.10)逐行读源码。
注册信息
| 属性 | 值 | 来源 |
|---|---|---|
| TileEntity 注册名 | net.minecraft.src.buildcraft.factory.TilePump |
BuildCraftFactory.java:105 |
| 注册类 | buildcraft.factory.TilePump |
同上 |
| 所属 modid | BuildCraft|Factory |
BuildCraftFactory.java:71 |
| 关联方块 | Pump 方块 | BuildCraftFactory.java:105 同块 |
| 实现接口 | IHasWork / IFluidHandler / IRedstoneEngineReceiver / ILEDProvider |
factory/TilePump.java 类声明 |
| 是否配置门控 | 否(无条件注册) | BuildCraftFactory.java:105 |
槽位数量与布局
没有物品槽位。TilePump 走流体罐模型,不实现 IInventory:
factory/TilePump.java:48-49:
public static int MAX_LIQUID = FluidContainerRegistry.BUCKET_VOLUME * 16;
public SingleUseTank tank = new SingleUseTank("tank", MAX_LIQUID, this);
1 个流体罐,容量 = 16 × 桶体积(BUCKET_VOLUME 由 Forge 给出,本仓库不硬编码)。
罐名 "tank"。
对比 TileRefinery 的 3 罐 × 4 桶、 TileFloodGate 的 1 罐 × 2 桶——Pump 的罐最大(16 桶)。
能量(回源码读常量)
factory/TilePump.java:68:
this.setBattery(new RFBattery(1000, 150, 0));
| 参数 | 值 |
|---|---|
| 容量 | 1000 |
| 每 tick 接收上限 | 150 |
| 最小接收量 | 0 |
对比 TileRefinery 的 RFBattery(10000, 1500, 0)——
Pump 的容量只有 Refinery 的 1/10。
处理速率 / 耗时(本篇核心常量)
factory/TilePump.java:47:
public static final int REBUID_DELAY = 512;
⚠️ 注意源码里的拼写是 REBUID_DELAY(少了 L),这是原版的拼写错误——
引用时必须照抄 REBUID_DELAY,写成 REBUILD_DELAY 就对不上源码。
| 常量 | 值 | 换算 | 含义 |
|---|---|---|---|
REBUID_DELAY |
512 | 512 tick = 25.6 秒 | SafeTimeTracker 的节流周期(:56) |
MAX_LIQUID |
BUCKET_VOLUME * 16 |
— | 罐容量 |
⚠️ REBUID_DELAY = 512 是「重新规划 / 重建流体路径」的间隔,不是「抽一桶水要 25.6 秒」。
它被包在 new SafeTimeTracker(REBUID_DELAY)(:56)里,作用是限制重算频率。
把它写成「抽液体速率」即为语义写反。
网络更新另有一条独立节流:SafeTimeTracker(Math.max(16, BuildCraftCore.updateFactor))(:64),
源码注释 // tick % 16 => min. 16 ticks per network update——
下限 16 tick,即最快 0.8 秒一次同步。
工作方式
Pump 在流体源与目标之间逐层搜索,用 pumpLayerQueues(TreeMap<Integer, Deque<BlockIndex>>,:52)
按 Y 层排队,并维护实体方块管道 EntityBlock tube(:51)作为可见的泵管。
tickPumped 初值为 tick - 20(:58),tick 初值是 Utils.RANDOM.nextInt(32)(:57)——
即每台 Pump 的相位随机,避免整齐同步。
GUI / Container
没有 GUI,也没有 Container(FactoryGuiHandler 无 Pump 分支)。
自动化接口
实现 IFluidHandler,流体可由管道 / 漏斗直接进出,不经 GUI 槽位。
网络封包
走 TileEntity 默认 NBT 同步 + 上述两条 SafeTimeTracker 节流。无独立的 Factory 封包 ID。