TileEntityGasLiquefier(气体液化机)

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

注册信息

属性 值 来源
TileEntity 注册名 Gas Liquefier planets/mars/MarsModule.java:246
所属 modid GalacticraftMars core/Constants.java:8,@Mod 见 planets/GalacticraftPlanets.java:37-38
注册方法入口 MarsModule.registerTileEntities(),由 planets/mars/MarsModule.java:153 调用 planets/mars/MarsModule.java:241-252
关联方块 micdoodle8.mods.galacticraft.planets.mars.blocks.BlockMachineMarsT2 planets/mars/blocks/BlockMachineMarsT2.java:214-215
父类 TileBaseElectricBlockWithInventory core/energy/tile/TileBaseElectricBlockWithInventory.java:10
实现接口 ISidedInventory / IDisableableMachine / IFluidHandler / IOxygenReceiver planets/mars/tile/TileEntityGasLiquefier.java:42-43
槽位数 4(getSizeInventory() 本类未覆写,继承 core/energy/tile/TileBaseElectricBlockWithInventory.java:46-48,返回 getContainingItems().length) 同上

⚠ 注册不在 GalacticraftCore.java,而在 planets/mars/MarsModule.java:241-252。 modid 取自 Constants.MOD_ID_PLANETS = "GalacticraftMars"(core/Constants.java:8), 不是从目录名推断。

槽位与字段

planets/mars/tile/TileEntityGasLiquefier.java:45-71:

成员 值 / 类型 含义 来源
tankCapacity 2000(private final int) 单个产物罐容量 planets/mars/tile/TileEntityGasLiquefier.java:45
gasTank FluidTank(tankCapacity * 2 = 4000) 气体输入罐 planets/mars/tile/TileEntityGasLiquefier.java:47-48
liquidTank FluidTank(2000) 产物罐 1 planets/mars/tile/TileEntityGasLiquefier.java:50-51
liquidTank2 FluidTank(2000) 产物罐 2 planets/mars/tile/TileEntityGasLiquefier.java:53-54
containingItems ItemStack[4] 物品槽 planets/mars/tile/TileEntityGasLiquefier.java:61
processTimeRequired int,初值 3 单次液化耗时 planets/mars/tile/TileEntityGasLiquefier.java:56
processTicks int,初值 -10,@NetworkedField 进度(负值代表待机蓄能) planets/mars/tile/TileEntityGasLiquefier.java:58-59
airProducts int,初值 -1 所在维度的可液化组分编码 planets/mars/tile/TileEntityGasLiquefier.java:62
gasTankType / fluidTankType / fluidTank2Type int,初值 -1,均 @NetworkedField 各罐当前装的是 TankGases 的哪一项 planets/mars/tile/TileEntityGasLiquefier.java:64-71

getContainingItems()(:462-464)返回 containingItems → getSizeInventory() 恒为 4。

槽位 用途 源码
0 电池 planets/mars/tile/TileEntityGasLiquefier.java:519-520 判 ItemElectricBase.isElectricItem
1 气体输入(罐 / 大气阀 / 通用流体容器) planets/mars/tile/TileEntityGasLiquefier.java:521-522 判 FluidUtil.isValidContainer
2 产物罐 1 输出 planets/mars/tile/TileEntityGasLiquefier.java:523-524、:522
3 产物罐 2 输出 planets/mars/tile/TileEntityGasLiquefier.java:523-524、:522

getAccessibleSlotsFromSide(:479-489)按面分权限:

面 可访问槽 来源
side == 0(底面) {0, 1, 2, 3} planets/mars/tile/TileEntityGasLiquefier.java:480-482
side > 1(四个侧面) {1, 2, 3} planets/mars/tile/TileEntityGasLiquefier.java:484-486
side == 1(顶面) {0} planets/mars/tile/TileEntityGasLiquefier.java:488

处理速率 / 耗时(本篇核心常量)

