TileEngineBase 与四种引擎(Wood / Stone / Iron / Creative)

事实基准:/Users/evlos/a/mirror/BuildCraft(master,minecraftVersion = 1.7.10)逐行读源码。 四个引擎共用同一基类,故合并成一篇。

注册信息(集合运算,共 4 个引擎 TileEntity)

TileEntity 注册名 注册类 所属 modid 注册处
net.minecraft.src.buildcraft.energy.TileEngineWood buildcraft.core.TileEngineWood BuildCraft|Core BuildCraftCore.java:478-479
net.minecraft.src.buildcraft.energy.TileEngineStone buildcraft.energy.TileEngineStone BuildCraft|Energy energy/EnergyProxy.java:18
net.minecraft.src.buildcraft.energy.TileEngineIron buildcraft.energy.TileEngineIron BuildCraft|Energy energy/EnergyProxy.java:19
net.minecraft.src.buildcraft.energy.TileEngineCreative buildcraft.energy.TileEngineCreative BuildCraft|Energy energy/EnergyProxy.java:20-21

⚠️ TileEngineWood 的类在 buildcraft.core 包,但注册发生在 BuildCraft|Core, 另三个在 buildcraft.energy 包、由 BuildCraft|Energy 的 EnergyProxy.registerTileEntities() 注册。 按包名分 modid 会错。

⚠️ 四者的注册名都带 net.minecraft.src.buildcraft.energy. 前缀, 即使 TileEngineWood 的真实包是 buildcraft.core —— 这是历史遗留的不一致。

关联方块全部是 Engine 方块,通过 BlockEngine.registerTile(...) 按 meta 分派 (BuildCraftEnergy.java:369/:371/:373 对应 meta 1/ stone、2/ iron、3/ creative; Wood 走 BuildCraftCore.java:473-477 的 meta 0)。

公共常量(core/lib/engines/TileEngineBase.java:71-73)

public static final float MIN_HEAT = 20;
public static final float IDEAL_HEAT = 100;
public static final float MAX_HEAT = 250;
常量 值 含义
MIN_HEAT 20 低于此热度不出力
IDEAL_HEAT 100 理想热度,出力满
MAX_HEAT 250 热度上限,超过进入过热(EnergyStage.OVERHEAT,:60)

⚠️ MIN_HEAT / IDEAL_HEAT / MAX_HEAT 是「热度」不是「能量」, 单位与 RF 无关。三者构成过热机制的阈值,写条目时不能当成 mJ。

能量阶段枚举

EnergyStage(core/lib/engines/TileEngineBase.java:60-68)有 VALUES = values()(:68)静态缓存,共 5 个阶段:BLUE / GREEN / YELLOW / RED / OVERHEAT。 每阶段对应一套「树干」贴图(:37-45 共 5 张 TRUNK_*_TEXTURE)。

TileEngineWood.computeEnergyStage()(core/TileEngineWood.java:27-39)的分档:

能量比例 阶段
< 0.33 BLUE
< 0.66 GREEN
< 0.75 YELLOW
>= 0.75 RED

⚠️ 注意最后一段没有 RED→OVERHEAT 的判定——Wood 引擎的过热在基类 TileEngineBase 侧处理, 此处的 computeEnergyStage() 只给到 RED。

各引擎差异

引擎 关键常量 源码
Wood getCurrentOutputLimit() 返回 10(core/TileEngineWood.java:41-44) 烧木头,无 GUI
Stone MAX_OUTPUT = 10(energy/TileEngineStone.java:26)
MIN_OUTPUT = MAX_OUTPUT / 3(:27)→ 10/3 ≈ 3.33
TARGET_OUTPUT = .375f(:28) PID 目标
kp = 1f(:29)、ki = 0.05f(:30) PID 增益
eLimit = (MAX_OUTPUT - MIN_OUTPUT) / ki(:31) 积分饱和上限
输出钳制 MathUtils.clamp(e * kp + esum * ki, MIN_OUTPUT, MAX_OUTPUT)(:152)
Iron(燃烧引擎) MAX_LIQUID = BUCKET_VOLUME * 10(energy/TileEngineIron.java:40) 10 桶燃料 + 10 桶冷却液
HEAT_PER_RF = 0.00023F(:41) RF→热度换算
COOLDOWN_RATE = 0.05F(:42) 冷却速率
MAX_COOLANT_PER_TICK = 40(:43) 每 tick 最多消耗冷却液
燃料罐 tankFuel / 冷却液罐 tankCoolant(:45-46)
每 tick 冷却液 Math.min(MAX_COOLANT_PER_TICK, coolant.amount)(:282)
Creative 0.02F * (powerMode.ordinal() + 1)(energy/TileEngineCreative.java:94) 出力随功率档位
getIdealOutput() 转发 powerMode.maxPower(:113、:118)

⚠️ MAX_LIQUID 里乘的 BUCKET_VOLUME 由 Forge 流体系统给出(FluidContainerRegistry.BUCKET_VOLUME), 本仓库不硬编码该值,故不写死 mB 数字。

GUI / Container 配对

引擎 GUI 类 Container 类 配对处
Stone buildcraft.energy.gui.GuiStoneEngine buildcraft.energy.gui.ContainerEngine energy/EnergyGuiHandler.java:41 / :67
Iron buildcraft.energy.gui.GuiCombustionEngine buildcraft.energy.gui.ContainerEngine energy/EnergyGuiHandler.java:38 / :64
Wood 无 GUI — EnergyGuiHandler 无 Wood 分支
Creative 无 GUI — 同上

⚠️ Stone 与 Iron 共用同一个 ContainerEngine,仅 GUI 前端不同。

网络封包

引擎状态随 TileEntity NBT 同步。TileEngineBase 另在 :170-171 做过热时的客户端保护:

if (getEnergyStage() == EnergyStage.OVERHEAT && !Utils.isFakePlayer(player)) {
    energyStage = computeEnergyStage();
}

无独立的 BuildCraft 封包 ID 专供引擎使用。

相关条目