TileEntityOxygenCollector(氧气收集器)
事实基准:
/Users/evlos/a/mirror/Galacticraft(master,minecraftVersion = 1.7.10)逐行读源码。
注册信息
| 属性 | 值 | 来源 |
|---|---|---|
| TileEntity 注册名 | Air Collector |
core/GalacticraftCore.java:707 |
| 所属 modid | GalacticraftCore |
core/Constants.java:7,@Mod 见 core/GalacticraftCore.java:160-161 |
| 关联方块 | GCBlocks.oxygenCollector = new BlockOxygenCollector("oxygenCollector") |
core/blocks/GCBlocks.java:103 |
| 方块→TE 分派 | 无条件 new TileEntityOxygenCollector() |
core/blocks/BlockOxygenCollector.java:100-102 |
| 父类 | TileEntityOxygen(→ TileBaseElectricBlock → … → EnergyStorageTile) |
core/tile/TileEntityOxygenCollector.java:25、core/tile/TileEntityOxygen.java:19 |
| 实现接口 | IInventory / ISidedInventory |
core/tile/TileEntityOxygenCollector.java:25 |
| 槽位数 | 1 | 见下节 |
槽位与字段
core/tile/TileEntityOxygenCollector.java:33:
private ItemStack[] containingItems = new ItemStack[1];
getSizeInventory()(:214-217)返回 this.containingItems.length → 恒为 1(:184 等长重建)。
| 槽位 | 用途 | 源码 |
|---|---|---|
| 0 | 唯一的电池槽(getBatteryInSlot() → getStackInSlot(0)) |
core/tile/TileEntityOxygenCollector.java:322-325 |
| 可接受性 | 源码 |
|---|---|
侧面可达槽 {0},canExtractItem 对槽 0 恒为 true |
core/tile/TileEntityOxygenCollector.java:288-300 |
| 每槽堆叠上限 64 | core/tile/TileEntityOxygenCollector.java:269-271 |
| 槽 0 只收 GC 电力物品 | core/tile/TileEntityOxygenCollector.java:308-310 |
能量
| 项目 | 值 | 来源 |
|---|---|---|
| 缓冲容量 | 16000 gJ(STANDARD_CAPACITY,本类未覆写) |
core/energy/tile/EnergyStorageTile.java:18、:21 |
| 最大输入 | 25 gJ/t——new EnergyStorage(STANDARD_CAPACITY, 10) 两参构造展开为 maxReceive = 2.5F * 10 |
core/energy/tile/EnergyStorageTile.java:21、core/energy/tile/EnergyStorage.java:19-21 |
| 最大输出 | 10 gJ/t(构造未覆写,沿用默认 maxTransfer) |
core/tile/TileEntityOxygenCollector.java:38-41、core/energy/tile/EnergyStorage.java:19-21 |
⚠ 单位是 gJ,不是 RF/t / EU/t。
tick / 特殊机制(本篇核心)
采集不是每 tick,而是 this.worldObj.rand.nextInt(10) == 0 时才跑一次——
即平均每 10 tick 一次(:97)。源码注释写的是「Approximately once every 40 ticks」,
注释与代码不符,以代码为准。
| 行为 | 数值 | 源码 |
|---|---|---|
| 氧气容量 / 速率 | super(6000, 0) → 容量 6000、速率 0 |
core/tile/TileEntityOxygenCollector.java:39 |
| 扫描范围 | 以本体为中心的 11×11×11(x/z 各 ±5,y 为 yCoord±5 并按世界高度夹取) |
core/tile/TileEntityOxygenCollector.java:119-138 |
| 命中条件 | 非空气 且(树叶 或 EnumPlantType.Crop 作物) |
core/tile/TileEntityOxygenCollector.java:153-156 |
| 每个命中块加多少 | 0.075F * 10F |
core/tile/TileEntityOxygenCollector.java:157 |
| 有氧大气星球 | nearbyLeaves = 9.3F * 10F(直接给满额,不扫描) |
core/tile/TileEntityOxygenCollector.java:163-165 |
| 落库 | storedOxygen += nearbyLeaves(nearbyLeaves 已 floor 并 /10) |
core/tile/TileEntityOxygenCollector.java:167-171 |
| 无电 | lastOxygenCollected = 0,不产出 |
core/tile/TileEntityOxygenCollector.java:172-174 |
⚠ 「当前维度是否有大气氧」只在首次采集时判定一次并缓存在 isInitialised / noAtmosphericOxygen
(:103-108),换维度不会重新判定。
⚠ 出网上限用的是 TileEntityOxygenStorageModule.OUTPUT_PER_TICK = 500(core/tile/TileEntityOxygenStorageModule.java:31),
不是本类自己声明的 OUTPUT_PER_TICK = 100(core/tile/TileEntityOxygenCollector.java:28)——
本类那个常量在 getOxygenProvide 里没被使用(:348-352)。
- 出气面 = 电力输入面的对面(
:343-345);输入方向为空集(:338-340)。 shouldUseEnergy()=storedOxygen > 0F && producedLastTick(:312-315)——producedLastTick是上一 tick 是否未满(:54),即满罐即停耗电。- 构造时
this.noRedstoneControl = true(:40)——不受红石控制。
GUI / Container
| GUI 类 | Container 类 | 分派处(core/client/gui/GuiHandler.java) |
|---|---|---|
core.client.gui.container.GuiOxygenCollector |
core.inventory.ContainerOxygenCollector |
Container :116-117、Gui :204-205 |