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 专供引擎使用。
相关条目
- Engine 方块
- TileEnergyStage(枚举单列一篇)
- BuildCraft 分类页