trigger auto pause on various events with a simple ui
PauseAtToD-v0.1.5.zip
v0.1.5
An X-Plane 11.50+/12 plugin, written in Rust, that pauses the sim when a condition you've armed comes true. You can step away during cruise and come back to a paused aircraft at top of descent, near a waypoint, at an altitude, or after a set time.
Download PauseAtToD-vX.Y.Z.zip from the latest release and copy the PauseAtToD folder into X-Plane/Resources/plugins/.
Updating through SkunkCrafts Updater is recommended. The plugin folder includes a skunkcrafts_updater.cfg, so the updater picks up Pause at ToD on its own and fetches each new release. Without it, quit X-Plane and replace the PauseAtToD folder. Your settings are kept either way.
Plugins → Pause at ToD → Settings... opens a modern, resizable X-Plane floating window. It's drawn with egui and follows X-Plane's UI scale:
╭─ Pause at ToD ──────────────────────────────────╮
│ ● ARMED [ Disarm ] │
│ ╭──────────────────────────────────────────────╮ │
│ │ (●) Top of descent FMS T/D, 3:1 rule or ... │ │
│ │ Reach [arrival] at [auto] ft MSL │ │
│ │ Pause [5 nm] before the top of descent │ │
│ │ T/D in 38.2 nm (to KSEA at 1,933 ft) ... │ │
│ │ ▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░ │ │
│ ╰──────────────────────────────────────────────╯ │
│ ╭ (○) Near waypoint ───────────────────────────╮ │
│ ╭ (○) Altitude ────────────────────────────────╮ │
│ ╭ (○) Timer ───────────────────────────────────╮ │
╰─────────────────────────────────────────────────╯
pauseattod/toggle_window and pauseattod/toggle_arm.X-Plane/Output/preferences/pauseattod.prf.| Condition | Fires when |
|---|---|
| Near waypoint | The great-circle distance to the waypoint is at or below N nm. Arming while already inside that distance fires straight away. |
| Altitude | You pass the altitude in the chosen direction (descending, climbing or either way), in MSL (pilot altimeter) or AGL. It only fires on an actual crossing: arming while already below a "descending" target doesn't fire. |
| Top of descent | The first of the three ToD heuristics below fires. |
| Timer | N minutes of sim time have passed since arming. Time spent paused doesn't count. |
Top-of-descent heuristics. All three are evaluated, and none of them run below 1,000 ft AGL:
tod_dataref exists and has reported a positive distance, the plugin pauses once that distance is at or below the lead. The default name is X-Plane 12's sim/cockpit2/radios/indicators/fms_distance_to_tod_pilot (float, nm), which the built-in FMS fills once it has a descent planned. If the dataref is missing or never goes positive, this heuristic stays inactive. You can point tod_dataref at an aircraft's own ToD dataref in the prefs file.(altitude − crossing altitude) / 1000 × 3 nm before the end-of-descent point. The plugin pauses when the distance to go minus that figure is at or below the lead. The point ("Reach X at Y ft MSL") defaults to the arrival airport: the last airport in the pilot's flight plan in X-Plane's built-in FMS. It's read through X-Plane 12.1's flight-plan API when available, otherwise through the legacy FMS calls. Aircraft with their own FMS, such as Zibo or ToLiss, aren't visible this way, so type the arrival airport for those. The crossing altitude defaults to the field elevation + 1,500 ft when the point is an airport. The elevation comes from the nav database, from the airport itself or from the FMS arrival. For other kinds of point it defaults to 1,500 ft MSL. The SDK documents the nav height as feet, but X-Plane returns meters, so the plugin converts it and logs the result (PauseAtToD: KSEA field elevation 433 ft (nav height 132.0 m)). Values outside −1,500 to 15,000 ft are ignored.Waypoint lookup. Entries in the loaded X-Plane FMS flight plan come first. Otherwise the plugin uses the nav-database airport, VOR, NDB or fix with exactly that ID that's closest to the aircraft. The SDK's fragment search is tried first, and a full exact-match scan runs only if that fails.
Advanced settings exist only in the prefs file: tod_nm_per_kft (default 3), tod_dataref, and descent_vs_fpm (default −500).
crates/core pauseattod-core: pure Rust, no X-Plane. Settings + file format,
great-circle math, and the Monitor that evaluates conditions
against AircraftState samples. All heuristics are unit-tested.
crates/plugin pauseattod (cdylib → win/lin/mac.xpl)
ffi.rs hand-written bindings for the ~40 SDK functions used, checked
against the official SDK headers and import libraries
xp.rs safe wrappers: datarefs, commands, menu, nav/FMS lookups
gui.rs egui hosted in an XPLM floating window: input translation,
keyboard focus, painting with egui_glow
gl.rs GL loader, boxel→pixel transform, GL state save/restore
view.rs the window's content (plain egui code)
app.rs state machine: arm/disarm, sampling, firing, previews, prefs
lib.rs XPlugin* entry points and C callbacks
xtask `cargo xtask dist` packaging/installing, also in Rust
Key decisions:
raw-dylib imports from XPLM_64.dll (and opengl32.dll for the GL loader), so no .lib files or bindgen/libclang are needed. On macOS the build uses -undefined dynamic_lookup. Linux resolves the symbols when X-Plane loads the plugin.core gets plain samples (position, MSL/AGL altitude, VS, sim flight time, optional FMS ToD distance), so you can test every heuristic with cargo test on any machine.Event, and one guarded pump (with_app) drains the queue. A re-entrant call queues its event and returns, so a RefCell double borrow can't happen.extern "C" callback runs inside catch_unwind. A bug is written to Log.txt and doesn't crash X-Plane.sim/operation/pause_on, falling back to pause_toggle only if the sim isn't already paused.You need a stable Rust toolchain. Windows needs the MSVC target.
cargo test -p pauseattod-core # heuristics
cargo xtask dist # → dist/PauseAtToD/64/win.xpl
cargo xtask dist --install "C:/X-Plane 12" # also copies to Resources/plugins
For a universal (Intel + Apple Silicon) mac.xpl, run cargo xtask dist --target aarch64-apple-darwin --target x86_64-apple-darwin on a Mac. lin.xpl builds on Linux with plain cargo xtask dist.
GitHub Actions (.github/workflows/build.yml) runs the tests and builds all three platforms on every push. The PauseAtToD artifact holds the complete plugin folder with win.xpl, mac.xpl and lin.xpl. Pushing a v* tag also attaches that bundle to the matching GitHub release. Stable tags (no - in them) also force-push the plugin folder, with its CRC32 whitelist and sizes list, to the orphan skunkcrafts branch. That branch is the SkunkCrafts Updater module named in packaging/skunkcrafts_updater.cfg, which ships in the zip. Log lines go to X-Plane/Log.txt with the prefix PauseAtToD:.
MIT, see LICENSE.
No ratings yet.
Be the first to rate this.
Yes. Pause at top of descent mod for xp12 can be downloaded free from Hangar Addons. It is released as Open Source (MIT).
Pause at top of descent mod for xp12 is an addon in the Utilities category for X-Plane 12.
The quickest way is the Hangar Addons Manager: select Add to Addon Manager on this page and it downloads and installs Pause at top of descent mod for xp12 in the right folder. You can also download the file (8 MB), unpack it and copy it into your X-Plane 12 addons folder. The installation guides on Hangar Addons show where that is.
Pause at top of descent mod for xp12 was made by EmergencyButter.
The latest version is v0.1.5, last updated on October 31, 2026.

by MiquelG82 · v1.6.4

by FlightMesh · v0.1.93

by CXA001 · v1.63
by TripleJumpStudios · v0.1.1

by Olivier Butler · vbeta1.16

by Alexair · v3.4