TileHopper

事实基准:/Users/evlos/a/mirror/BuildCraft(master,minecraftVersion = 1.7.10)逐行读源码。

注册信息

属性 值 来源
TileEntity 注册名 net.minecraft.src.buildcraft.factory.TileHopper BuildCraftFactory.java:110
注册类 buildcraft.factory.TileHopper 同上
所属 modid BuildCraft|Factory BuildCraftFactory.java:71
关联方块 BC Hopper BuildCraftFactory.java:110 同块
实现接口 IInventory / IEnergyHandler / IRedstoneEngineReceiver factory/TileHopper.java 类声明
是否配置门控 否(无条件注册) BuildCraftFactory.java:110

槽位数量与布局

factory/TileHopper.java:28:

private final SimpleInventory inventory = new SimpleInventory(4, "Hopper", 64);

即 SimpleInventory(4, "Hopper", 64):4 个槽位,单槽上限 64,内部名 "Hopper"。 容量不是原版 5 槽漏斗。

槽位 用途 GUI 坐标(ContainerHopper.java:28-31)
0 缓存输入(上排左) (62, 18)
1 缓存输入(上排右) (80, 18)
2 缓存输入(中) (98, 18)
3 缓存输入(下) (80, 36)

行为是菱形排布(3 + 1 中间再 1),不是矩形 2×2。

能量(回源码读常量)

initialize() 内 factory/TileHopper.java:33:

this.setBattery(new RFBattery(10, 10, 0));
参数 值
容量 10
每 tick 接收上限 10
最小接收量 0

容量与每 tick 上限都是 10——BuildCraft 漏斗是极低能耗的排序器,不是搬运主力。

处理速率 / 耗时

节拍写死在 updateEntity() 的取模里(factory/TileHopper.java:62):

if (worldObj.isRemote || isEmpty || worldObj.getTotalWorldTime() % 2 != 0) {
    return;
}
  • 模 2 → 每 2 个世界 tick 执行一次 = 10 次/秒。
  • 另有短路条件:isEmpty 为真时直接返回(连取模都省了)。
  • 每次执行按 internalSlot 递增遍历 inventory.getSizeInventory()(:77-78、:98-99、:117-118), 逐槽取出塞给下方方块的 ITransactor(Transactor.getTransactorFor(outputTile),:68); 成功则 inventory.decrStackSize(internalSlot, 1)(:90 与 :106 两处)。

单件耗时:4 槽全满时最坏情况需 4 个节拍才能清空 → 约 8 tick = 0.4 秒。

GUI / Container 配对

GUI 类 Container 类 配对处
buildcraft.factory.gui.GuiHopper buildcraft.factory.gui.ContainerHopper factory/FactoryGuiHandler.java:52 / :88

ContainerHopper(factory/gui/ContainerHopper.java:22-42): 4 个方块槽 + 玩家热键栏 9 槽(:36)+ 玩家主背包 27 槽(:42)。

自动化接口

TileHopper 自己实现 IInventory,因此可被漏斗 / 管道直接抽取,不必开 GUI。 SimpleInventory 另注册了监听器 inventory.addListener(this)(:34)以在内容变化时唤醒机器。

NBT 兼容

readFromNBT 显式兼容 6.0 之前的老格式(factory/TileHopper.java:43-49,判定在 :43): 若根 NBT 没有 inventory 键,则回退去读嵌套的 inventory 子复合表。

网络封包

无独立封包 ID。走 TileEntity 默认的 NBT 同步(writeToNBT / readFromNBT,:52-57), 本类未实现 BuildCraft 的 writeToPacket / readFromPacket。

相关条目