TileEntityFuelLoader(燃料装填台)
事实基准:
/Users/evlos/a/mirror/Galacticraft(master,minecraftVersion = 1.7.10)逐行读源码。
注册信息
| 属性 | 值 | 来源 |
|---|---|---|
| TileEntity 注册名 | Fuel Loader |
GalacticraftCore.java:713 |
| 所属 modid | GalacticraftCore |
core/Constants.java:7,@Mod 见 GalacticraftCore.java:160-161 |
| 关联方块 | micdoodle8.mods.galacticraft.core.blocks.BlockFuelLoader |
core/blocks/BlockFuelLoader.java:58-61 |
| 父类 | TileBaseElectricBlockWithInventory |
core/energy/tile/TileBaseElectricBlockWithInventory.java:10 |
| 实现接口 | ISidedInventory / IFluidHandler / ILandingPadAttachable |
core/tile/TileEntityFuelLoader.java:33-34 |
| 槽位数 | 2(getSizeInventory() 本类未覆写,继承 core/energy/tile/TileBaseElectricBlockWithInventory.java:46-48,返回 getContainingItems().length) |
同上 |
槽位与字段
core/tile/TileEntityFuelLoader.java:36-47:
| 成员 | 值 / 类型 | 含义 | 来源 |
|---|---|---|---|
tankCapacity |
12000(private final int) |
燃料罐容量 | core/tile/TileEntityFuelLoader.java:36 |
fuelTank |
FluidTank(容量 12000) |
燃料液罐 | core/tile/TileEntityFuelLoader.java:38-39 |
containingItems |
ItemStack[2] |
物品槽 | core/tile/TileEntityFuelLoader.java:41 |
correctFuel |
boolean(@NetworkedField) |
当前燃料与目标实体是否匹配 | core/tile/TileEntityFuelLoader.java:43-44 |
attachedFuelable |
IFuelable |
缓存的可加注对象 | core/tile/TileEntityFuelLoader.java:46 |
loadedFuelLastTick |
boolean |
上一 tick 是否成功加注 | core/tile/TileEntityFuelLoader.java:47 |
getContainingItems()(:186-188)返回 containingItems → getSizeInventory() 恒为 2。
| 槽位 | 用途 | 源码 |
|---|---|---|
| 0 | 电池 | core/tile/TileEntityFuelLoader.java:228-229 判 ItemElectricBase.isElectricItem;getBatteryInSlot() 固定返回槽 0(core/energy/tile/TileBaseElectricBlockWithInventory.java:124-126) |
| 1 | 燃料罐输入 | core/tile/TileEntityFuelLoader.java:227-229 只接受 GCItems.fuelCanister |
⚠ getInventoryStackLimit() 被覆写为 1(:196-198),
与基类的 64(core/energy/tile/TileBaseElectricBlockWithInventory.java:102-104)不同。
⚠ 槽 1 在 updateEntity 里实际能处理的不止 fuelCanister:
:66-78 处理 GCItems.fuelCanister(用完变成 oilCanister);
:79-92 处理任何 FluidContainerRegistry.isFilledContainer 判定为
RocketFuels.isValidFuel 的液体容器;:93-112 处理任何 IFluidContainerItem
(要求 stackSize == 1)。但 isItemValidForSlot(:227-229)只放行 fuelCanister——
手动物品判定比机器判定严格,这是源码里两处逻辑的不一致。
tick 逻辑与周期(本篇核心常量)
updateEntity(:59-150)按 tick 取模分三段:
| 周期 | 行为 | 来源 |
|---|---|---|
每 10 tick(ticks % 10 == 0) |
处理槽 1 的燃料罐 / 液体容器,往 fuelTank 灌注 |
core/tile/TileEntityFuelLoader.java:65 |
每 100 tick(ticks % 100 == 0) |
清空 attachedFuelable 缓存,扫描 6 个相邻面找 IFuelable |
core/tile/TileEntityFuelLoader.java:115-133 |
| 每 tick | 若有燃料且 isCorrectFuel 且 hasEnoughEnergyToRun && !disabled,加注 |
core/tile/TileEntityFuelLoader.java:135-148 |
相邻扫描会先看是否是 TileEntityMulti,是则取 getMainBlockTile()
(:121-123),所以多方块着陆台要走主块才认得出。
能量与加注速率
| 常量 | 值 | 含义 | 来源 |
|---|---|---|---|
maxExtract |
30 | 拉取功率 | core/tile/TileEntityFuelLoader.java:50 |
| 容量 | 16000 | 本类不调 setCapacity,沿用 STANDARD_CAPACITY |
core/energy/tile/EnergyStorageTile.java:18、:23 |
| 加注量 | 2 * ConfigManagerCore.rocketFuelFactor mB / tick |
实际灌入目标罐的量受 addFuel 返回值限制 |
core/tile/TileEntityFuelLoader.java:138-145 |
⚠ rocketFuelFactor 是配置项,本类没有硬编码默认值——
本条目不写死具体 mB 数。hasEnoughEnergyToRun 是父类电力判定,
shouldUseEnergy()(:268-273)要求「罐里有液 + 未被禁用 + 上一 tick 真的加上了」。
⚠ 单位是 gJ,不是 RF/t、不是 EU/t。
流体接口
IFluidHandler 的 4 个方法都被裁剪过:
| 方法 | 行为 | 来源 |
|---|---|---|
canDrain(...) |
恒 false |
core/tile/TileEntityFuelLoader.java:231-234 |
drain(..., FluidStack, boolean) |
恒 null |
core/tile/TileEntityFuelLoader.java:236-239 |
drain(..., int, boolean) |
恒 null |
core/tile/TileEntityFuelLoader.java:241-244 |
fill(..., FluidStack, boolean) |
只从背向方块朝向的一面注入,且须 RocketFuels.isValidFuel |
core/tile/TileEntityFuelLoader.java:251-261 |
canFill(...) |
罐未满即可 | core/tile/TileEntityFuelLoader.java:246-249 |
getTankInfo(...) |
1 个罐 | core/tile/TileEntityFuelLoader.java:263-266 |
ILandingPadAttachable.canAttachToLandingPad(...) 恒 true(:275-278)。
GUI / Container
| GUI 类 | Container 类 | 分派处(core/client/gui/GuiHandler.java) |
|---|---|---|
core.client.gui.container.GuiFuelLoader |
core.inventory.ContainerFuelLoader |
Container :121-122、Gui :209-210 |
网络封包
fuelTank、correctFuel 为 @NetworkedField(targetSide = Side.CLIENT)(:38-44)。
封包范围与冷却继承 TileBaseUniversalElectrical:12.0 / 3
(core/energy/tile/TileBaseUniversalElectrical.java:45-51)。无独立封包 ID。
NBT 只在罐非空时写 fuelTank 标签(:180-182),读时判 hasKey("fuelTank")(:170-172)。