Time-Skip World Manipulation¶
Catalog of the systems a mod can mutate to fake elapsed time while a cover window (lander capsule, fake loading screen, ragdoll pause) hides the transition. Reach for this recipe when designing a "skip ahead" event: the systems table names the APIs, the APIs reference lists the non-obvious camera / helmet / input / loading / ragdoll / timescale handles you pair with them.
When to use¶
- A mod wants to advance world state by hours or days of simulated elapsed time in a single server tick.
- A mod wants a catalog of "here is what you can move forward" to design a coherent time-skip.
- A mod wants the non-obvious handles (camera shake, helmet frost, fake loading screen, ragdoll toggle,
Time.timeScale) that pair with the world-state mutations for visual coherence.
Prerequisites¶
- Server-side code path for anything that mutates world state.
- A cover window: the lander capsule (see TriggerLanderCapsule.md), fake loading screen, stun + ragdoll, or similar. The table's effects are not network-synced cosmetically in every case; hide the frame where the mutation happens.
Systems that can be modified to fake elapsed time¶
| System | API | Notes |
|---|---|---|
| Sun position | OrbitalSimulation.SetDayTime(float) (public static, 0-1 range) |
Moves sun to target time, updates all orbital bodies |
| Day counter | WorldManager.DaysPast (public static uint, settable) |
Triggers WeatherManager.OnNextDay() and per-day events |
| Player hunger | Entity.Nutrition (public float, auto-syncs) |
Clamped 0 to 50 (Human). 0 causes starvation damage |
| Player thirst | Entity.Hydration (public float, auto-syncs) |
Clamped 0 to 8.75. 0 causes dehydration damage |
| Player hygiene | Entity.Hygiene (public float, auto-syncs) |
Clamped 0 to 1.5 |
| Player mood | Entity.Mood (public float, auto-syncs) |
Clamped 0 to 1 |
| Battery charge | BatteryCell.PowerStored / Battery.PowerStored (public float, settable) |
Call UpdateBatteryState() after to update visuals |
| Food decay | item.DamageState.Damage(Increment, amount, DamageUpdateType.Decay) |
Check item.CanDecay first. Iterate Item.AllDecayingItems |
| Plant growth | Plant.Stage (private setter, needs reflection) |
Iterate Plant.AllPlants. Setter triggers StageChanged() |
| Room temperature | atmosphere.GasMixture.TotalEnergy (read-modify-write struct) |
Slight energy reduction simulates heat loss |
| Pipe gas | PipeNetwork.AllPipeNetworks (public static list), each has .Atmosphere.GasMixture |
Small quantity reduction simulates slow leaks |
| Suit air | suit.AirTank.InternalAtmosphere.GasMixture |
Read-modify-write the oxygen Mole |
| Item wear | thing.DamageState.Damage(Increment, 3f, DamageUpdateType.Brute) |
Pick random subset. Keep damage small |
| Weather | WeatherManager.ImmediatelyActivateWeatherEvent(string id) (public static) |
Storm IDs depend on world type |
| Lights | OnServer.Interact(light, InteractableType.Activate, 0) |
Toggle off a few random lights |
| Doors | OnServer.Interact(door, InteractableType.Open, 1) |
Suggest someone walked through |
| Spawn objects | OnServer.Create<DynamicThing>(prefabName, position, rotation) |
Drop tools/debris near repaired items |
| Player position | OnServer.MoveInWorld(human, pos + offset, true) |
Slight shift, under 0.3m |
| Days lived | Entity.DaysLived (public ushort, settable) |
Per-character age counter |
| Trader contacts | TraderContact.EndLifetime = Time.time |
Expires contact immediately |
| Chat messages | ChatMessage with HumanId = -1 via NetworkServer.SendToClients |
Post fake timestamped event log entries |
| Room pressure | atmosphere.Remove(quantity, GasType) |
Slight depressurization |
| Console messages | ConsoleWindow.Print(string, ConsoleColor) |
Client-local only. For server broadcast, use ChatMessage |
Camera / helmet / input / loading / ragdoll / timescale APIs¶
Camera manipulation¶
CameraController.SetCameraShake(float intensity): public static. Intensity 0 to 2.5, decays over time. Used by explosions.CameraController.Instance.SetThirdPersonCamera(bool): public. Forces third-person view.CameraController.SetFieldOfView(float fov): public static. Extreme values (130+) create fisheye distortion.CameraController.Instance.RotationX / RotationY: public fields. Can spin the camera.
Helmet frost¶
FirstPersonHelmetOverlay.CurrentFrostSetting: public static float. Set to -1 for full frost overlay, 0 for clear. Driven by atmosphere temperature in InventoryManager (maps 0C to 20C range).
Input lock¶
KeyManager.SetInputState(string key, KeyInputState state): public static. String-keyed stack.
KeyInputState.Paused: blocks game input, shows cursor. Player can look around but cannot move, interact, or use items.KeyManager.RemoveInputState(string key): restores previous state.
Fake loading screen¶
ImGuiLoadingScreen.SetActive(true): shows fullscreen loading screen with random background.
ImGuiLoadingScreen.SetState("text"): sets status text.
ImGuiLoadingScreen.FakeProgress(): auto-advances progress bar.
Completely blocks the view. Pair with KeyManager.SetInputState for input lock.
Alert messages¶
AlertMessage.Show(string text, float duration): centered text overlay with fade in/out.
Ragdoll without unconsciousness¶
Entity.SetRagdoll(bool active): public. Disables animator, enables ragdoll colliders. Can be called independently of entity state. Player retains camera control but body goes limp.
Time scale¶
Time.timeScale = 0.1f: slows everything. The game normally only uses 0 (paused) and 1 (normal), but fractional values work. Affects all simulation including atmospherics.
Verification¶
- For each system you mutate, snapshot the relevant field before and after (see InspectorPlusUsage.md).
- Confirm visual followups: battery meters need
UpdateBatteryState()after aPowerStoredwrite; plant stage changes triggerStageChanged()through the setter; weather changes are driven throughImmediatelyActivateWeatherEvent.
Pitfalls¶
- Server-side only. Anything that mutates world state must be server-gated or it will desync multiplayer.
Time.timeScaleaffects all simulation including atmospherics. Fractional values work even though the vanilla game normally uses only 0 and 1.ConsoleWindow.Printis client-local only. For a server broadcast, useChatMessage.- Some setters have extra effects that are not obvious from the field name.
Plant.StagetriggersStageChanged(),BatteryCell.PowerStoredneedsUpdateBatteryState()for visuals,WorldManager.DaysPasttriggersWeatherManager.OnNextDay()and per-day events.
Verification history¶
- 2026-04-20: page created from the Research migration; verbatim content lifted from F0093 (systems table) and F0095t (APIs reference) in
Plans/LLM/RESEARCH.md.
Open questions¶
None at creation.