Turns Ace Combat 7: Skies Unknown into a home-cockpit sim: real force-feedback and bass-shaker haptics driven by live game telemetry, plus F-35-style glass MFD panels β on a game that ships no telemetry output at all.
Three parts, all in this repo:
| Part | What it does |
|---|---|
mod/ |
UE4SS Lua mod that reads live aircraft state out of the running game |
bridge/ |
Fuses that with your HOTAS and feeds MOZA FFB, ButtKicker and HF8 |
mfd/ |
F-35 PCD-style MFD panels (HUD, tactical display, stores, engine) |
Everything is derived from the game's own data β no screen capture, no guesswork.
Ace Combat 7
ββ UE4SS mod (AC7Telemetry) reads AcePlayerPawn + all mission objects
ββ named pipe (JSON lines)
ββ bridge (DCS.exe) fuses telemetry + HOTAS, derives G / AoA
ββ MOZA TCP 3476 force feedback
ββ ButtKicker UDP 16384 bass shaker (HaptiConnect)
ββ HF8 UDP 31090 haptic seat pad
ββ MFD feed UDP 8172 ββ> mfd_server ββ> browser panels
The haptics path works by speaking DCS World's telemetry protocols, so
HaptiConnect and MOZA Cockpit treat Ace Combat 7 as a fully supported sim. The
bridge ships as DCS.exe because MOZA identifies the game by process name.
The mod pulls real values out of the engine using the reflected Nimbus class dump:
- Flight state β position, attitude, velocity (G-load and AoA are derived)
- Weapons β true gun / missile / special / flare counts and their maximums
- Damage and the real mission clock
- Every mission object β with the game's own category (Plane, Heli, Vehicle,
Building, Battery, Ship), subcategory (Fighter, SAM, Tank, Cruiserβ¦),
faction (
GetFaction(): Enemy or Ally) and kill bounty - Missiles in flight and the cockpit missile-alert state
- Ace Combat 7 on PC (Steam)
- UE4SS built for AC7
- Python 3.11+ with
pygameandpywin32(pip install pygame pywin32) - Optional hardware: MOZA FFB base, ButtKicker + HaptiConnect, Next Level Racing HF8
- Optional: Microsoft Edge for the MFD panels (any Chromium works)
# 1. install the UE4SS mod into the game (auto-detects your Steam library)
.\deploy-ue4ss.ps1
# 2. start the bridge - this is the app you keep open while playing
python bridge\ac7_bridge.py # or build a DCS.exe, see below
# 3. launch the MFD panels (or use the bridge's "Launch MFD" button)
mfd\launch_mfd.cmdBuild the bridge as DCS.exe (needed for MOZA to recognise it):
pip install pyinstaller
cd bridge
python -m PyInstaller --onefile --noconsole --name DCS ac7_bridge.pyOffline / campaign only. AC7's multiplayer anti-cheat flags injected code.
Rename dwmapi.dll to dwmapi.dll.off in the game folder before playing online.
AC7 can bind arbitrary DirectInput hardware through a config file the UI never exposes β no vJoy or controller emulation needed. See docs/BINDINGS.md for a full worked example (MOZA yoke + WinWing throttle + VKB pedals), including the menu/cutscene bindings that are otherwise unreachable without a gamepad.
Each window is one half of an F-35 Panoramic Cockpit Display: a FAB status bar over a portal you can switch between pages by tapping its title.
- HUD β MIL-STD-1787 symbology: pitch ladder, flight-path marker, speed and altitude boxes, G / AoA / Mach, bank scale
- TSD β NTDS/MIL-STD-2525 tactical display: hostiles as red diamonds, friendlies as cyan circles, unknowns as yellow squares, missiles as darts, range rings with a scale bar, and a DCLT declutter control
- SMS / ENG / EFI / ICAWS β stores, engine, flight instruments, caution list
- ALL β everything at once (the default)
Windows remember where you drag them. Set "display": N in mfd_config.json
to pin one to a specific monitor, borderless and full-screen.
The MFD plays a tone when the game raises a missile alert, but no audio ships with this repo β the sounds used during development came from a third-party DCS module and are not redistributable. Drop your own files here:
mfd/web/audio/missile_lock.ogg played on "missile near"
mfd/web/audio/missile_launch.ogg played on "missile very near"
Volume is a slider in the bridge window. Browsers block audio until you interact with the page, so tap either panel once per session to enable sound.
Copy the examples and edit to taste:
bridge/bridge_config.example.json -> bridge/bridge_config.json
mfd/mfd_config.example.json -> mfd/mfd_config.json
Both are written automatically as you adjust settings in the UI.
tools/axis_finder.pyβ shows live DirectInput axis/button names for bindingtools/bk_probe.pyβ replays synthetic telemetry to test ButtKicker effects without launching the game
- docs/RESEARCH.md β how telemetry extraction was worked out
- docs/DESIGN-F35.md β F-35 PCD design reference
- docs/BINDINGS.md β HOTAS binding reference
- UE4SS and the AC7 build on Nexus
- Nimbus-Template β the reflected class dump that made precise reads possible
- B612 β Airbus's cockpit display typeface
(SIL OFL, bundled in
mfd/web/fonts/)
Not affiliated with or endorsed by Bandai Namco. For personal, offline use.
MIT β see LICENSE.