Repository navigation
Create Integration
Note
Design stage. This page describes planned mechanics from the design document. Not implemented yet — see Roadmap (milestone M5; centrifuges arrive with M9, refueling and cranes with M12).
Prompt Critical uses the kinetic network of Create 6 as the mechanical power source for its rotating machines: main coolant pumps, feedwater pumps, control rod drives, gas centrifuges, fans, the refueling machine and cranes. The turbine can also act as a Create source.
Create models kinetics as a network with an imposed speed: sources set RPM, consumers declare "stress" (SU per RPM), and the network either rotates as a whole or stops as a whole when total stress exceeds total capacity (overstress). Create has no inertia, torque, coast-down or slip. For a nuclear plant that is not enough: pump coast-down on a flywheel and gravity rod drop are central safety features. The mod therefore keeps its own rotor model on top of the Create shaft.
| # | Rule | Consequence |
|---|---|---|
| R1 | Own inertia. Every mod machine has its own angular velocity ω and moment of inertia J. The Create shaft speed is only a command to the drive (ω_cmd). | Coast-down, spin-up and resonances are simulated. |
| R2 | One-way coupling for consumers. A consumer (pump, centrifuge, rod drive) never returns energy to the Create network; it is driven through an overrunning (freewheel) or friction clutch. | A flywheel cannot be used as a "battery" for Create; no exploits. |
| R3 |
Quantized source. The turbine as a Create source (GeneratingKineticBlockEntity) changes its declared speed only in steps with hysteresis; capacity (SU) is updated at most once per second with a dead band. |
Expensive Create network rebuilds stay rare. |
| R4 | Throttled dynamic stress. A consumer declares stress proportional to actual power, updated at most once per second and only on a change > 5 %. | Honest energy balance without loading Create sync. |
| R5 |
Loss of kinetics is a safety event. A "shaft turning → stopped" transition on a rod drive or main coolant pump raises TripReason.LOSS_OF_DRIVE_POWER in the protection system, independent of Lua. |
Anticipatory trip before LOW_COOLANT_FLOW develops. |
Power is converted to stress with the global constant W_PER_SU = 1000 W/SU:
impact [SU/RPM] = P_shaft [W] / (W_PER_SU * |n_s| [RPM])
stress_total = impact * |n_s| = P_shaft / W_PER_SU
The declared power never drops below a floor of 2 % of rated power, so a machine never "disappears" from the network. When the shaft is stopped, impact is computed at nominal speed so that Engineer's Goggles show the real future load before start-up.
The simulation (pc-sim, pure Java) sees Create only through two port interfaces; pc-mod implements them with Create adapters.
Port (sim.mechanics) |
Implemented by | Purpose |
|---|---|---|
KineticPort |
CreateKineticPort |
Consumer: reads shaftRpm(), networkHealthy(); writes requestStressSu() (filtered by R4) |
KineticSourcePort |
CreateSourcePort |
Source (turbine): offer(rpm, capacitySu), loadPowerW(), networkOverstressed()
|
Order inside the FAST tick (server thread):
-
pc-modreadsgetSpeed()andisOverStressed()for each machine into a double buffer. -
pc-simsteps hydraulics with pump heads from the current ω, then steps mechanics ω(n) → ω(n+1) and computes the required stress. -
pc-modapplies stress/capacity requests that pass the R3/R4 filters.
Compatibility policy: public Create API and inheritance only (access transformer or mixin accessor as a fallback for KineticNetwork internals); Create is a hard dependency pinned by version range in neoforge.mods.toml; every Create release gets a GameTest "pump + flywheel + overstress → coast-down ≥ 10 s".
Create stops the whole network. Each mod machine reacts physically:
| Machine | What happens | Safety signal |
|---|---|---|
primary_pump |
Coasts down on the flywheel, flow falls as 1/(1 + t/τ) |
LOSS_OF_DRIVE_POWER immediately, then LOW_COOLANT_FLOW
|
control_rod_drive |
Holding clutch releases → gravity drop | LOSS_OF_DRIVE_POWER |
feedwater_pump |
Coast-down in seconds (small J) |
LOW_SG_LEVEL develops later |
gas_centrifuge |
Rotor coasts for hours, slowly passing critical speeds downward |
cascade_overspeed / vibration event |
turbine_* (source) |
Load disappears → acceleration → governor / overspeed trip |
TURBINE_TRIP at 110 % |
refueling_machine |
All motion stops; grapple holds the load (brake) | Interlock |
| Fans | Flow drops in ~1 s | Zone pressures equalize |
The classic cascade scenario: one Create network feeds the main coolant pumps, centrifuges and crushers. The player adds a crusher → overstress → pumps stop → scram. The lesson is the real one: separate power supplies for safety systems. The mod pushes toward separate kinetic networks without forbidding the mistake.

