TileEntityTerraformer(行星改造者)

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

注册信息

属性 值 来源
TileEntity 注册名 Planet Terraformer MarsModule.java:244
注册类 micdoodle8.mods.galacticraft.planets.mars.tile.TileEntityTerraformer 同上
关联方块 MarsBlocks.machine = new BlockMachineMars().setHardness(1.8F).setBlockName("marsMachine") planets/mars/blocks/MarsBlocks.java:35
方块→TE 分派 metadata < LAUNCH_CONTROLLER_METADATA(=8)且 < CRYOGENIC_CHAMBER_METADATA(=4)时装配本 TE;TERRAFORMER_METADATA = 0 planets/mars/blocks/BlockMachineMars.java:306-315、:47-49
父类 TileBaseElectricBlockWithInventory(→ TileBaseElectricBlock → TileBaseUniversalElectrical → EnergyStorageTile) planets/mars/tile/TileEntityTerraformer.java:39、core/energy/tile/TileBaseElectricBlock.java:23-24、core/energy/tile/TileBaseUniversalElectrical.java:34
实现接口 ISidedInventory / IDisableableMachine / IBubbleProvider / IFluidHandler planets/mars/tile/TileEntityTerraformer.java:39-40
所属 modid GalacticraftMars core/Constants.java:8
槽位数 14 见下节

槽位与字段

planets/mars/tile/TileEntityTerraformer.java:50:

private ItemStack[] containingItems = new ItemStack[14];

本类不覆写 getSizeInventory(),继承 core/energy/tile/TileBaseElectricBlockWithInventory.java:46-48 → return this.getContainingItems().length;,本类的 getContainingItems() (planets/mars/tile/TileEntityTerraformer.java:439-442)返回那 14 格数组, 故恒为 14。

槽位分组(isItemValidForSlot,planets/mars/tile/TileEntityTerraformer.java:478-502)

槽位 用途 接受判定 源码
0 水桶槽 FluidContainerRegistry.containsFluid(itemstack, water) planets/mars/tile/TileEntityTerraformer.java:481-482
1 电池槽(getBatteryInSlot() 直接返回 getStackInSlot(1),:509-512) ItemElectricBase.isElectricItem(...) planets/mars/tile/TileEntityTerraformer.java:483-484
2–5 骨粉(4 格) Items.dye 且 getItemDamage() == 15 planets/mars/tile/TileEntityTerraformer.java:485-489
6–9 树苗(4 格) ContainerTerraformer.isOnSaplingList(itemstack) planets/mars/tile/TileEntityTerraformer.java:490-494
10–13 种子(4 格,Items.wheat_seeds) itemstack.getItem() == Items.wheat_seeds planets/mars/tile/TileEntityTerraformer.java:495-499

骨粉 / 树苗 / 种子的取用入口分别是 getFirstBonemealStack()(:373-381,扫 2–6)、 getFirstSaplingStack()(:383-392,随机取 6–10 并记进 saplingIndex)、 getFirstSeedStack()(:394-402,扫 10–14)。

侧面 / 抽放判定 源码
getAccessibleSlotsFromSide 14 格全开 planets/mars/tile/TileEntityTerraformer.java:451-454
canInsertItem = isItemValidForSlot planets/mars/tile/TileEntityTerraformer.java:456-459
canExtractItem 只有槽 0(空桶)与槽 1(空电池)可抽,其余恒 false planets/mars/tile/TileEntityTerraformer.java:461-471

能量

