Zone setup¶
CTLD zones are declared directly in the DCS Mission Editor by naming your trigger zones
with a structured convention. For most zones no scripting is required: CTLD reads every trigger
zone name at mission start, parses those that match a known prefix, and registers them
automatically. AI transport zones are the one exception — they are declared in
CTLD_userConfig.lua (see AI transport zones below).
For how pilots actually use these zones from the cockpit, see the Pilot guide.
Naming convention¶
A zone name encodes its type and all of its parameters, separated by _:
TYPE_name_param1_param2_..._paramN
Rule:
_is the field separator. It is forbidden inside any field value (zone name, flag name, etc.). Usefarmmain, notfarp_main.
Zone types at a glance¶
Three prefixes are auto-discovered from DCS trigger zone names:
| Prefix | Zone type | Schema |
|---|---|---|
TRZ |
Troop zone — player pickup and/or extract objective | TRZ_<name>_<A\|R\|B\|N>_<stock>_<flag>_<target> — all 5 fields required |
WPZ |
Waypoint zone — troops deployed inside march to the zone centre | WPZ_<name>_[R\|B\|N] |
LGZ |
Logistic zone — crate and vehicle services | LGZ_<name>_[R\|B\|N] |
A fourth kind — AI transport zones (AIZ) — is not name-discovered. It is declared entirely in config; see AI transport zones.
There is no separate
EXZprefix. Extract objectives are a function of a TRZ (a troop zone withstock = 0and an objective flag), described under Troop zones.
Coalition parameter:
| Value | Coalition |
|---|---|
A |
All coalitions (TRZ only) |
R |
RED only |
B |
BLUE only |
N |
Neutral |
| (omit) | All coalitions (WPZ / LGZ only — TRZ requires an explicit A) |
Uniqueness: two zones of the same prefix cannot share the same
name. A zone name already registered is never overwritten by a later one.
Troop zones (TRZ)¶
A troop zone provides player pickup and/or an extract objective.
Schema: TRZ_<name>_<A|R|B|N>_<stock>_<flag>_<target>
All 5 fields are required. The parser rejects any TRZ name with a missing or invalid field —
a warning is written to CTLD.log and the zone is ignored.
| Field | Position | Values | Meaning |
|---|---|---|---|
name |
2 | any (no underscores, not a reserved word) | Zone identifier used in logs and F10 menus |
coalition |
3 | A R B N |
Who can interact: A=all, R=RED, B=BLUE, N=NEUTRAL |
stock |
4 | integer 0–999 | 0=no pickup · 1–998=limited · 999=unlimited |
flag |
5 | DCS flag name or nil |
Flag incremented by soldier count on extract; nil = no objective |
target |
6 | integer ≥0 | 0=no threshold · N≥1=soldier-count goal for a DCS victory trigger |
Reserved words — forbidden as
nameorflag:nil,A,R,B,N.
Stock values¶
stock |
Pickup capability | What the pilot sees |
|---|---|---|
0 |
None — no pickup | No "Load from" entry in the F10 menu |
1–998 |
Limited — decrements on each load | "Load from <name> (N remaining)" |
999 |
Unlimited — never exhausted | "Load from <name>" |
Use
999for unlimited pickup — not0.0means no pickup capability.
Flag and target values¶
flag |
target |
Behaviour |
|---|---|---|
nil |
any | Zone has no objective. Troops deployed here spawn as a DCS ground group. |
| a flag name | 0 |
Objective active, no threshold. CTLD increments the flag by the soldier count each time troops are deployed inside. |
| a flag name | N≥1 |
Objective with a threshold. CTLD increments the flag; you write the DCS victory trigger flag >= N. CTLD initialises the flag to 0 at mission start and never ends the mission itself. |
Examples¶
| Zone name | Coalition | Stock | Flag | Target | Behaviour |
|---|---|---|---|---|---|
TRZ_base_B_50_nil_0 |
BLUE | 50 (limited) | — | — | Pickup — 50 soldiers, restock on RTB |
TRZ_depot_A_999_nil_0 |
All | unlimited | — | — | Pickup — unlimited, all coalitions |
TRZ_exfil_B_0_rescue_0 |
BLUE | no pickup | rescue |
none | Extract-only — deploying troops here increments flag rescue |
TRZ_lz_R_0_secure_100 |
RED | no pickup | secure |
100 | Extract with win condition — RED objective at 100 soldiers |
TRZ_fob_N_20_defend_50 |
Neutral | 20 (limited) | defend |
50 | Mixed — pickup (20) + extract objective |
TRZ_marker_B_0_nil_0 |
BLUE | no pickup | — | — | Inert — named marker, no function |
Annotated:
TRZ _ fob _ N _ 20 _ defend _ 50
│ │ │ │ │ │
│ │ │ │ │ └─ target : 50 soldiers complete the objective
│ │ │ │ └──────────── flag : "defend" (DCS flag name)
│ │ │ └─────────────────────── stock : 20 troops max (limited pickup)
│ │ └────────────────────────────── coalition: NEUTRAL
│ └────────────────────────────────────── name : "fob"
└───────────────────────────────────────────── prefix TRZ
Extract-only zone (
stock = 0): no "Load from" entry appears in the F10 menu. The zone only serves as an objective trigger when troops are deployed inside it.Mixed zone (
stock > 0andflag ≠ nil): supports both boarding and objective scoring. When a pilot lands inside with troops aboard, the objective takes priority — the flag is incremented and no DCS group is spawned. Stock restore on RTB happens only in pickup-only zones.Smoke: troop-zone smoke colour is set globally per coalition via the
troopZoneSmokeColorsetting (see Configuration), not per zone name.
See Troop transport for the pilot-side workflow (boarding, deploying, extracting).
Waypoint zones (WPZ)¶
When troops are deployed (fast-rope or ground drop) at a point that falls inside an active WPZ, they automatically march toward the centre of that zone instead of searching for the nearest enemy.
Schema: WPZ_<name>_[R|B|N]
| Example name | Meaning |
|---|---|
WPZ_hill47_B |
BLUE waypoint zone "hill47" |
WPZ_bridge |
All-coalition waypoint zone |
The zone radius is taken from the DCS trigger zone editor.
WPZ zones do not appear in the F10 menu — they act silently at deploy time.
Logistic zones (LGZ)¶
A logistic zone defines a base where pilots can spawn and pack crates and vehicles from the F10 menu. A pilot must be inside a logistic zone to use these services.
Schema: LGZ_<name>_[R|B|N]
| Example name | Meaning |
|---|---|
LGZ_depot1_B |
Logistic zone "depot1", BLUE only |
LGZ_farmmain_R |
Logistic zone "farmmain", RED only |
LGZ_shared |
Logistic zone open to all coalitions |
Radius: an
LGZ_zone is a circle centred on the trigger zone, with a radius taken from thedynamicZoneRadiussetting (default 200 m). The trigger zone's own editor radius is not used for LGZ. SetdynamicZoneRadiusin Configuration to change it globally.
See Crate catalogue for what can be spawned, and Crates for the pilot workflow.
Logistic zones created at runtime¶
The only way to add a new logistic zone during a live mission is to deploy a FOB. When the
FOB build completes, CTLD automatically registers a circular logistic zone centred on the FOB
site (radius = fobLogisticZoneRadius, default 150 m, under the FOB's name). No LGZ_ trigger
zone or config entry is required. See Scenes & FOB for the full FOB lifecycle,
including how a destroyed FOB removes its logistic zone.
Deactivating and reactivating a logistic zone¶
Use the CTLDZoneManager API from a DO SCRIPT trigger to simulate zone capture or a temporary
loss. This works for both LGZ_ trigger zones and logisticUnits-based zones:
-- Deactivate — zone is ignored by all pilots until reactivated
CTLDZoneManager.getInstance():deactivateLogisticZone("depot1")
-- Reactivate — zone becomes available again
CTLDZoneManager.getInstance():activateLogisticZone("depot1")
The zone stays registered and can be toggled any number of times.
AI transport zones (AIZ)¶
AIZ zones control the automatic behaviour of AI transports (units listed in
transportPilotNames). Human players are never affected by them.
AIZ zones have no naming convention. Any DCS trigger zone can be an AIZ zone — you reference it by name in the
aiZonesconfig array. Both pickup and drop-off fire on landing (S_EVENT_LAND): the AI unit must physically land inside the zone radius.
Roles¶
| Role | Trigger | Behaviour |
|---|---|---|
| Pickup | AI transport lands inside the zone | Loads troops and/or a whole vehicle |
| Drop-off | AI transport lands inside the zone | Deploys troops and/or unloads a whole vehicle |
A zone may be pickup only, drop-off only, or both.
Config declaration¶
Zones are declared in _cfg.settings["aiZones"], an array of entries:
_cfg.settings["aiZones"] = {
-- Troops-only pickup: two templates with per-template stock
{ dcsZoneName = "my_base", coalition = "BLUE",
isPickup = true, cargoType = "T",
troopStock = { ["Standard Group"] = 5, ["Anti Tank"] = 2 } },
-- Troops-only pickup: every compatible template, unlimited
{ dcsZoneName = "depot_alpha", coalition = "BLUE",
isPickup = true, cargoType = "T",
troopStock = { All = -1 } },
-- Vehicle-only pickup (vehicles must be physically in the zone)
{ dcsZoneName = "armor_depot", coalition = "BLUE",
isPickup = true, cargoType = "V",
vehicleStock = { ["Hummer"] = 3, ["M1025 HMMWV Armament"] = -1 } },
-- Troops + vehicle pickup
{ dcsZoneName = "hub_tv", coalition = "BLUE",
isPickup = true, cargoType = "TV",
troopStock = { All = -1 }, vehicleStock = { ["Hummer"] = 5 } },
-- Ground-only drop-off
{ dcsZoneName = "lz_front", coalition = "BLUE",
isDropoff = true, aiDropMode = "G" },
-- Ground + parachute drop-off (default)
{ dcsZoneName = "lz_rear", coalition = "BLUE",
isDropoff = true },
}
Parameters¶
| Parameter | Type | Required | Description |
|---|---|---|---|
dcsZoneName |
string | ✅ | Exact name of the DCS trigger zone |
coalition |
"RED" / "BLUE" / "NEUTRAL" |
✅ | Which AI transports use this zone |
isPickup |
true |
one of the two | Marks the zone as a pickup zone |
isDropoff |
true |
one of the two | Marks the zone as a drop-off zone |
cargoType |
"T" / "V" / "TV" |
pickup only | Troops, whole vehicle, or both. Default "T" |
troopStock |
table { [name] = N } |
pickup + troops | Per-template stock. N = -1 unlimited, N > 0 limited. Special key All = every compatible template. Must be present to enable troop pickup. |
vehicleStock |
table { [type] = N } |
pickup + vehicles | Per-type stock, same -1 / N / All rules. Must be present to enable vehicle pickup. |
aiDropMode |
"G" / "P" / "GP" |
drop-off | G ground, P parachute, GP either. Default "GP" |
troopTemplates |
{ "Name1", ... } |
optional | Whitelist of troop templates eligible at this zone |
vehicleTypes |
{ "TypeName", ... } |
optional | Whitelist of DCS vehicle type names eligible for loading |
troopStockandvehicleStockare tables, not plain integers. Per-template / per-type stock replaced the old single-integer form.
AI transport setup¶
- Create trigger zones in the ME (any name, any radius suitable for landing).
- Declare them in
_cfg.settings["aiZones"](above). - Add each AI unit's exact DCS unit name to
transportPilotNames:
_cfg.settings["transportPilotNames"] = {
["heliai_supply"] = true,
["heliai_medevac"] = true,
}
- Route the AI unit so it lands inside the zones (waypoints with a "Landing" task).
A whole vehicle is only loaded if its weight does not exceed the transport's
maxVehicleWeightand at least one aircraft hascanTransportWholeVehicle = true. See Configuration for weights and capabilities.
Validation report¶
At mission start CTLD validates every aiZones entry and, if there is anything to report,
displays a grouped list of errors and warnings on screen (30 s) and in CTLD.log, in the mission
language. If everything is valid, a single INFO line is logged and nothing pops up.
An entry is ignored (error) when it has no dcsZoneName, a duplicate dcsZoneName, a zone
absent from the Mission Editor, a missing or invalid coalition (must be RED / BLUE /
NEUTRAL), neither isPickup nor isDropoff, or vehicle cargo (V / TV) while no aircraft
can carry a whole vehicle. Common warnings (the zone is still created): an invalid cargoType
falls back to "T", an invalid aiDropMode falls back to "GP", a pickup zone missing the
matching troopStock / vehicleStock has that pickup disabled, unknown troopTemplates /
vehicleTypes names, and a pickup zone overlapping a drop-off zone of the same coalition (risk of
an instant pickup+drop-off loop).
Legacy zone configuration¶
Missions built the classic CTLD v1 way — zone names listed in config tables rather than parsed
from trigger names — are still supported. The _ character is allowed in the names here,
because these are plain DCS trigger (or unit) names, not parsed schemas. Declare them in
CTLD_userConfig.lua:
-- Pickup zones: { "DCS zone name", "smoke color", limit, "active", side }
-- smoke color : "none"|"green"|"red"|"white"|"orange"|"blue"
-- limit : -1 = unlimited, or any integer >= 1
-- active : "yes" | "no"
-- side : 0 = both, 1 = RED, 2 = BLUE
ctld.pickupZones = {
{ "pickzone1", "blue", -1, "yes", 0 },
{ "pickzone2", "red", -1, "yes", 2 },
{ "USS Tarawa", "blue", 10, "yes", 2 }, -- a ship unit name is also accepted
}
-- Drop-off zones (AI auto-deploy points): { "DCS zone name", "smoke color", side }
ctld.dropOffZones = {
{ "dropzone1", "green", 2 },
{ "dropzone2", "none", 0 },
}
-- Waypoint zones (deployed troops march to the centre): { "DCS zone name", "smoke color", "active", side }
ctld.wpZones = {
{ "wpzone1", "green", "yes", 2 },
}
-- Logistic units: unit or static names placed in the ME.
-- If the named object is destroyed, its logistic zone is removed automatically.
ctld.logisticUnits = { "logistic1", "logistic2" }
Legacy zones and auto-discovered zones (TRZ / WPZ / LGZ) coexist without conflict: a zone already registered from trigger-name discovery is never overwritten by legacy config.
For the full v1 ctld.* compatibility surface, see Legacy API.