Temperature, Altitude & Cooling Model
The engine temperature is a continuous value computed every tick on the server by the engine controller using a Newton cooling model, then persisted in the controller's NBT. This page explains exactly how heat is generated and how it is dissipated — including the altitude → temperature and altitude → pressure relationships that drive it.
Applies to the fluid engine. The steam engine does not use this model — its closed boiler self-regulates (see Steam Power Chamber).
The model at a glance
heat gain Q_heat = Σ running chambers × throttle × fuel.heat × BASE_HEAT_FLUID × heatFactor(m_eff)
heat loss P_loss = K_total × (T − T_amb)
K_total = (K_CORE×length + K_AMB×running chambers + K_DUCT×ducts×shutter) × ram(speed) × f(pressure)
integration T += (Q_heat − P_loss) / C_th / 20 (per tick; C_th = C_TH_BASE × length)
clamp T in [T_amb, OVERHEAT_TEMP × 1.2]
overheat T ≥ 220°C → hard stop; resume at T ≤ 200°C (hysteresis)
The engine reaches equilibrium when heat gain = heat loss — every throttle / altitude / cooling change moves the equilibrium temperature.
Heat generation (Q_heat)
Only running fluid chambers generate heat, and only while the engine is running and not overheated:
| Term | Meaning |
|---|---|
running chambers |
number of burning fluid combustion chambers |
throttle |
0..1 — heat is proportional to throttle |
fuel.heat |
the fuel's heat multiplier from its datapack entry (see Fuel) |
BASE_HEAT_FLUID |
30 °C/s — the fluid chamber's base heat |
heatFactor(m_eff) |
the mixture heat factor (below) |
Mixture heat factor
m_eff = lever × autoRichness(pressure) (see the Fluid Combustion Chamber page for the mixture lever and altitude auto-rich):
- Single linear formula for both sides:
heatFactor = 1 − (m_eff − 1)(i.e.2 − m_eff), slope −1, no convex curve, no floor clamp. - Lean (
m_eff < 1):heatFactor > 1, hotter as you lean (m_eff=0.8 → ×1.20). - Rich (
m_eff ≥ 1):heatFactor < 1, cooler as you enrich (m_eff=1.4 → ×0.60). - Altitude auto-rich/lean is free heat control: the carburettor meters by intake air volume — at altitude it naturally enriches (
autoRichnessup to ×1.25) which only cools (heatFactordown to ≈0.75 at full auto-rich); below sea level high pressure naturally leans (down to ×0.75) which only heats — it never costs fuel.
The heat factor only scales heat — it never feeds back into fuel cost (economy factor multiplies fuel consumption only).
Heat dissipation (K_total)
K_total = (K_CORE×length + K_AMB×running chambers + K_DUCT×ducts×shutter) × ram(speed) × f(pressure)
| Term | Meaning |
|---|---|
K_CORE |
0.02 per core segment — the engine's own passive cooling. Always active, even when stopped (that is why a stopped engine slowly cools down). |
K_AMB |
0.05 per running chamber — ambient convection over the running chambers. Stopped chambers do not count (a stopped engine only cools via K_CORE). |
K_DUCT |
0.05 per cooling air duct — the duct fins. Scaled by the cooling shutter (setCooling, see Cooling Air Duct). |
shutter |
coolingStrength (0..1, default 1.0) — only shrinks the duct component (real cowl flaps). |
ram(speed) |
Ram-air cooling: 1.0 below 10 m/s, linear ramp to ×2.0 at 30 m/s — flying fast cools the engine for free. Static (non-physics) blocks = 1.0. |
f(pressure) |
Pressure factor: pressure^0.8 (clamped to a floor of 0.25). At altitude the air is thin → heat transfer is worse → cooling is worse at altitude. |
Ambient temperature (altitude → temperature)
The engine reads the ambient temperature T_amb from its world altitude Y:
- Physics bodies use the body's world position Y (the sub-level origin); static blocks use the block's own Y.
- Overworld — piecewise-linear, Minecraft-scaled:
| Altitude Y | Ambient temperature |
|---|---|
| Y ≤ 63 (sea level) | constant 20°C |
| 63 → 200 (cloud layer) | linear 20°C → 0°C |
| 200 → 320 (world top) | linear 0°C → −40°C |
| Y ≥ 320 | constant −40°C |
- Nether: constant 155°C at all heights — a hot environment, equal to the economy target.
- End: constant 0°C at all heights — a cold, still environment.
Why Minecraft-scaled, not real lapse rate
The real troposphere lapse rate (≈0.0065°C/m) would only drop ~1.7°C across the whole 63→320 world height — almost no altitude effect. The Minecraft-scaled curve (sea level → clouds → world top) makes altitude actually matter for engine cooling.
Pressure factor (altitude → pressure)
The pressure factor reuses the same air model as the avionics sensors (Sable's dimension atmosphere curve — anchors with piecewise cubic Hermite interpolation):
- Default overworld anchors:
(−38, 1.5) / (63, 1.0) / (263, 0.4493) / (280, 0.4198) / (320, 0)— sea level = 1.0 atmosphere, Y ≥ 320 = 0. pressureFactor = max(pressure, 0.25)^0.8.- The same pressure also drives the altitude auto-rich/lean (
autoRichness = 1 + 0.45×(1−pressure), clamped to [0.75, 1.25]; auto-leans below sea level at high pressure) — see the Fluid Combustion Chamber page.
Altitude gameplay summary
At altitude three things change at once:
| Effect | Direction | Result |
|---|---|---|
| Colder ambient (higher up) | helps cooling | lower equilibrium T |
| Thinner air → pressure factor drops | hurts cooling | higher equilibrium T |
| Auto-rich (free cooling) | helps cooling | heatFactor drops, no fuel cost |
The two cooling effects partially cancel; auto-rich is the player's free altitude-compensation tool (pull the mixture lever to m_eff ≈ 1.0 to also earn the economy factor).
Overheat & hysteresis (fluid engine)
- T ≥ 220°C → the engine hard-stops (no fuel burned) and sets
overheated. - T ≤ 200°C → it unlocks and can restart (hysteresis prevents rapid on/off cycling around the threshold).
- All thresholds (155°C economy target / 100°C overcooling / 220°C overheat) are fixed engine constants — they do not change with fuel or throttle, like a real engine's design point / thermostat.