A 3×3×4 multiblock: volute casing with pipe_large nozzles, shaft, mechanical seal, Create-driven motor with gearbox, built-in friction clutch with overrunning mechanism, anti-reverse ratchet, and seats for 0–2 pump_flywheel blocks. CC peripheral: pc_pump.
The head curve is H(Q, ω) = H0·(ω/ω0)² − K_H·Q·|Q|; affinity laws (Q ∝ ω, H ∝ ω², P ∝ ω³) follow automatically. Efficiency is a parabola around the best-efficiency point, which shifts with speed. The pump head enters the hydraulic network as a pressure source on the pump's flow link.
| Parameter | Value | Config key / note |
|---|---|---|
| Rated speed ω0 | 104.72 rad/s (1000 rpm) | Real PWR/VVER pumps: 1000–1500 rpm |
| Gear ratio | 3.906 (256 RPM shaft → 1000 rpm) | pumps.primary.gear_ratio |
| Q at BEP | 0.85 m³/s (≈ 633 kg/s at 745 kg/m³) | pumps.primary.q_bep_m3s |
| H_nom / H0 | 60 m / 75 m | pumps.primary.head_m |
| η_max | 0.80 | |
| Nominal shaft power | 465.9 kW | at 290 °C, 15.5 MPa |
| Rated drive power | 629 kW (1.35 × nominal) | margin for cold start (+34 % density) |
| Nominal stress | 1.82 SU/RPM (466 SU) | |
| J pump (rotor + motor) | 30 kg·m² | |
J per pump_flywheel
|
270 kg·m² (steel disc Ø 1.2 m, ≈ 1.5 t) | pumps.flywheel_inertia |
| Required NPSH at rated speed | 40 m | requires pressurizer back-pressure |
Without drive torque, ω(t) = ω0 / (1 + t/τ_cd) with τ_cd = J·ω0² / P0. Flow halves in τ_cd.
| Configuration | J, kg·m² | τ_cd, s | Flow after 5 s | Comment |
|---|---|---|---|---|
| No flywheel | 30 | 0.71 | 12 % | Boiling crisis almost unavoidable |
| 1 flywheel | 300 | 7.06 | 59 % | Short for this pump |
| 2 flywheels | 570 | 13.4 | 73 % | Realistic for PWR/VVER (half flow in 10–20 s) |
The price of flywheels: slower start-up (1.64 MJ to spin up with one flywheel, ≥ 2.6 s at full power; 3.13 MJ and ≥ 5.0 s with two), start-up stress up to 629 SU, and a flywheel burst above 125 % ω0.
- Cavitation. Cavitation index κ = NPSH_r / NPSH_a. Above 1 the head is multiplied by max(0.3, κ^-1/2); above 1.5 the impeller erodes and loses efficiency. κ and flow are published to the pump's acoustic emitter (see Acoustics).
-
Clutch. Command
pc_pump.setClutch(bool)or redstone. Re-engaging at speed is safe only when |ω_cmd − ω| < 0.1 ω0; otherwise the clutch slips, wears (50 MJ slip-energy budget) and pulls peak stress equal to rated power, which can overstress the Create network. - Anti-reverse ratchet. Reverse rotation is blocked; a stopped pump acts as a resistance with K_rev = 2·K_H. With a broken ratchet the rotor spins backwards ("turbine mode") and a restart needs double torque.
| Failure | Trigger | Mechanics |
|---|---|---|
| Rotor seizure | Bearing wear > 1, or prolonged vibration above threshold | ω → 0 in 0.1 s |
| Shaft break | Torque > 3 × stall torque | Impeller free (J = 2 kg·m²), drive idles |
| Seal failure | Seal cooling lost > 120 s at T > 550 K | Coolant leak 2–20 kg/s (seal LOCA) |
| Flywheel burst | ω > 1.25 ω0 | Debris damage |
Tags: rcs.loop<N>.pump.speed [rad/s], rcs.loop<N>.pump.power [W], rcs.loop<N>.pump.vibration, rcs.loop<N>.pump.npsh_margin [m], rcs.loop<N>.pump.clutch [0/1], rcs.loop<N>.flow.
Same model with different parameters and no flywheel:
| Parameter | feedwater_pump |
condensate_pump |
|---|---|---|
| Q at BEP | 0.060 m³/s (≈ 52 kg/s) | 0.055 m³/s |
| H_nom / H0 | 800 m / 950 m | 150 m / 190 m |
| ω0 | 314 rad/s (3000 rpm) | 157 rad/s |
| Nominal shaft power | 565 kW | 107 kW |
| Stress at 256 RPM | 2.21 SU/RPM | 0.42 SU/RPM |
| J | 8 kg·m² (τ_cd ≈ 1.4 s) | 3 kg·m² |
| Required NPSH | 25 m (needs booster or deaerator head) | 3 m (condenser vacuum: classic cavitation case) |
A drive sits on top of a control_rod_channel. Inside: rack-and-pinion or winch, a self-locking worm stage and a holding clutch that is closed only while (a) the Create shaft turns faster than a threshold and (b) the protection_cabinet gives a permissive signal. Any violation opens the clutch and the rod falls under its own weight: "holds while it turns".
HOLD = (|n_s| ≥ n_hold) ∧ RPS_PERMISSIVE ∧ ¬MECH_FAULT, with n_hold = 8 RPM (rods.hold_min_rpm). This is evaluated every FAST tick in hardware logic, not Lua.
| Shaft ≥ 8 RPM | RPS permits | Mech. fault | Result | TripReason logged by the drive |
|---|---|---|---|---|
| 1 | 1 | 0 | Hold / move | — |
| 0 | 1 | 0 | Drop | LOSS_OF_DRIVE_POWER |
| 1 | 0 | 0 | Drop (scram command) | — (reason already in RPS) |
| x | x | 1 | Drop or stuck | — ; event rod_drive_fault
|
With rods.loss_of_drive_full_trip = true (default) loss of kinetics on any drive causes a full scram of all groups.
Normal motion. Speed is min(|v_cmd|, k_rack·|n_s|, v_max) with k_rack = 3.125e-4 m/(s·RPM) (64 RPM → 2 cm/s) and a mechanical limit rods.max_drive_speed_m_s = 0.05 m/s. Even a Lua script cannot withdraw rods faster. Commands come from the pc_rod_drive peripheral or redstone (signal 1–7 down, 9–15 up, 8 stop). Holding power is about 2 kW; the drive is a cheap consumer where continuity matters, not power.
Gravity drop. The rod falls with drag to a terminal velocity, then enters a hydraulic dashpot on the last metres:
RodType |
Prototype | g′, m/s² | v_t, m/s | Dashpot L_d / v_d | Insertion over 3.5 m |
|---|---|---|---|---|---|
SHUTOFF_GRAVITY |
PWR/VVER cluster in water | 8.0 | 3.0 | 0.35 m / 0.5 m/s | ≈ 1.6 s (real: 1.5–4 s) |
CHANNEL_SLOW |
RBMK-like channel rod | 6.0 | 0.4 | 0.3 m / 0.2 m/s | ≈ 9.5 s (17.55 s over 7 m) |
PILE_ZIP |
CP-1 emergency rod on a rope | 9.6 (in air) | 12 | 0.5 m / 2 m/s | ≈ 0.9 s |
These are defaults for a water-filled channel. If the rod has a RodGeometry, g′ and v_t are recomputed each tick from the channel fluid density, so in steam or an empty channel (LOCA) the rod falls faster and the dashpot stops working. The acceptance criterion is full stroke ≤ 4 s.
PILE_ZIP (tier T0) hangs on the zip_rod_winch drum. It drops on an RPS signal, on loss of kinetics, or when a player hits the zip_rope block with an axe.
Stuck rods. Probability per drop is 1e-3 · (1 + 50·δ_ch) where δ_ch ∈ [0, 1] is channel deformation. A stuck rod stops at a random 20–90 % of height and fires the rod_stuck event.
| State | Event | Next |
|---|---|---|
LATCHED_HOLD |
v_cmd ≠ 0 ∧ HOLD | LATCHED_MOVING |
LATCHED_MOVING |
v_cmd = 0 or limit switch | LATCHED_HOLD |
LATCHED_* |
¬HOLD | RELEASED_FALLING |
RELEASED_FALLING |
x ≤ L_d | DASHPOT |
RELEASED_FALLING |
jam on release | STUCK |
DASHPOT |
x = 0 | BOTTOMED_UNLATCHED |
BOTTOMED_UNLATCHED |
HOLD restored ∧ RPS reset | RELATCHING |
RELATCHING |
gripper reaches rod | LATCHED_HOLD |
STUCK |
repair / manual insertion |
LATCHED_HOLD / BOTTOMED_UNLATCHED
|
Re-latching takes gripper height / v_max, so a drive is not ready instantly after a scram.
Dead-man drive. A create:hand_crank on the drive shaft holds the rods only while the player keeps cranking. Let go and the rods drop.
Tags: rods.<group>.position [m], rods.<group>.state, rods.<group>.drive_speed [RPM], rods.<group>.hold [0/1].
| ID | Role |
|---|---|
turbine_casing, turbine_rotor
|
Turbine multiblock; rotor length = number of stages |
turbine_governor |
Speed governor and overspeed trip; drives the inlet valve_control
|
turbine_stop_valve |
Stop valve: closes in 0.2 s on TURBINE_TRIP
|
turbine_gearbox |
Output to a Create shaft: 64 / 128 / 256 RPM |
electric_generator |
FE generator directly on the turbine shaft (not through Create) |
turbine_turning_gear |
Turning gear: slow rotor rotation after shutdown, driven from a Create shaft |

