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

相关条目