TM AirRace Development

TM AirRace MultiRace – v27_Vanilla

Native DCS Air Racing without MIST or MOOSE.

v27_Vanilla is the current development baseline of TM AirRace MultiRace. It keeps the proven v27 race logic, precise timing, DNF/restart handling, multi-class racing and external leaderboard integration while replacing the former framework dependency with a lightweight native DCS core.

No MIST. No MOOSE.
The AirRace mission-side scripts now use the native DCS Mission Scripting API.

01 · Current Architecture

One Mission – Six Race Runtimes

TM AirRace MultiRace allows several independent race categories to operate inside one DCS mission while sharing the same underlying race engine.

Runtime Laps AGL Warning DNF Result Key
Regular Jets 3 150 m 250 m TM_Jets_Season_2026
Subsonic Jets 2 150 m 200 m TM_Jets_Season_2026
Heavy / C-130 1 150 m 250 m TM_Jets_Season_2026
F/A-18C Team Time Trial 3 150 m 250 m TM_Jets_TTT_Season_2026
Warbirds 3 150 m 200 m TM_Warbirds_Season_2026
Helicopters 2 100 m 150 m TM_Helis_Season_2026

02 · Mission Structure

Inside the DCS Mission

The v27_Vanilla package consists of three Lua files:

TM_AirRace_Core_v27_Vanilla.lua TM_AirRace_Config_v27_Vanilla.lua TM_AirRace_Race_v27_Vanilla.lua

Recommended mission trigger order:

MISSION START → TM_AirRace_Core_v27_Vanilla.lua TIME MORE 1 → TM_AirRace_Config_v27_Vanilla.lua TIME MORE 2 → TM_AirRace_Race_v27_Vanilla.lua
Native Core responsibilities
  • DCS-native scheduler
  • human player detection
  • player event handling
  • circle and polygon/quad zone handling
  • unit and zone queries
  • heading / roll helpers
  • message handling

03 · Timing

Precise Circular-Gate Timing

Active racers are evaluated every 0.050 seconds.

For circular gates, the race engine does not simply accept the next 50 ms position sample as the crossing time. Instead, the crossing point between the previous and current aircraft position is mathematically reconstructed.

Race results are displayed to three decimal places, for example:

04:19.384

The source sampling interval remains 50 ms. The timestamp between samples is interpolated, providing substantially finer timing than simple 50 ms quantisation.

04 · Data Export

From DCS to Discord and WordPress

TM AirRace deliberately keeps the mission-side race engine independent from Discord, WordPress and Python.

The normal DCS server log acts as the interface between the mission and the external services.

DCS Mission │ ▼ TM AirRace v27_Vanilla │ ▼ dcs.log │ ├──────────────► Discord Bot v27 │ └──────────────► WordPress Bot v27 │ ▼ JSON │ ▼ JSON2WP v27 │ ▼ HTTP API │ ▼ WordPress / wpDataTables

The existing v27 server bots remain compatible because the external RACE FINISH interface has not changed.

05 · Race Results

RACE FINISH

Every valid completed race writes a structured result into dcs.log.

RACE FINISH|’TM_Warbirds_Season_2026’|“|’PilotName’|’TF-51D’|’AirRace-Warbird …’|174.858

The result contains the race key, pilot name, aircraft type, mission group and final race time.

The external Python services monitor the log and update their leaderboard state automatically.

06 · Persistent Identity

UCID-Based Player Tracking

DCS player names can be changed. The server integration therefore uses the player’s DCS UCID internally as the persistent identity.

A small server-side DCS Lua Hook records player connection and slot-change information:

RFW_UCID|event=connect|player_id=…|ucid=…|name=…|slot=… RFW_UCID|event=slot_change|player_id=…|ucid=…|name=…|slot=…

The external bots correlate these records with later RACE FINISH events.

UCIDs are used internally only and must never be published in public leaderboard output.

07 · Server Integration

Python, Discord and WordPress

