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)。

相关条目