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。