Configuration
Overview
shared/config.lua: general behavior, auto events, in-world tag, blips, capture, limits, vehicles, history, notifications and skills.server/config_server.lua: Discord webhooks, the log provider and the export allowlist.
Planes, crates, loot tables, zones and flares start from the files in shared/data. The in-game admin panel edits them live and saves to the database, which then overrides those files.
General
1Config.Debug = false
2Config.locale = 'en'
3Config.UITheme = {
4 preset = 'default',
5 colors = {
6 primary = nil,
7 accent = nil,
8 background = nil,
9 surface = nil,
10 text = nil,
11 },
12}
13Config.InteractionMethod = 'textui'Debug: prints extra diagnostics to the server console. Keep itfalsein production.locale: language code for translations, e.g.en. See thelocales/folder for the codes that ship.UITheme.preset: theme for the loot panel, admin panel and in-world tag. Usedefault,wasteland,cyberpunk,noirorfantasy, ornilto inherit the global theme. The values inUITheme.colorsaccept CSS hex colors;nilinherits the corresponding global color.InteractionMethod: how a landed crate is opened.textuishows an[E]prompt,targetuses ox_target.
Admin
1Config.Admin = {
2 AcePermission = nil,
3 Command = 'airdrop',
4 MinimizeKey = 'F9',
5}AcePermission: ACE permission for the admin panel, such asml_airdrop.admin. Leavenilto use the admin check of ml_bridge.Command: chat command that opens the admin panel.MinimizeKey: hides and restores the admin panel. F1 to F12, or a single letter or digit.
Auto Events
1Config.AutoEvents = {
2 enabled = true,
3 mode = 'global',
4 interval = { min = 30, max = 45 },
5 minPlayers = 2,
6 announce = true,
7 countdown = 30,
8}enabled: run automatic airdrops in the selected mode. Manual and flare drops remain available when this is false.mode:globalruns one timer usingConfig.Defaults;zonesruns an independent timer for each enabled zone whoseauto.enabledis true. Only the selected mode runs.interval: the global timer interval in minutes, chosen betweenminandmax. Equal values give a fixed interval. Use whole minutes from 1 to 1440, withminno greater thanmax. Zone mode uses each zone's own interval.minPlayers: minimum number of online players required for automatic drops. When too few players are online, a due drop waits until the requirement is met.announce: broadcast an incoming-drop notification to everyone.countdown: seconds before the plane appears. In zone mode, the countdown falls within the interval and cannot exceed its duration; after a waiting condition clears, the countdown starts then. Global mode applies the countdown only whenannounceis true, after the interval expires.
Zone schedules
Select Timers per zone under Settings in the admin panel, or set the mode in the configuration:
1Config.AutoEvents.mode = 'zones'Assign automatic settings after the existing zone definitions. This example gives Sandy Shores a fixed 30-minute interval and Grapeseed a random interval of 60 to 90 minutes:
1Config.Zones.sandy.auto = {
2 enabled = true,
3 interval = { min = 30, max = 30 },
4}
5
6Config.Zones.grapeseed.auto = {
7 enabled = true,
8 interval = { min = 60, max = 90 },
9}auto.enabled: include the zone in automatic scheduling. The zone itself must also be enabled. A zone without an auto table does not run its own timer.
auto.interval: minutes between successful automatic launches in that zone. Use whole minutes from 1 to 1440; min must not exceed max. Equal values give a fixed interval. Set crateTypes and planeTypes on the zone to choose its crate and aircraft pools.
The first interval starts when the zone timer is activated. Later intervals start when the previous automatic drop is created, as the aircraft goes inbound. They do not start at landing or after looting.
If too few players are online, the shared drop limit is reached, or a drop is already active in that zone, the launch waits. Each zone keeps one pending launch; missed intervals do not build a queue of drops.
In Zones, use Automatic drops, Minimum gap and Maximum gap to edit each timer. Control shows Zone schedules, the next launch or warning countdown, and any reason a launch is waiting.
Saved admin settings override the configuration files. Saving unrelated settings preserves running zone timers; changing a zone interval restarts that timer. Disabling or deleting a zone cancels its pending warning. Resource restarts start fresh intervals and do not catch up on missed launches.
Defaults
1Config.Defaults = {
2 plane = 'cargobob_titan',
3 crate = 'random',
4 zone = 'random',
5}plane: default aircraft for global automatic events and drops with no aircraft selected.randomchooses an enabled aircraft. In zone mode, the zone'splaneTypestakes priority.crate:randomchooses a weighted crate, or use a specific crate ID. In zone mode, automatic drops use the zone'scrateTypes.zone:randomchooses a weighted enabled zone, or use a specific zone ID. Individual zone timers always launch in their own zone.
In-World Tag
1Config.DUI = {
2 enabled = true,
3 maxActive = 6,
4 distance = 30.0,
5 sealDistance = nil,
6 offsetZ = 0.7,
7 scale = 1.0,
8}enabled: show the floating tag above each crate and vehicle drop.maxActive: how many tags render at once. The nearest drops win when more are active.distance: render distance in meters, fading near the edge.sealDistance: optional larger render distance while a crate is still sealed, so the unlock countdown is readable from farther.nilusesdistance.offsetZ: height of the tag above the crate origin.scale: tag size multiplier.
Blips
1Config.Blips = {
2 plane = { enabled = true, sprite = 424, color = 5, scale = 0.9, label = 'Airdrop Plane' },
3 crate = { enabled = true, sprite = 478, color = 5, scale = 0.85, label = 'Airdrop' },
4 zoneRadius = { enabled = true, radius = 120.0, alpha = 70, color = 5 },
5}plane: blip for the inbound aircraft while it flies in.crate: blip on the landed crate or vehicle.zoneRadius: search-area circle shown while a drop is inbound.radiusin meters,alphais its opacity.
Loot Capture
1Config.Capture = {
2 holdTime = 1500,
3}holdTime: milliseconds a player must hold to capture one loot slot.
Limits
1Config.Limits = {
2 maxConcurrentDrops = 3,
3 locateAttempts = 25,
4 minDistanceFromPlayers = 8.0,
5}maxConcurrentDrops: server-wide limit shared by automatic, manual, flare and export drops. Automatic warnings also reserve capacity before the drop starts.locateAttempts: candidate points tried before giving up on a zone.minDistanceFromPlayers: a drop point must be at least this far from any player.
Vehicle Claim
1Config.VehicleClaim = {
2 register = true,
3 garage = 'pillboxgarage',
4 claimFuel = 100,
5}register:trueregisters the claimed vehicle as an owned vehicle. It works on Qbox as shipped. On QBCore and ESX, add the registration inOnVehicleClaimedwith the supplied snippets.falseonly hands over keys to the spawned vehicle.garage: home garage stored on the owned vehicle. Customise the registration inopen/server.lua,OnVehicleClaimed.claimFuel: fuel level restored once claimed. The vehicle stays at 0 until then.
History
1Config.HistoryRetentionDays = 30HistoryRetentionDays: days to keep drop history before it is pruned.0keeps it forever.
Notifications
1Config.Notifications = {
2 onInbound = true,
3 onLanded = true,
4}onInbound: toast when an airdrop is inbound.onLanded: toast when an airdrop has landed.
Skills
1Config.Skills = {
2 enabled = false,
3 resource = 'ml_skills',
4 category = 'personal',
5 xp = 25,
6 vehicleXp = 50,
7}enabled: award XP through ml_skills when a drop is looted or claimed.resource: skills resource name, in case you run a fork.category: default category credited when a crate sets no rewards of its own. It must exist in your ml_skills setup.xp: default container XP budget when a crate sets no rewards. The budget is split across the loot slots, so every player earns for the slots they take.vehicleXp: default XP budget for the player who claims a vehicle drop.
A crate can override this with its own rewards, in one or more categories at once, set per crate in the admin panel.
Minigames
1Config.AirdropMiniGames = Config.AirdropMiniGames or {}The minigame registry is filled by the adapter files in open/minigames. Add your own there and it becomes selectable as a crate open method.
Server Config
1Config.DiscordWebhook = {
2 Default = 'INSERT_WEBHOOK_LINK_HERE',
3 Spawn = 'INSERT_WEBHOOK_LINK_HERE',
4 Loot = 'INSERT_WEBHOOK_LINK_HERE',
5 VehicleClaimed = 'INSERT_WEBHOOK_LINK_HERE',
6 Despawn = 'INSERT_WEBHOOK_LINK_HERE',
7 AdminTrigger = 'INSERT_WEBHOOK_LINK_HERE',
8 AdminSave = 'INSERT_WEBHOOK_LINK_HERE',
9 AdminDespawn = 'INSERT_WEBHOOK_LINK_HERE',
10 AdminTeleport = 'INSERT_WEBHOOK_LINK_HERE',
11}
12Config.LogProvider = 'discord'
13Config.AdminExportResources = {}DiscordWebhook: one webhook per action, so each kind of event can go to its own channel.LogProvider: where logs are sent through ml_bridge. One ofdiscord,fivemanage,ox_lib,both,all.AdminExportResources: resource names allowed to call theTriggerAirdropexport. Empty means only ml_airdrop itself can call it.
Leave an action on INSERT_WEBHOOK_LINK_HERE or empty to disable it. Empty actions fall back to Default.