TileRefinery
事实基准:
/Users/evlos/a/mirror/BuildCraft(master,minecraftVersion = 1.7.10)逐行读源码。 全部数值均标注文件:行号;未在源码中出现的数值一律不写。
注册信息
| 属性 | 值 | 来源 |
|---|---|---|
| TileEntity 注册名 | Refinery |
BuildCraftFactory.java:109 |
| 注册类 | buildcraft.factory.TileRefinery |
同上 |
| 所属 modid | BuildCraft|Factory |
BuildCraftFactory.java:71 @Mod |
| 关联方块 | Refinery(注册变量 refineryBlock) |
BuildCraftFactory.java:109 同块 |
| 父类 | TileBuildCraft |
factory/TileRefinery.java:37-38 |
| 实现接口 | IFluidHandler / IHasWork / IFlexibleCrafter / ICommandReceiver |
同上 |
| 是否配置门控 | 否(BuildCraftFactory.java:109 无条件调用) |
同上 |
⚠️ 注册名是 Refinery,不是 TileRefinery 去掉 Tile 的 refinery,也不是全限定名。
槽位数量与布局
没有物品槽位。TileRefinery 走流体罐模型,不实现 IInventory:
| 罐 | 变量 | 容量 | 用途 |
|---|---|---|---|
| 输入罐 1 | tanks[0] |
LIQUID_PER_SLOT |
第一路原料 |
| 输入罐 2 | tanks[1] |
LIQUID_PER_SLOT |
第二路原料 |
| 产物罐 | result |
LIQUID_PER_SLOT |
合成结果 |
:40-49:
public static int LIQUID_PER_SLOT = FluidContainerRegistry.BUCKET_VOLUME * 4;
public SingleUseTank[] tanks = { new SingleUseTank("tank1", LIQUID_PER_SLOT, this),
new SingleUseTank("tank2", LIQUID_PER_SLOT, this) };
public SingleUseTank result = new SingleUseTank("result", LIQUID_PER_SLOT, this);
public TankManager<SingleUseTank> tankManager = new TankManager<>(tanks[0], tanks[1], result);
LIQUID_PER_SLOT 是 FluidContainerRegistry.BUCKET_VOLUME 的运行时倍数,
BUCKET_VOLUME 由 Forge 流体系统给出(通常 1000 mB),本仓库源码不硬编码它,故不写死数值。
单罐容量 = 4 × 桶体积。
能量(回源码读常量)
构造函数 :60-62:
this.setBattery(new RFBattery(10000, 1500, 0));
| 参数 | 值 | 含义 |
|---|---|---|
| 容量 | 10000 | RF 满电 |
| 每 tick 接收上限 | 1500 | RF/tick |
| 最小接收量 | 0 | — |
吞吐上限推算:1500 × 20 = 30000 RF/s;从满电放到零需 10000 / 1500 = 6.67 → 约 7 tick。
处理速率 / 耗时
- 液体本身不带「每 tick 产多少」的速度参数;速度由每次抽取的
amount决定, 该值来自配方的energy字段(RefineryRecipeManager.addRecipe(..., int energy, int delay),core/recipes/RefineryRecipeManager.java:38), 每个配方不同,本条目不列举。 - 网络更新节流:
SafeTimeTracker(BuildCraftCore.updateFactor)(:54),周期是配置项非硬编码。
配方系统
用 RefineryRecipeManager.INSTANCE.getRecipes() 遍历(:257),
每 tick 用 recipe.craft(this, true) 试探匹配;匹配上则记 currentRecipeId(:261-262)。
updateRecipe()(:253)在槽位变化时被调用(:239、:248)。
支持一进一出与两进一出两种形态,由 RefineryRecipeManager.INSTANCE.getValidFluidStacks1()
和 getValidFluidStacks2() 区分(:231、:235)。
GUI / Container 配对
| GUI 类 | Container 类 | 配对处 |
|---|---|---|
buildcraft.factory.gui.GuiRefinery |
buildcraft.factory.gui.ContainerRefinery |
factory/FactoryGuiHandler.java:45 / :81 |
ContainerRefinery(factory/gui/ContainerRefinery.java:26-36)不绑定方块实体槽位——
它只把玩家背包(热键栏 9 + 主 27 + 背包 36)加进 container,机器的流体靠 FluidHandler 而非 Slot 交互。
网络封包
有独立封包。TileRefinery 实现 ICommandReceiver 并自带读写:
| 方法 | 作用 | 行 |
|---|---|---|
writeToNBT / readFromNBT |
落盘 | — |
writeToPacket |
写 currentRecipeId |
:284 NetworkUtils.writeUTF(stream, currentRecipeId) |
readFromPacket |
读 currentRecipeId 并回查配方 |
:291、:294 |
外加 SafeTimeTracker(BuildCraftCore.updateFactor) 控制的周期 sendNetworkUpdate()(:73-75)。