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 要求五个条件同时成立:
bubbleSize == MAX_SIZE(泡泡已充满)hasEnoughEnergyToRun(电够)getFirstBonemealStack() != null(有骨粉)waterTank.getFluid() != nullwaterTank.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) |