常量 值 含义 来源
maxExtract 60(hardMode 90) 拉取功率 planets/mars/tile/TileEntityGasLiquefier.java:93
tier 固定 2 构造器无条件 setTierGC(2) planets/mars/tile/TileEntityGasLiquefier.java:94
容量 16000 本类不调 setCapacity,沿用 STANDARD_CAPACITY core/energy/tile/EnergyStorageTile.java:18、:21
maxReceive 25 默认值,本类不调 setMaxReceive core/energy/tile/EnergyStorageTile.java:21(new EnergyStorage(STANDARD_CAPACITY, 10),两参构造见 core/energy/tile/EnergyStorage.java:19-21,展开为 maxReceive = 2.5F * 10 = 25、maxExtract = 10)
1 级供电耗时 3 tick poweredByTierGC == 2 ? 2 : 3 planets/mars/tile/TileEntityGasLiquefier.java:244
2 级供电耗时 2 tick 同上 planets/mars/tile/TileEntityGasLiquefier.java:244
待机蓄能下限 -10 --processTicks <= -10 时钳住 planets/mars/tile/TileEntityGasLiquefier.java:255-257

⚠ processTicks 可以是负数(初值 -10),与熔炉/压缩机的 0 起始不同。 待机时 processTicks 从 -10 继续往下减到 -10 就停(:255-257); 一旦满足 processTicks <= 0 且有电,就从 processTimeRequired 重新计时(:247-251)。

⚠ 单位是 gJ,不是 RF/t、不是 EU/t。

TankGases 枚举

planets/mars/tile/TileEntityGasLiquefier.java:73-90:

枚举值 index 气体名 液态产物名
METHANE 0 methane fuel(旧配置下为 fuelgc)
OXYGEN 1 oxygen liquidoxygen
NITROGEN 2 nitrogen liquidnitrogen
ARGON 3 argon liquidargon
AIR 4 atmosphericgases xxyyzz

产物名的切换由 ConfigManagerCore.useOldFuelFluidID 决定(:75)。

液化逻辑

doLiquefaction(:367-398)分三支:

情形 消耗 来源
罐内是 AIR 按 getAirProducts() 编码逐组分分流,每组分取 min(gasAmount / 2, 3),罐内气体按产物量 ×2 扣(:385) planets/mars/tile/TileEntityGasLiquefier.java:374-392
罐内只剩 1 单位气体 直接 1:1 灌进产物罐(:394) planets/mars/tile/TileEntityGasLiquefier.java:393-394
其他 每次取 min(gasAmount / 2, 3),按产物量 ×2 扣气体(:396) planets/mars/tile/TileEntityGasLiquefier.java:395-397

getAirProducts()(:346-365)读所在维度的 atmosphere 列表, 最多打包 3 个组分进一个 int(每 4 bit 一组,:352-358); 非 WorldProviderSpace 时返回 35(:364), 即十进制 35 = 0b100011 → 组分 3(氩)与组分 0(甲烷)各 +1。

⚠ 在真空中废气:airProducts == 0 && gasTankType == AIR 时 gasTank 被一次抽干(:118-121)。

罐口控件

checkFluidTankTransfer(:261-279)对槽 2、3:放 ItemAtmosphericValve 就 每 tick 排 4 mB(:275-278);放对应空容器就灌满(:262-274, 分别走 tryFillContainerFuel / AsteroidsItems.canisterLOX / canisterLN2)。 该路径不走 hasEnoughEnergyToRun——断电也在排/灌。

输出方向

getElectricInputDirection() 恒 ForgeDirection.DOWN(:540-543), getPacketRange() 覆写为 320.0(:535-538)。 canProcess()(:317-344)会在两个产物罐装错气体时返回 false。

GUI / Container

GUI 类 Container 类 分派处
planets.mars.client.gui.GuiGasLiquefier planets.mars.inventory.ContainerGasLiquefier Container planets/mars/MarsModule.java:324、Gui planets/mars/MarsModuleClient.java:155-156

网络封包

gasTank、liquidTank、liquidTank2、processTicks、gasTankType、 fluidTankType、fluidTank2Type 全是 @NetworkedField(targetSide = Side.CLIENT) (:47-71)。无独立封包 ID。

NBT 键:gasTank(读 planets/mars/tile/TileEntityGasLiquefier.java:431-432、写 :449-450)、 liquidTank(读 :435-436、写 :453-454)、 liquidTank2(读 :438-439、写 :456-457)。只在罐非空时才写(:449、:453、:456)。

⚠ processTicks 的 NBT 键叫 smeltingTicks(:446)——与熔炉同名的复制粘贴遗留, 读侧在 :428。它不是 processTicks,别按字段名去找存档键。

相关条目