Rotor dynamics. J_t·dω/dt = τ_steam(ω) − τ_Create − τ_gen − τ_friction. Steam torque follows an impulse-turbine line (stall torque ≈ 2× rated, runaway ≈ 2 ω0); isentropic efficiency is 0.85 (turbine.isentropic_efficiency). Inertia comes from the inertia constant H = 4 s: a 30 MW turbine at 314.16 rad/s has J_t = 2432 kg·m².
Output to Create. The gearbox is a GeneratingKineticBlockEntity. Output speed is the set speed above 95 % ω0, stepped in quarters between 20 % and 95 %, and zero below 20 %, with 2 % hysteresis. Capacity is (min(P_steam, P_rated) − P_gen_demand) / W_PER_SU, updated at most at 1 Hz with a 2 % dead band. Example: 30 MW fully on Create → 30 000 SU, 117.2 SU/RPM at 256 RPM. Load from the Create network is shared between sources by capacity.
Governor and overspeed trip. Droop R = 0.04, servo time constant 0.1 s, valve opening rate 0.1 /s, closing 0.5 /s (5 /s above 105 % speed). At ω ≥ 1.10 ω0 (turbine.overspeed_trip_frac) TURBINE_TRIP closes the stop valve in 0.2 s. A trip also occurs on condenser pressure > 25 kPa, high vibration, manual command, or reactor trip (turbine.trip_on_reactor_trip).
Load rejection check: 30 MW with valves frozen accelerates at 39.3 rad/s² and reaches 110 % in 0.80 s. With a working governor the peak is +6–8 % with no trip. If Lua holds the valve open, the trip fires in under 1 s, which is why overspeed protection is a hardware function.
FE generator. Electrical output is min(P_demand, P_gen_rated) only within 95–105 % of rated speed (frequency relay), with generator efficiency 0.98. Example: 30 MW mechanical → 588 000 FE/t.
Turning gear. After shutdown the rotor must turn at 2–5 rpm. Otherwise, after 30 physical minutes, it develops a thermal bow, and starting with a bow multiplies vibration by (1 + 10·bow). turbine_turning_gear takes ≥ 16 RPM from Create and draws about 2 kW.
Rotor physics live in the fuel-cycle design (Nuclear Fuel Cycle); the Create side is:
| Parameter | T-A | T-B | T-C |
|---|---|---|---|
| Step-up ratio | 256 | 256 | 256 |
| Nominal shaft RPM | 174.1 | 213.9 | 242.5 |
| Shaft RPM at burst | 224 | 248.7 | 323 (unreachable) |
| Rotor J, kg·m² | 0.0447 | 0.0848 | 0.1005 |
| Steady stress, SU/RPM | 0.586 | 0.698 | 1.966 |
| Spin-up power | 20 kW | 20 kW | 20 kW |
| Clutch |
FREEWHEEL + brake |
same | same |
-
create:rotational_speed_controlleris the precise way to set shaft RPM (and the only way to avoid bursting a T-A at 256 RPM). A sharp setpoint drop through the critical band is safe because the rotor freewheels; a slow stop that lingers in the critical band is destructive. -
create:sequenced_gearshiftruns staged start-up programs without CC. -
create:speedometer/create:stressometershow the shaft, not the rotor. Rotor speed is visible only viapc_cascadeor a vibration sensor. - 100 T-C machines need about 47 700 SU.
refueling_machine is a multiblock (refueling_bridge, refueling_rail, refueling_trolley, refueling_mast, refueling_grapple) with one Create shaft input on the bridge; one movement at a time.
| Motion | Speed | Power |
|---|---|---|
| Bridge, trolley | min(0.2, 0.003125·|n_s|) m/s (64 RPM → 0.2 m/s) | 2 kW |
| Mast up/down | min(0.1, 0.0016·|n_s|) m/s | ≈ 1 kW |
| Grapple | 2 s per operation | — |
Commands go through pc_fuel_pool. The cycle (IDLE → TRAVEL → LOWERING → SEATED → LATCHED → RAISING) has interlocks: travel only with the mast fully up; a seating impact > 1.5 × weight stops the mast (fuel_handling_snag); raising stops at the minimum water cover (pool.min_transfer_cover_m); the grapple opens only when unloaded; on shaft loss brakes hold the load (HALT).
-
create:mechanical_armgets interaction points forfuel_pool_rack,assembly_jig,pellet_press,fuel_channel. It may handle irradiated fuel, but an assembly in the arm is an unshielded moving radiation source. -
create:deployerpushes T0 cartridges into afuel_channelface; the irradiated cartridge pushed out the far side drops into a water channel (X-10 style). -
polar_crane: 200 t capacity (crane.capacity_t), hoist 0.02–0.05 m/s. The brake is normally closed, so the load is held on shaft loss, the opposite of rod drives. Overload > 1.25 × rated snaps the rope.heavy_load_path_markerdefines allowed routes; carrying a load over the pool off-route firesheavy_load_over_pool.
| ID | Role |
|---|---|
create:encased_fan |
Draft source (native Create) |
vent_duct, vent_damper
|
Duct; damper (redstone or pc_containment) |
hepa_filter |
Aerosol filter (99.97 % at 0.3 µm) |
charcoal_filter |
Iodine filter (TEDA-impregnated carbon) |
vent_zone_controller |
Registers a room (volume, bounds) as an air-network node |
vent_stack |
Release point; height feeds the dispersion model |