Discord Bot v27

TM_AirRace_MultiRace_DiscordBot_v27.py monitors dcs.log and can automatically publish race results, leaderboards, champions and Team Time Trial standings into configured Discord channels.

WordPress Bot v27

TM_AirRace_MultiRace_WordPressBot_v27.py converts the current race state into JSON files.

JSON2WP v27

TM_AirRace_MultiRace_JSON2WP_v27.py exposes these JSON files through a small Flask / Waitress HTTP API.

WordPress or wpDataTables therefore never needs direct access to the DCS server process itself.

08 · Team Racing

F/A-18C Team Time Trial

Team Time Trial uses dedicated F/A-18C mission slots and a separate result namespace.

AirRace-Jets-TTT-Team-<TeamName>-<TeamNumber>-<PilotSlot>

Two to four pilots may belong to one team. Each pilot flies the normal three-lap Jet course individually. The fastest two distinct pilots form the team result.

Pilots do not need to fly simultaneously or on the same day.

A completed TTT run is recorded exclusively in the Team Time Trial results and does not affect the regular F/A-18C leaderboard.

09 · Validation

v27_Vanilla Test Status

  • Native Core startup – PASS
  • No MIST dependency – PASS
  • No MOOSE dependency – PASS
  • DCS Dedicated Server – PASS
  • Multiplayer player detection – PASS
  • UCID integration – PASS
  • 0.050 s timing – PASS
  • Circular gate interpolation – PASS
  • Regular Jets – PASS
  • Subsonic Jets – PASS
  • Heavy / C-130 – PASS
  • F/A-18C Team Time Trial – PASS
  • Two simultaneous TTT pilots – PASS
  • TTT leaderboard isolation – PASS
  • Warbirds – PASS
  • Helicopters – PASS
  • Altitude warning / DNF – PASS
  • Restricted-zone DNF – PASS
  • Crash / restart handling – PASS
  • Gate-1 restart after DNF – PASS
  • Gate-1 restart after finish – PASS
  • Existing v27 Discord / WordPress interface – PASS

10 · Downloads

v27_Vanilla Community Packages

The TM AirRace system is split into two parts: the mission-side v27_Vanilla Lua scripts and the optional server integration package for Discord, WordPress, JSON export and persistent UCID-based player identification.

Mission Scripts – v27_Vanilla

Required inside the DCS mission:

TM_AirRace_Core_v27_Vanilla.lua TM_AirRace_Config_v27_Vanilla.lua TM_AirRace_Race_v27_Vanilla.lua

Server Integration – v27

Optional server-side package for the complete external leaderboard pipeline:

  • Discord Bot v27
  • WordPress Bot v27
  • JSON2WP v27
  • UCID Server Hook
  • Python setup and requirements
  • Discord / channel configuration examples
  • Community-safe configuration templates
What do I need?

Mission builders:
Start with the v27_Vanilla Scripts. They are all that is required to run the AirRace system inside a DCS mission.

Server operators:
Add the Server Integration Package if you also want automated Discord results, persistent UCID-based player tracking, JSON exports or WordPress leaderboards.

11 · Community Development

Built to be Shared

TM AirRace is not intended only for our own servers.

Our goal is to make the experience and development gathered through DCS Air Racing available to other mission builders and communities. The project is therefore documented in a way that allows others to understand, modify and integrate the system into their own missions.

Credits & Inspiration

Bas “Joe Kurr” Weijers
[TM] GTFreeFlyer
[BlackAngels] Virgo
[JGF] Trampi
The wider DCS Air Racing community

Virgo’s native DCS scripting approach was an important reference during development of the framework-free v27_Vanilla Core.

Air Race Development Discord:
https://discord.gg/WZthwuucXN

Fly low. Fly fast. Fly together!

Historical note: earlier TM AirRace MultiRace releases used MIST as a mission scripting dependency. v27_Vanilla supersedes that architecture as the current TM AirRace development baseline.