Configuration

8 min readUpdated 2 weeks ago

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

shared/config.lua
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 it false in production.
  • locale: language code for translations, e.g. en. See the locales/ folder for the codes that ship.
  • UITheme.preset: theme for the loot panel, admin panel and in-world tag. Use default, wasteland, cyberpunk, noir or fantasy, or nil to inherit the global theme. The values in UITheme.colors accept CSS hex colors; nil inherits the corresponding global color.
  • InteractionMethod: how a landed crate is opened. textui shows an [E] prompt, target uses ox_target.

Admin

shared/config.lua
1Config.Admin = {
2    AcePermission = nil,
3    Command = 'airdrop',
4    MinimizeKey = 'F9',
5}
  • AcePermission: ACE permission for the admin panel, such as ml_airdrop.admin. Leave nil to 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

shared/config.lua
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: global runs one timer using Config.Defaults; zones runs an independent timer for each enabled zone whose auto.enabled is true. Only the selected mode runs.
  • interval: the global timer interval in minutes, chosen between min and max. Equal values give a fixed interval. Use whole minutes from 1 to 1440, with min no greater than max. 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 when announce is true, after the interval expires.

Zone schedules

Select Timers per zone under Settings in the admin panel, or set the mode in the configuration:

shared/config.lua
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:

shared/data/zones.lua
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

shared/config.lua
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. random chooses an enabled aircraft. In zone mode, the zone's planeTypes takes priority.
  • crate: random chooses a weighted crate, or use a specific crate ID. In zone mode, automatic drops use the zone's crateTypes.
  • zone: random chooses a weighted enabled zone, or use a specific zone ID. Individual zone timers always launch in their own zone.

In-World Tag

shared/config.lua
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. nil uses distance.
  • offsetZ: height of the tag above the crate origin.
  • scale: tag size multiplier.

Blips

shared/config.lua
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. radius in meters, alpha is its opacity.

Loot Capture

shared/config.lua
1Config.Capture = {
2    holdTime = 1500,
3}
  • holdTime: milliseconds a player must hold to capture one loot slot.

Limits

shared/config.lua
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

shared/config.lua
1Config.VehicleClaim = {
2    register = true,
3    garage = 'pillboxgarage',
4    claimFuel = 100,
5}
  • register: true registers the claimed vehicle as an owned vehicle. It works on Qbox as shipped. On QBCore and ESX, add the registration in OnVehicleClaimed with the supplied snippets. false only hands over keys to the spawned vehicle.
  • garage: home garage stored on the owned vehicle. Customise the registration in open/server.lua, OnVehicleClaimed.
  • claimFuel: fuel level restored once claimed. The vehicle stays at 0 until then.

History

shared/config.lua
1Config.HistoryRetentionDays = 30
  • HistoryRetentionDays: days to keep drop history before it is pruned. 0 keeps it forever.

Notifications

shared/config.lua
1Config.Notifications = {
2    onInbound = true,
3    onLanded = true,
4}
  • onInbound: toast when an airdrop is inbound.
  • onLanded: toast when an airdrop has landed.

Skills

shared/config.lua
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

shared/config.lua
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

server/config_server.lua
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 of discord, fivemanage, ox_lib, both, all.
  • AdminExportResources: resource names allowed to call the TriggerAirdrop export. Empty means only ml_airdrop itself can call it.
Disable A Log

Leave an action on INSERT_WEBHOOK_LINK_HERE or empty to disable it. Empty actions fall back to Default.