项目 值 来源
缓冲容量 16000 gJ(EnergyStorageTile.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
构造时最大输出 45 gJ/t(普通)/ 90 gJ/t(hardMode) planets/mars/tile/TileEntityTerraformer.java:75-77
每 tick 实际抽取 storage.getMaxExtract()(= 45 / 90),由父类在 shouldUseEnergy() 为真时抽 core/energy/tile/TileBaseElectricBlock.java:106-107
停机慢放 slowDischarge() 每 10 tick 抽 5 gJ core/energy/tile/TileBaseElectricBlock.java:109、:124-128
耗电开关 shouldUseEnergy() = !grassDisabled || !treesDisabled planets/mars/tile/TileEntityTerraformer.java:504-507

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

⚠ public static final int WATTS_PER_TICK = 1;(planets/mars/tile/TileEntityTerraformer.java:49) 是死常量——全仓库检索 WATTS_PER_TICK 只命中两处声明 (本类 :49 与 TileEntityLaunchController.java:41),没有任何一处引用它。 所以「每 tick 耗 1 gJ」是错的,实际抽取量是 getMaxExtract()。

液体

项目 值 来源
tankCapacity 2000(final) planets/mars/tile/TileEntityTerraformer.java:42
waterTank new FluidTank(this.tankCapacity),@NetworkedField(CLIENT) planets/mars/tile/TileEntityTerraformer.java:44-45
canFill 只收 "water" planets/mars/tile/TileEntityTerraformer.java:574-577
canDrain false(不可被管道抽走) planets/mars/tile/TileEntityTerraformer.java:559-562
getTankInfo 四面都返回同一个罐(无方向过滤) planets/mars/tile/TileEntityTerraformer.java:590-593
液面刻度 getScaledWaterLevel(i) = fluid.amount * i / 2000 planets/mars/tile/TileEntityTerraformer.java:79-83

tick / 特殊机制

泡泡半径

planets/mars/tile/TileEntityTerraformer.java:67:

public final double MAX_SIZE = 15.0D;

bubbleSize(float,:70)每 tick 变化 ±0.1,钳在 0..MAX_SIZE:

条件 变化 源码
hasEnoughEnergyToRun && (!grassDisabled || !treesDisabled) +0.1F planets/mars/tile/TileEntityTerraformer.java:267-268
其它 −0.1F planets/mars/tile/TileEntityTerraformer.java:269-271

只有 bubbleSize == MAX_SIZE(15.0)时机器才 active (:124-127,浮点精确相等判定)。

启动条件

planets/mars/tile/TileEntityTerraformer.java:124-127 要求五个条件同时成立:

  1. bubbleSize == MAX_SIZE(泡泡已充满)
  2. hasEnoughEnergyToRun(电够)
  3. getFirstBonemealStack() != null(有骨粉)
  4. waterTank.getFluid() != null
  5. waterTank.getFluid().amount > 0

扫描与改造周期

行为 频率 源码
重建可改造方块列表 / 草地列表 工作状态变化时,或每 60 tick planets/mars/tile/TileEntityTerraformer.java:130-165
随机改造 1 个方块 每 15 tick planets/mars/tile/TileEntityTerraformer.java:167-204
种 1 棵树苗 每 50 tick planets/mars/tile/TileEntityTerraformer.java:206-260

改造单格的判定

planets/mars/tile/TileEntityTerraformer.java:176-190,取 rand.nextInt(40):

随机值 结果 额外条件
0 四周都是空气 → Blocks.flowing_water;否则 → Blocks.grass 四个水平相邻方块须全为空气(:178-181)
1–39 Blocks.grass —

消耗(planets/mars/tile/TileEntityTerraformer.java:194-200):

产物 消耗
Blocks.grass 水罐 drain(1) + checkUsage(1)
Blocks.flowing_water checkUsage(2)

checkUsage(int type)(:290-334)三类消耗:

type 触发点 消耗 源码
0 每次种树后(:255) 树苗 --1 planets/mars/tile/TileEntityTerraformer.java:305-316
1 每次改造草地后(:197) 每 4 次(useCount[0] % 4 == 0)扣 1 个种子 planets/mars/tile/TileEntityTerraformer.java:317-329
2 生成水方块(:199) 水罐 drain(50) planets/mars/tile/TileEntityTerraformer.java:330-332
骨粉 上述三者合计每 4 次触发 骨粉 --1 planets/mars/tile/TileEntityTerraformer.java:293-303
种树额外 每棵 水罐 drain(50) planets/mars/tile/TileEntityTerraformer.java:253-254

造树防拥塞

grownTreesList 记已长成的树苗位,种新树时若与任一已有树苗 平方距离 < 9(即 3 格内)则跳过(planets/mars/tile/TileEntityTerraformer.java:215-222)。 新树苗被立即 updateTick 催熟仅当该处光照 ≥ 9(:226-234)。

扳手两档停机

setDisabled(int index, boolean)(planets/mars/tile/TileEntityTerraformer.java:514-528):

index 切换字段 源码
0 treesDisabled planets/mars/tile/TileEntityTerraformer.java:518-520
1 grassDisabled planets/mars/tile/TileEntityTerraformer.java:520-523

冷却 disableCooldown = 10(:526),由父类每 tick 递减 (core/energy/tile/TileBaseElectricBlock.java:119-121)。

网络

@NetworkedField(CLIENT) 字段:waterTank(:44-45)、terraformableBlocksListSize(:55-56)、 grassBlocksListSize(:58-59)、treesDisabled(:61-62)、grassDisabled(:64-65)、 shouldRenderBubble(:72-73)。 bubbleSize 走自定义的 addExtraNetworkedData / readExtraNetworkedData(:276-288)。 无独立的封包 ID。

NBT 键:BubbleSize(:409、:429)、UseCountArray(:410、:430)、 waterTank(:416-418、:432-434)、bubbleVisible(:420-422、:436)。

GUI / Container

GUI 类 Container 类 分派处
planets.mars.client.gui.GuiTerraformer planets.mars.inventory.ContainerTerraformer Container planets/mars/MarsModule.java:314-317(GuiIdsPlanets.MACHINE_MARS,ID 列表在 :305-307)

相关条目