Configuration¶
CTLD ships with sensible defaults for every parameter. You never edit the source files:
all customisation lives in a single file, CTLD_userConfig.lua, which your mission
loads with a DO SCRIPT FILE trigger. You only override what you want to change — anything
you leave alone keeps its default value.
This page covers the global settings and the per-aircraft capabilities
(capabilitiesByType). Zone lists, crate definitions, FOB scenes, the minefield and
translations each have their own page — see Where the rest is configured.
How configuration works¶
At startup, CTLDConfig populates every parameter with its default. Your
CTLD_userConfig.lua then applies your overrides on top. Throughout the running mission,
every parameter is read through a single accessor:
ctld.gs("parameterName") -- the only authorised read form
Load order in the Mission Editor¶
Add two DO SCRIPT FILE triggers at MISSION START, in this order:
| Order | Action | File |
|---|---|---|
| 1 | DO SCRIPT FILE | CTLD.lua |
| 2 | DO SCRIPT FILE | CTLD_userConfig.lua |
CTLD.lua defines the framework; CTLD_userConfig.lua applies your overrides and then
auto-starts CTLD. (If you need to run extra setup between loading and starting, set
ctld.dontInitialize = true before CTLD.lua loads and call ctld.initialize() yourself.)
Two ways to override¶
Scalars (booleans, numbers, strings) go in the ctld.yamlConfigDatas block, one
ctld.parameterName: value line each:
-- CTLD_userConfig.lua — only override what differs from the defaults.
ctld = ctld or {}
ctld.yamlConfigDatas = [[
ctld.enablePackingVehicles: true
ctld.maximumDistancePackableUnitsSearch: 350
ctld.numberOfTroops: 8
ctld.maximumDistanceLogistic: 300
ctld.slingLoad: true
]]
Tables (aircraft capabilities, zone lists, crate catalogues…) are assigned directly on the config instance. Each table you assign replaces its default entirely:
local _cfg = CTLDConfig.get()
_cfg.settings["capabilitiesByType"] = { --[[ ... ]] }
Global settings¶
System¶
| Parameter | Default | Description |
|---|---|---|
debug |
false |
Verbose logging to CTLD.log (requires a non-sanitized DCS install) |
ctldLogPath |
"" |
Override the log file path; empty = default DCS Saved Games folder |
debugScreenLog |
false |
Also echo log messages to the DCS screen via outText |
location_DMS |
false |
Show coordinates as Degrees-Minutes-Seconds instead of Degrees-Decimal-Minutes |
disableAllSmoke |
false |
Globally disable all smoke at pickup and drop-off zones |
Crates & slingload¶
| Parameter | Default | Description |
|---|---|---|
enableCrates |
true |
Master switch for crate spawning and unpacking |
enableAllCrates |
true |
Show the "All crates" shortcut entries in the Request Equipment menus. Set false to keep only individual crate entries |
slingLoad |
false |
Use DCS sling-load physics instead of the virtual hover system |
enableHoverSlingload |
true |
Allow crate loading by hovering above it. If false, crates load only via the F10 menu (loadCrateFromMenu) |
loadCrateFromMenu |
true |
Allow crate loading via the F10 menu (useful for fixed-wing that cannot hover) |
enableSmokeDrop |
true |
Enable the "Drop Smoke" F10 entry |
Distances (metres)¶
| Parameter | Default | Description |
|---|---|---|
maximumDistanceLogistic |
200 |
Max distance from a logistics zone to load or spawn a crate |
maxExtractDistance |
125 |
Max distance from the vehicle to troops for extraction |
maximumSearchDistance |
3000 |
Max distance for deployed AI troops to search for enemies |
maximumDistancePackableUnitsSearch |
200 |
Max distance to search for packable vehicles |
Troops¶
| Parameter | Default | Description |
|---|---|---|
numberOfTroops |
10 |
Default / max troop group size per transport (overridden per aircraft by maxTroopsOnboard) |
enableFastRopeInsertion |
true |
Allow fast-rope deployment |
fastRopeMaximumHeight |
18.28 |
Max height (m) for fast-rope insertion (≈ 60 ft) |
allowRandomAiTeamPickups |
false |
Allow AI transports to randomly pick a troop template at pickup zones. When false, the AI always picks the first available template for its coalition |
nbLimitSpawnedTroops |
{0, 0} |
Cumulative troop cap per coalition {RED, BLUE} — 0 = unlimited (Lua table) |
Infantry weight simulation¶
CTLD estimates each troop group's weight to check whether it fits inside a transport (see
capabilitiesByType[type].maxTroopsOnboard and vehicle weights). Every soldier weighs a
randomised 90–120 % of SOLDIER_WEIGHT, plus kit and role-specific gear.
| Parameter | Default | Description |
|---|---|---|
SOLDIER_WEIGHT |
80 |
Base body weight per soldier (kg) |
KIT_WEIGHT |
20 |
Helmet + backpack per soldier (kg) |
RIFLE_WEIGHT |
5 |
Standard rifleman kit (kg) |
MANPAD_WEIGHT |
18 |
AA soldier MANPAD tube (kg) |
RPG_WEIGHT |
7.6 |
AT soldier RPG + rocket (kg) |
MG_WEIGHT |
10 |
Machine-gunner weapon + 200-round belt (kg) |
MORTAR_WEIGHT |
26 |
Mortar crew tube + shells (kg) |
JTAC_WEIGHT |
15 |
JTAC laser + radio + binoculars (kg) |
CIV_WEIGHT |
2 |
Light personal items for the civilian role (kg) |
FOB¶
| Parameter | Default | Description |
|---|---|---|
enabledFOBBuilding |
true |
Allow FOB construction from crates |
troopPickupAtFOB |
true |
Allow troop pickup at built FOBs |
fobMinDistanceFromZones |
500 |
Minimum distance (m) from any logistic zone at which a FOB may be deployed |
fobLogisticZoneRadius |
150 |
Radius (m) of the logistic zone created around a deployed FOB |
fobTroopPickupRadius |
150 |
Radius (m) within which troops may board at a FOB |
fobDestructionThreshold |
0.5 |
Fraction of scene objects destroyed before a FOB is considered lost (0.0–1.0) |
enableFARPRepack |
true |
Allow players to pack a deployed FARP scene back into crates for redeployment |
Note
The number of crates required to build a FOB is not a global setting — it comes from
the FOB scene model (cratesRequired, default 3), collected within 750 m. See
Scenes & FOB.
Vehicles & packing¶
| Parameter | Default | Description |
|---|---|---|
enablePackingVehicles |
true |
Allow vehicles to be packed back into crates |
groundVehicleWeights |
{...} |
Weight (kg) per vehicle DCS type, checked against each aircraft's maxVehicleWeight for whole-vehicle transport (Lua table) |
capabilitiesByType |
{...} |
Unified per-aircraft capability table — see Per-aircraft capabilities below |
Beacons¶
| Parameter | Default | Description |
|---|---|---|
enabledRadioBeaconDrop |
true |
Allow beacon deployment |
deployedBeaconBattery |
30 |
Beacon battery life (minutes) |
radioSound |
"beacon.ogg" |
Beacon sound file — must be added to the mission .miz, or beacons will not work |
radioSoundFC3 |
"beaconsilent.ogg" |
Silent beacon file for FC3 aircraft |
AA systems¶
| Parameter | Default | Description |
|---|---|---|
AASystemLimitBLUE |
20 |
Max active AA systems for BLUE |
AASystemLimitRED |
20 |
Max active AA systems for RED |
AASystemCrateStacking |
false |
Allow multiple crate sets to add extra launchers (N×crates → N×launchers) |
aaLaunchers |
3 |
Default number of launchers per AA system when the template does not specify |
JTAC¶
| Parameter | Default | Description |
|---|---|---|
JTAC_LIMIT_BLUE |
10 |
Max JTAC objects BLUE may spawn (fixed quota — not refilled when a JTAC is killed) |
JTAC_LIMIT_RED |
10 |
Max JTAC objects RED may spawn (same) |
JTAC_dropEnabled |
true |
Allow JTAC crate spawn from F10 |
JTAC_maxDistance |
10000 |
JTAC line-of-sight range (metres) |
JTAC_lock |
"all" |
Target filter: "vehicle" | "troop" | "all" |
JTAC_allowStandbyMode |
true |
Allow toggling lasing on/off |
JTAC_laseSpotCorrections |
true |
Lead moving targets, accounting for wind and target speed |
JTAC_allow9Line |
true |
Allow 9-line requests |
JTAC_allowSmokeRequest |
true |
Allow smoke-on-target requests |
JTAC_smokeOn_RED |
false |
Enable smoke marking for RED JTACs |
JTAC_smokeOn_BLUE |
false |
Enable smoke marking for BLUE JTACs |
JTAC_smokeColour_RED |
4 |
RED JTAC smoke colour — 0=Green 1=Red 2=White 3=Orange 4=Blue |
JTAC_smokeColour_BLUE |
1 |
BLUE JTAC smoke colour — 0=Green 1=Red 2=White 3=Orange 4=Blue |
JTAC_smokeMarginOfError |
50 |
Max random placement error radius (m) for smoke |
JTAC_smokeOffset_x |
0.0 |
Fixed East/West offset (m) added before the random error |
JTAC_smokeOffset_y |
2.0 |
Fixed vertical offset (m) — keeps smoke visible above terrain |
JTAC_smokeOffset_z |
0.0 |
Fixed North/South offset (m) added before the random error |
JTAC_droneRadius |
1000 |
Fallback orbit radius (m) for drone JTACs when the crate has no specificParams |
JTAC_droneAltitude |
4000 |
Fallback orbit altitude AGL (m) for drone JTACs when the crate has no specificParams |
Pre-placed JTAC groups (auto-detection)¶
CTLD detects JTAC groups placed in the Mission Editor at startup. A group is recognised as a
JTAC when its group name contains jtac (case-insensitive) — for example jtac_blue_1,
JTAC_Red_Forward, blue_jtac_drone.
Naming rule (mandatory)
Any JTAC group placed in the Mission Editor must include jtac in its group name.
CTLD uses the group name — not the unit type — to identify pre-placed JTACs. A group
containing a Hummer or SKP-11 will not be detected unless its name contains jtac.
Late-activation JTAC groups are supported and registered automatically when they activate.
RECON¶
| Parameter | Default | Description |
|---|---|---|
reconF10Menu |
true |
Enable the RECON F10 submenu |
reconEnabled |
false |
Master switch — must be true for scan commands to work |
reconSearchRadius |
5000 |
Line-of-sight scan radius (metres) |
reconMinAltitude |
50 |
Minimum AGL altitude (m) required to perform a scan |
reconRefreshInterval |
10 |
Auto-refresh interval (seconds) |
reconIconScale |
1.0 |
Icon size multiplier (1.0 = default, 2.0 = double) |
Minefield¶
| Parameter | Default | Description |
|---|---|---|
showMinefieldOnF10Map |
true |
Draw a bounding quad on the F10 map when a minefield is deployed |
demineRadius |
150 |
Max distance (m) from the player to the minefield centre for the "Clear Mine Field" entry to appear |
See Minefield for deployment.
Per-aircraft capabilities¶
capabilitiesByType is the single table that defines every per-aircraft capability. Only
aircraft listed here receive CTLD F10 menus. Each key is the exact DCS type name of the
aircraft (mods included, e.g. "Hercules", "76MD", "UH-60L").
local _cfg = CTLDConfig.get()
_cfg.settings["capabilitiesByType"] = {
["UH-1H"] = {
cratesEnabled = true, -- can load/unpack crates
troopsEnabled = true, -- can load/deploy infantry
canParachuteDrop = true, -- enables Parachute F10 entries
canSlingload = true, -- enables hover-pickup + Slingload menus
canTransportWholeVehicle = true, -- whole-vehicle transport
useNativeDcsCargoSystem = true, -- use the DCS native cargo system for crates
convertNativeLoadToCTLD = true, -- convert DCS-native cargo loads to CTLD-managed
maxTroopsOnboard = 8, -- max soldiers (overrides ctld.numberOfTroops)
maxCratesOnboard = 1, -- max crates carried at once
maxWholeVehiclesOnboard = 1, -- max whole vehicles carried at once
maxVehicleWeight = 1360, -- max whole-vehicle weight (kg) this aircraft can lift
loadableVehiclesRED = { "BRDM-2", "BTR_D" },
loadableVehiclesBLUE = { "M1045 HMMWV TOW", "M1043 HMMWV Armament", "Hummer" },
},
["C-130J-30"] = {
cratesEnabled = true, troopsEnabled = true, canParachuteDrop = true, canSlingload = false,
canTransportWholeVehicle = true, useNativeDcsCargoSystem = true, convertNativeLoadToCTLD = false,
maxTroopsOnboard = 80, maxCratesOnboard = 22, maxWholeVehiclesOnboard = 2,
maxVehicleWeight = 20000,
loadableVehiclesRED = { "BRDM-2", "BTR_D" },
loadableVehiclesBLUE = { "M1045 HMMWV TOW", "M1043 HMMWV Armament", "Hummer" },
},
-- ... one entry per aircraft type
}
Field reference:
| Field | Type | Description |
|---|---|---|
cratesEnabled |
bool | Can load / spawn / unpack crates |
troopsEnabled |
bool | Can load / deploy infantry groups |
canParachuteDrop |
bool | Enables the "Parachute" F10 entries |
canSlingload |
bool | Enables hover-pickup and "Release/Cut Slingload" menus |
canTransportWholeVehicle |
bool | Can load and re-deploy whole vehicles |
useNativeDcsCargoSystem |
bool | When true, CTLD spawns crates as DCS cargo objects (native cargo integration). When false, crates are spawned directly as static objects |
convertNativeLoadToCTLD |
bool | When true, any crate loaded through the DCS cargo UI is immediately converted to a CTLD-managed crate (destroys the DCS slot, prevents ghost crates). Set true for helicopters where the DCS cargo UI is exposed but CTLD parachute is needed (UH-1H, CH-47Fbl1); leave false for aircraft that rely on DCS native cargo for ground ops (C-130J-30, 76MD, Hercules) |
maxTroopsOnboard |
number | Max soldiers this aircraft can carry (overrides numberOfTroops) |
maxCratesOnboard |
number | Max crates loaded at once (fallback: 1 for unlisted types) |
maxWholeVehiclesOnboard |
number | Max whole vehicles carried at once (0 = disabled) |
maxVehicleWeight |
number | Max whole-vehicle weight (kg) this aircraft can lift; heavier vehicles are skipped by AI auto-pickup. Omit or set nil for unlimited |
loadableVehiclesRED |
string[] | DCS type names of RED-coalition vehicles this aircraft can transport whole |
loadableVehiclesBLUE |
string[] | DCS type names of BLUE-coalition vehicles this aircraft can transport whole |
Note
When canTransportWholeVehicle = true and loadableVehiclesRED/BLUE lists a vehicle
type, that type appears in the Request Equipment F10 menu. Selecting it spawns the
vehicle as a waiting unit near the transport (instead of a crate); the pilot then loads
it from the cockpit. See the Pilot guide for the in-cockpit flow.
Aircraft not listed in capabilitiesByType receive no CTLD menus. Assigning your own
capabilitiesByType table replaces the built-in one entirely, so include every aircraft you
want CTLD-capable.
Access control¶
Two parameters decide which player units get CTLD F10 menus.
| Parameter | Default | Description |
|---|---|---|
addPlayerAircraftByType |
true |
How CTLD selects player units that receive menus |
transportPilotNames |
{...} |
Whitelist of DCS unit names — active when addPlayerAircraftByType = false, and always used for AI transports |
addPlayerAircraftByType = true (default) — any player whose aircraft type is listed in
capabilitiesByType automatically gets CTLD menus on entering a slot. Recommended for open
multiplayer servers.
addPlayerAircraftByType = false — only unit names explicitly listed in
transportPilotNames get CTLD menus. Use this to restrict CTLD to a fixed set of named slots
(e.g. a dedicated transport squadron). CTLD-capable aircraft not in the list join the
mission normally but have no CTLD access.
local _cfg = CTLDConfig.get()
_cfg.settings["addPlayerAircraftByType"] = false
_cfg.settings["transportPilotNames"] = {
"transport_slot_1",
"transport_slot_2",
"transport_slot_3",
}
AI transports
AI transports always use transportPilotNames, regardless of addPlayerAircraftByType.
Add AI unit names there to enable auto-pickup / drop-off behaviour.
Where the rest is configured¶
Configuration that is not global lives on dedicated pages:
| Topic | Page |
|---|---|
Troop / logistics / extract / waypoint zones (troopZones, AIZones, wpZones…) |
Zone setup |
| FOB building and scene deployment | Scenes & FOB |
spawnableCrates, crate descriptors and AA templates |
Crate catalogue |
| Minefield deployment | Minefield |
| Localisation and translation overrides | Translations |
v1 ctld.* compatibility for existing scripts |
Legacy API |
To operate CTLD from the cockpit (the F10 menu), see the Pilot guide.