TileTank
事实基准:
/Users/evlos/a/mirror/BuildCraft(master,minecraftVersion = 1.7.10)逐行读源码。
注册信息
| 属性 | 值 | 来源 |
|---|---|---|
| TileEntity 注册名 | net.minecraft.src.buildcraft.factory.TileTank |
BuildCraftFactory.java:108 |
| 注册类 | buildcraft.factory.TileTank |
同上 |
| 所属 modid | BuildCraft|Factory |
BuildCraftFactory.java:71 |
| 关联方块 | Tank 方块 | BuildCraftFactory.java:108 同块 |
| 实现接口 | IFluidHandler |
factory/TileTank.java 类声明 |
| 是否配置门控 | 否(无条件注册) | BuildCraftFactory.java:108 |
槽位数量与布局
没有物品槽位。factory/TileTank.java:31-32:
public final Tank tank = new Tank("tank", FluidContainerRegistry.BUCKET_VOLUME * 16, this);
public final TankManager<Tank> tankManager = new TankManager<>(tank);
1 个流体罐,容量 = 16 × 桶体积(与 TilePump 同为 16 桶,但 Pump 用 SingleUseTank,Tank 用可留存的 Tank)。
⚠ 单罐 16 桶不等于「Tank 一次存 16 桶」—— Tank 支持竖直堆叠:多个 Tank 方块竖直相连时,
getBottomTank()/getTankAbove()逐级串联(factory/TileTank.java的updateComparators()/getBottomTank())。 实际容量 = 堆叠高度 × 16 桶。
处理速率 / 耗时
没有「N tick 一次」的加工节拍——Tank 只做流体缓冲与传递,不加工。
两条网络节流(factory/TileTank.java:33-35):
| 字段 | 初值 | 含义 |
|---|---|---|
tracker |
2 * BuildCraftCore.updateFactor(:35) |
常规更新节流,周期取配置项非硬编码 |
hasNetworkUpdate / hasUpdate |
false | 更新标记位 |
特殊行为
比较器输出
updateComparators()(factory/TileTank.java:45-53)计算 calculateComparatorInputOverride(),
然后沿 getBottomTank() → getTankAbove(uTank) 向上逐级传递,
给整根 Tank 柱的每一格都写 cachedComparatorOverride。
即一整柱 Tank 共用一个比较器强度。
破基座时洒液
onBlockBreak()(factory/TileTank.java:55-58):
if (!tank.isEmpty()) {
FluidEvent.fireEvent(new FluidEvent.FluidSpilledEvent(tank.getFluid(), worldObj, xCoord, yCoord, zCoord));
}
⚠️ 只有被破坏的那一格 tank 会洒液——上方的 Tank 方块各有自己的 TileEntity,
各自在 onBlockBreak() 里处理,不存在「一次洒光整柱」的逻辑。
动态光照
updateEntity()(factory/TileTank.java:63)在客户端读 getFluidLightLevel(),
变化时调 worldObj.updateLightByType(EnumSkyBlock.Block, ...)(:70)——
即罐内流体会发光(岩浆/ghast 泪等),光照等级随流体变化重算。
GUI / Container
没有 GUI,也没有 Container(FactoryGuiHandler 无 Tank 分支)。
网络封包
走 TileEntity 默认 NBT 同步。无独立的 Factory 封包 ID。