TileEntityElectricIngotCompressor(电动压缩机)
事实基准:
/Users/evlos/a/mirror/Galacticraft(master,minecraftVersion = 1.7.10)逐行读源码。
注册信息
| 属性 | 值 | 来源 |
|---|---|---|
| TileEntity 注册名 | Electric Ingot Compressor |
GalacticraftCore.java:734 |
| 所属 modid | GalacticraftCore |
core/Constants.java:7,@Mod 见 GalacticraftCore.java:160-161 |
| 关联方块 | micdoodle8.mods.galacticraft.core.blocks.BlockMachine2 |
core/blocks/BlockMachine2.java:304-306(metadata ≥ ELECTRIC_COMPRESSOR_METADATA) |
| 父类 | TileBaseElectricBlock |
core/energy/tile/TileBaseElectricBlock.java:23 |
| 实现接口 | IInventory / ISidedInventory |
core/tile/TileEntityElectricIngotCompressor.java:29 |
| 槽位数 | 12(getSizeInventory() 见 core/tile/TileEntityElectricIngotCompressor.java:230-232) |
同上 |
⚠ 父类是 TileBaseElectricBlock,不是 TileBaseElectricBlockWithInventory——
它自己实现 IInventory,没有 getContainingItems() 那套抽象。
⚠ 它和手动版 TileEntityIngotCompressor 是两个独立注册的类:
GalacticraftCore.java:733(手动,配方 3×3)与 :734(电动,本类)。
两者各有各的 Container/Gui。
槽位与字段
core/tile/TileEntityElectricIngotCompressor.java:42-43:
private ItemStack[] containingItems = new ItemStack[3];
public PersistantInventoryCrafting compressingCraftMatrix = new PersistantInventoryCrafting();
getSizeInventory()(:230-232)返回
containingItems.length + compressingCraftMatrix.getSizeInventory()
= 3 + 9 = 12。
合成矩阵固定 3×3 共 9 格(core/inventory/PersistantInventoryCrafting.java:25-29、
getSizeInventory() 见 :34-37)。
getStackInSlot / decrStackSize / setInventorySlotContents 等都以
par1 >= containingItems.length 分流到矩阵(:235-241、:243-270、:286-298)。
| 槽位 | 用途 | 源码 |
|---|---|---|
| 0 | 电池 | :484 getBatteryInSlot() 固定返回 getStackInSlot(0) |
| 1 | 产物 A(输出) | :468-470 允许取出 |
| 2 | 产物 B(输出) | :468-470 允许取出 |
| 3–11 | 3×3 配方矩阵(不分先后) | :191、:217 循环上界取 compressingCraftMatrix.getSizeInventory() |
产物内容由 updateInput()(:114-116)调 CompressorRecipes.findMatchingRecipe
计算,结果存在 producingStack(:39)里。压缩配方无序:
getAccessibleSlotsFromSide(:409-460)会剔除矩阵中与已有物品重复的格。
处理速率 / 耗时(本篇核心常量)
core/tile/TileEntityElectricIngotCompressor.java:31:
public static final int PROCESS_TIME_REQUIRED_BASE = 200;
| 常量 | 值 | 含义 | 来源 |
|---|---|---|---|
PROCESS_TIME_REQUIRED_BASE |
200 | 基础耗时常量 | core/tile/TileEntityElectricIngotCompressor.java:31 |
实际 processTimeRequired |
PROCESS_TIME_REQUIRED_BASE * 2 / (1 + poweredByTierGC) |
200 × 2 得 400,再除以 3 | core/tile/TileEntityElectricIngotCompressor.java:61-62 |
| 1 级供电时实际耗时 | 133(400 / 3,整数除法截断) | 由上式推得 | core/tile/TileEntityElectricIngotCompressor.java:61-62 |
| 2 级供电时实际耗时 | 200(400 / 2) | 由上式推得 | core/tile/TileEntityElectricIngotCompressor.java:61-62 |
maxExtract |
75(hardMode 90) | 拉取功率 | core/tile/TileEntityElectricIngotCompressor.java:47 |
| tier | 固定 2 | 构造器无条件 setTierGC(2) |
core/tile/TileEntityElectricIngotCompressor.java:48 |
⚠ PROCESS_TIME_REQUIRED_BASE = 200 不等于实际耗时。运行时在 :61-62 被
乘 2 再除以 1 + poweredByTierGC,且该赋值在每个 tick 的 updateEntity 里重算,
所以 GUI 上的 processTimeRequired 会随供电来源变。
⚠ 容量沿用 STANDARD_CAPACITY = 16000(core/energy/tile/EnergyStorageTile.java:18),
本类不调 setCapacity;maxReceive 保持默认 25
(core/energy/tile/EnergyStorageTile.java:21,两参构造 EnergyStorage.java:19-21
把第二参 maxTransfer = 10 展开为 maxReceive = 2.5F * 10 = 25、maxExtract = 10)。
单位是 gJ,不是 RF/t、不是 EU/t。
tick 逻辑
updateEntity(:51-85):
hasEnoughEnergyToRun && canCompress()成立时++processTicks(:58-59)- 每 tick 重算
processTimeRequired(:61-62) - 达标则播放
random.anvil_land(音量 0.2F、音调 0.5F,:65-66)、清零计数、执行compressItems()(:67-68) - 条件不成立时直接
processTicks = 0(:71-73)——没有熔炉那套「冷却」逻辑
GUI / Container
| GUI 类 | Container 类 | 分派处(core/client/gui/GuiHandler.java) |
|---|---|---|
core.client.gui.container.GuiElectricIngotCompressor |
core.inventory.ContainerElectricIngotCompressor |
Container :141-142、Gui :231-232 |
网络封包
processTimeRequired、processTicks 为 @NetworkedField(:33-37)。
本类没有 playersUsing 字段(与 TileEntityElectricFurnace、
TileEntityEnergyStorageModule 不同,源码中检索不到该字段)。
封包范围与冷却继承 TileBaseUniversalElectrical:12.0 / 3
(core/energy/tile/TileBaseUniversalElectrical.java:45-51)。无独立封包 ID。