The air network is solved by Newton iteration on node pressures (≤ 16 nodes per controller, once per real second). The fan curve is Δp = 500 Pa·(n/256)² − k_f·Q|Q| with 5.12 m³/s free delivery at 256 RPM. Fan stress uses Create's own config. Controlled zones must stay at Δp ≤ −20 Pa relative to clean zones; an open door between zones breaks this and fires zone_pressure_lost.
| Filter | Retains | Efficiency | Life |
|---|---|---|---|
hepa_filter |
Aerosols (Cs, Sr, actinides, ...) | 99.97 % (DF 3333) | 5 kg dust; replace at Δp > 1000 Pa |
charcoal_filter |
Iodine (I₂ 99.9 %; CH₃I 99 % below 70 % RH, 90 % above) | DF 100–1000 | Iodine loading + aging |
| — | Noble gases (Kr, Xe), tritiated water vapour | 0 | — |
Retained activity accumulates, making a spent filter a radiation source and a waste item. A charcoal filter fire (T > 600 K) releases the captured iodine.
Create pipes do not model pressure, temperature or corrosion. Primary and secondary circuits use only mod pipes (pipe, pipe_large).
| Medium / conditions | Create pipes | chem_pipe |
pipe / pipe_large
|
|---|---|---|---|
| Water, T < 373 K, ~atmospheric | yes | yes | yes |
| Dilute H₂SO₄, natural U solutions | yes (copper corrodes, leaks over time) | yes | — |
| HNO₃, HF, F₂, UF₆ | no | yes (HF/F₂: chem_pipe_monel only) |
— |
| Radioactive liquids > 10³ Bq/L | no | yes | yes |
| Primary coolant, secondary steam, p > 0.6 MPa or T > 373 K | no | no | yes |
pipe_adapter_create connects the two worlds: a 1 m³ buffer on the Create side and a boundary node on the mod side, with a check valve and a relief valve that cuts flow above 0.6 MPa. It refuses liquids above the activity limit. The pipe_adapter_create_raw variant has no relief valve and bursts on overpressure.
25 Ponder scenes (promptcritical:<scene>), each ≤ 60 s, using the same formulas as the simulation:
| Scene | Teaches |
|---|---|
inertia_basics |
Create shaft ≠ machine speed; coast-down |
primary_pump_assembly |
Assembly, gearbox, stress |
separate_safety_networks |
Overstress drops the pumps → scram |
pump_cavitation |
Back-pressure, NPSH |
rod_drive_hold_and_scram |
"Holds while it turns" |
rod_drive_dead_man |
Hand-crank drive |
t0_zip_rod |
Emergency rod on a rope |
centrifuge_assembly, centrifuge_critical_speeds
|
Tiers, step-up, do not linger in resonance |
cascade_building, cascade_crash_isolation
|
Stages, headers, isolation |
turbine_to_create, turbine_load_rejection, turbine_turning_gear, electric_generator_fe
|
Capacity, governor, turning gear, FE frequency window |
refueling_machine_cycle, crane_heavy_loads
|
Interlocks; crane brake holds |
ventilation_negative_pressure, filters
|
Negative pressure, doors, what filters catch |
pipes_boundary |
Create/mod pipe boundary |
arm_fuel_handling, deployer_t0_loading
|
Dose during open handling; X-10 loading |
comminution_bond, agitated_leach, bulk_wash_decon
|
Grinding energy, agitator stress, wash decontamination |
Events exposed to CC: rod_drive_fault, rod_stuck, drive_power_lost, pump_cavitation, pump_seized, turbine_trip, turbine_overspeed, fuel_handling_snag, heavy_load_over_pool, zone_pressure_lost, filter_dp_high.
Config key groups: pumps.primary.*, pumps.flywheel_inertia, pumps.feedwater.*, pumps.condensate.*, rods.* (hold_min_rpm, k_rack, max_drive_speed_m_s, stuck_base_prob, loss_of_drive_full_trip), turbine.* (droop, overspeed_trip_frac, stop_valve_close_s, output_rpm, ...), ventilation.*, fluids.create_pipe_max_*, crane.*, mechanics.stress_update_min_interval_s, mechanics.stress_update_deadband.
-
CC-Tweaked-API —
pc_pump,pc_rod_drive,pc_turbine,pc_cascadeperipherals - Reactor-Physics — hydraulics and rod worth
- Acoustics — cavitation and bearing sounds, vibration
- Accidents — loss of flow, seal LOCA, fuel handling accidents
- Energy-Grid — turbine and generator in the power grid
- Architecture — domain vs. binding layers
Prompt Critical · © 2026 denfry · Repository · Report an issue
Start here
Design
Nuclear
Industries
Control and automation
World and server
Development