Skip to content

Installation

Follow these steps to install sd-deaddrop on your FiveM server.

Supported Frameworks

The framework is detected automatically at runtime. No configuration is needed.

FrameworkStatus
qbx_core (Qbox)Supported
qb-core (QBCore)Supported
es_extended (ESX)Supported

Supported Inventories

The inventory bridge is detected automatically.

InventoryStatus
ox_inventorySupported - full feature set
qb-inventorySupported
qs-inventorySupported
qs-inventory-proSupported
ps-inventorySupported
lj-inventorySupported
origen_inventorySupported
codem-inventorySupported
jaksam_inventorySupported
tgiann-inventorySupported

Two features are ox_inventory only

The tablet's USB storage stash and trunk selling at the contact both rely on ox_inventory stash ids. On every other inventory the terminal reads intrusion USBs straight from the player's own inventory instead, and the trunk-selling dialog entry hides itself. Nothing else changes.

Supported Targets

Target SystemStatus
ox_targetSupported
qb-targetSupported
qtargetSupported

Dependencies

Ensure the following dependencies are installed and running on your server before starting:

DependencyRequiredNotes
FrameworkYesqbx_core / qb-core / es_extended
ox_libYesCommands, progress bars, notifications, audit logger
oxmysqlYesReputation, statistics and subscriptions
InventoryYesAny of the supported inventories listed above
Target SystemYesox_target / qb-target / qtarget
DispatchOptionalBridged through one configurable event - see Configuration

TIP

Framework, inventory and target system are all automatically detected - no configuration needed. Every database table is created automatically on first start.

1 Add the Resource

  1. Download the latest version of sd-deaddrop from the CFX Portal
  2. Extract it into your server's resources directory
  3. Ensure the resource is started in your server.cfg (or resources.cfg, in case you load resources differently). Simply ensuring the sub-folder (i.e. ensure [sd]) will work too, provided dependencies are started in a separate sub-folder before. Here's an example:
cfg
ensure ox_lib
ensure oxmysql
ensure qbx_core
ensure ox_inventory

ensure sd-deaddrop

2 Add the Items

Dead Drop ships 17 items: the hacking tablet, four intrusion USB kits, and twelve haulable loot crates. Register them in your inventory system, and copy the images from the resource's images/ folder into your inventory's image folder.

ItemPurpose
merryweather_tabletThe hacking rig - opens the intrusion terminal
deaddrop_usb_1Runner Kit - net-maze.exe, cipher-lock.exe
deaddrop_usb_2Breaker Kit - node-grab.exe, code-inject.exe
deaddrop_usb_3Decrypt Suite - highway-evade.exe, sig-replay.exe, pipe-route.exe
deaddrop_usb_4Black ICE Suite - data-worm.exe, fw-defense.exe, ice-break.exe
deaddrop_item_1 to deaddrop_item_12The haulable container loot

Item Definitions

lua
['merryweather_tablet'] = {
    label = 'Merryweather Tablet',
    weight = 2000,
    stack = false,
    consume = 0,
    description = 'A ruggedized Merryweather field tablet, reflashed with a custom intrusion terminal.',
    client = { export = 'sd-deaddrop.useTablet', image = 'merryweather_tablet.png' },
    buttons = {
        {
            label = 'USB Storage',
            action = function(slot)
                exports['sd-deaddrop']:openTabletStash(slot)
            end,
        },
    },
},
['deaddrop_usb_1'] = {
    label = 'Intrusion USB - Runner Kit',
    weight = 50,
    stack = false,
    description = 'A scuffed USB carrying two intrusion daemons - net-maze.exe and cipher-lock.exe. Provides both to the terminal while it sits in the tablet\'s USB storage.',
    client = { image = 'deaddrop_usb_1.png' },
},
['deaddrop_usb_2'] = {
    label = 'Intrusion USB - Breaker Kit',
    weight = 50,
    stack = false,
    description = 'A scuffed USB carrying two intrusion daemons - node-grab.exe and code-inject.exe. Provides both to the terminal while it sits in the tablet\'s USB storage.',
    client = { image = 'deaddrop_usb_2.png' },
},
['deaddrop_usb_3'] = {
    label = 'Intrusion USB - Decrypt Suite',
    weight = 50,
    stack = false,
    description = 'A sealed USB carrying three heavier daemons - highway-evade.exe, sig-replay.exe and pipe-route.exe. Provides all three to the terminal while it sits in the tablet\'s USB storage.',
    client = { image = 'deaddrop_usb_3.png' },
},
['deaddrop_usb_4'] = {
    label = 'Intrusion USB - Black ICE Suite',
    weight = 50,
    stack = false,
    description = 'A blacked-out USB carrying three elite daemons - data-worm.exe, fw-defense.exe and ice-break.exe. Provides all three to the terminal while it sits in the tablet\'s USB storage.',
    client = { image = 'deaddrop_usb_4.png' },
},
['deaddrop_item_1'] = {
    label = 'Dead Drop Item 1 (Alpha)',
    weight = 100,
    consume = 0,
    client = { export = 'sd-deaddrop.openLootGrid' },
},
['deaddrop_item_2'] = {
    label = 'Dead Drop Item 2 (Bravo)',
    weight = 100,
    consume = 0,
    client = { export = 'sd-deaddrop.openLootGrid' },
},
['deaddrop_item_3'] = {
    label = 'Dead Drop Item 3 (Charlie)',
    weight = 100,
    consume = 0,
    client = { export = 'sd-deaddrop.openLootGrid' },
},
['deaddrop_item_4'] = {
    label = 'Dead Drop Item 4 (Delta)',
    weight = 100,
    consume = 0,
    client = { export = 'sd-deaddrop.openLootGrid' },
},
['deaddrop_item_5'] = {
    label = 'Dead Drop Item 5 (Echo)',
    weight = 100,
    consume = 0,
    client = { export = 'sd-deaddrop.openLootGrid' },
},
['deaddrop_item_6'] = {
    label = 'Dead Drop Item 6 (Foxtrot)',
    weight = 100,
    consume = 0,
    client = { export = 'sd-deaddrop.openLootGrid' },
},
['deaddrop_item_7'] = {
    label = 'Dead Drop Item 7 (Golf)',
    weight = 100,
    consume = 0,
    client = { export = 'sd-deaddrop.openLootGrid' },
},
['deaddrop_item_8'] = {
    label = 'Dead Drop Item 8 (Hotel)',
    weight = 100,
    consume = 0,
    client = { export = 'sd-deaddrop.openLootGrid' },
},
['deaddrop_item_9'] = {
    label = 'Dead Drop Item 9 (India)',
    weight = 100,
    consume = 0,
    client = { export = 'sd-deaddrop.openLootGrid' },
},
['deaddrop_item_10'] = {
    label = 'Dead Drop Item 10 (Juliett)',
    weight = 100,
    consume = 0,
    client = { export = 'sd-deaddrop.openLootGrid' },
},
['deaddrop_item_11'] = {
    label = 'Dead Drop Item 11 (Kilo)',
    weight = 100,
    consume = 0,
    client = { export = 'sd-deaddrop.openLootGrid' },
},
['deaddrop_item_12'] = {
    label = 'Dead Drop Item 12 (Lima)',
    weight = 100,
    consume = 0,
    client = { export = 'sd-deaddrop.openLootGrid' },
},
lua
['merryweather_tablet'] = { name = 'merryweather_tablet', label = 'Merryweather Tablet', weight = 2000, type = 'item', image = 'merryweather_tablet.png', unique = true, useable = true, shouldClose = true, description = 'A ruggedized Merryweather field tablet, reflashed with a custom intrusion terminal.' },
['deaddrop_usb_1'] = { name = 'deaddrop_usb_1', label = 'Intrusion USB - Runner Kit', weight = 50, type = 'item', image = 'deaddrop_usb_1.png', unique = true, useable = false, shouldClose = true, description = 'Carries net-maze.exe and cipher-lock.exe. Provides both to the terminal while carried.' },
['deaddrop_usb_2'] = { name = 'deaddrop_usb_2', label = 'Intrusion USB - Breaker Kit', weight = 50, type = 'item', image = 'deaddrop_usb_2.png', unique = true, useable = false, shouldClose = true, description = 'Carries node-grab.exe and code-inject.exe. Provides both to the terminal while carried.' },
['deaddrop_usb_3'] = { name = 'deaddrop_usb_3', label = 'Intrusion USB - Decrypt Suite', weight = 50, type = 'item', image = 'deaddrop_usb_3.png', unique = true, useable = false, shouldClose = true, description = 'Carries highway-evade.exe, sig-replay.exe and pipe-route.exe. Provides all three to the terminal while carried.' },
['deaddrop_usb_4'] = { name = 'deaddrop_usb_4', label = 'Intrusion USB - Black ICE Suite', weight = 50, type = 'item', image = 'deaddrop_usb_4.png', unique = true, useable = false, shouldClose = true, description = 'Carries data-worm.exe, fw-defense.exe and ice-break.exe. Provides all three to the terminal while carried.' },
['deaddrop_item_1'] = { name = 'deaddrop_item_1', label = 'Dead Drop Item 1 (Alpha)', weight = 100, type = 'item', image = 'deaddrop_item_1.png', unique = false, useable = true, shouldClose = true, description = 'A crate hauled out of a Merryweather container.' },
['deaddrop_item_2'] = { name = 'deaddrop_item_2', label = 'Dead Drop Item 2 (Bravo)', weight = 100, type = 'item', image = 'deaddrop_item_2.png', unique = false, useable = true, shouldClose = true, description = 'A crate hauled out of a Merryweather container.' },
['deaddrop_item_3'] = { name = 'deaddrop_item_3', label = 'Dead Drop Item 3 (Charlie)', weight = 100, type = 'item', image = 'deaddrop_item_3.png', unique = false, useable = true, shouldClose = true, description = 'A crate hauled out of a Merryweather container.' },
['deaddrop_item_4'] = { name = 'deaddrop_item_4', label = 'Dead Drop Item 4 (Delta)', weight = 100, type = 'item', image = 'deaddrop_item_4.png', unique = false, useable = true, shouldClose = true, description = 'A crate hauled out of a Merryweather container.' },
['deaddrop_item_5'] = { name = 'deaddrop_item_5', label = 'Dead Drop Item 5 (Echo)', weight = 100, type = 'item', image = 'deaddrop_item_5.png', unique = false, useable = true, shouldClose = true, description = 'A crate hauled out of a Merryweather container.' },
['deaddrop_item_6'] = { name = 'deaddrop_item_6', label = 'Dead Drop Item 6 (Foxtrot)', weight = 100, type = 'item', image = 'deaddrop_item_6.png', unique = false, useable = true, shouldClose = true, description = 'A crate hauled out of a Merryweather container.' },
['deaddrop_item_7'] = { name = 'deaddrop_item_7', label = 'Dead Drop Item 7 (Golf)', weight = 100, type = 'item', image = 'deaddrop_item_7.png', unique = false, useable = true, shouldClose = true, description = 'A crate hauled out of a Merryweather container.' },
['deaddrop_item_8'] = { name = 'deaddrop_item_8', label = 'Dead Drop Item 8 (Hotel)', weight = 100, type = 'item', image = 'deaddrop_item_8.png', unique = false, useable = true, shouldClose = true, description = 'A crate hauled out of a Merryweather container.' },
['deaddrop_item_9'] = { name = 'deaddrop_item_9', label = 'Dead Drop Item 9 (India)', weight = 100, type = 'item', image = 'deaddrop_item_9.png', unique = false, useable = true, shouldClose = true, description = 'A crate hauled out of a Merryweather container.' },
['deaddrop_item_10'] = { name = 'deaddrop_item_10', label = 'Dead Drop Item 10 (Juliett)', weight = 100, type = 'item', image = 'deaddrop_item_10.png', unique = false, useable = true, shouldClose = true, description = 'A crate hauled out of a Merryweather container.' },
['deaddrop_item_11'] = { name = 'deaddrop_item_11', label = 'Dead Drop Item 11 (Kilo)', weight = 100, type = 'item', image = 'deaddrop_item_11.png', unique = false, useable = true, shouldClose = true, description = 'A crate hauled out of a Merryweather container.' },
['deaddrop_item_12'] = { name = 'deaddrop_item_12', label = 'Dead Drop Item 12 (Lima)', weight = 100, type = 'item', image = 'deaddrop_item_12.png', unique = false, useable = true, shouldClose = true, description = 'A crate hauled out of a Merryweather container.' },
sql
-- Register the items in your ESX `items` table
INSERT INTO `items` (`name`, `label`, `weight`, `rare`, `can_remove`) VALUES
    ('merryweather_tablet', 'Merryweather Tablet',            2000, 0, 1),
    ('deaddrop_usb_1',      'Intrusion USB - Runner Kit',       50, 0, 1),
    ('deaddrop_usb_2',      'Intrusion USB - Breaker Kit',      50, 0, 1),
    ('deaddrop_usb_3',      'Intrusion USB - Decrypt Suite',    50, 0, 1),
    ('deaddrop_usb_4',      'Intrusion USB - Black ICE Suite',  50, 0, 1),
    ('deaddrop_item_1',     'Dead Drop Item 1 (Alpha)',        100, 0, 1),
    ('deaddrop_item_2',     'Dead Drop Item 2 (Bravo)',        100, 0, 1),
    ('deaddrop_item_3',     'Dead Drop Item 3 (Charlie)',      100, 0, 1),
    ('deaddrop_item_4',     'Dead Drop Item 4 (Delta)',        100, 0, 1),
    ('deaddrop_item_5',     'Dead Drop Item 5 (Echo)',         100, 0, 1),
    ('deaddrop_item_6',     'Dead Drop Item 6 (Foxtrot)',      100, 0, 1),
    ('deaddrop_item_7',     'Dead Drop Item 7 (Golf)',         100, 0, 1),
    ('deaddrop_item_8',     'Dead Drop Item 8 (Hotel)',        100, 0, 1),
    ('deaddrop_item_9',     'Dead Drop Item 9 (India)',        100, 0, 1),
    ('deaddrop_item_10',    'Dead Drop Item 10 (Juliett)',     100, 0, 1),
    ('deaddrop_item_11',    'Dead Drop Item 11 (Kilo)',        100, 0, 1),
    ('deaddrop_item_12',    'Dead Drop Item 12 (Lima)',        100, 0, 1);

The crate labels are placeholders

deaddrop_item_1 through deaddrop_item_12 ship with NATO-alphabet placeholder labels. Rename them to whatever suits your server - just keep the item names in sync with Carry.Props in configs/shared/containers.lua and the loot map in configs/server/containers.lua.

ox_inventory features do not apply elsewhere

The client = { export = ... } lines and the buttons block are ox_inventory features. On other inventories, leave them out and simply register the items as usable - the resource registers its own use handlers at boot through the bridge. There is also no USB Storage stash outside ox_inventory; the terminal reads intrusion USBs straight from the player's own inventory instead, so the USB items need no special wiring.

Items the configs assume already exist

The default configs also reference items that are expected to already be on your server: powersaw (the breach tool), lockpick, advancedlockpick, armour, thermite, goldbar and black_money, plus the weapons and ammo in the loot pools. All of them are plain config values - swap any of them for your own items in configs/server/loot.lua, configs/server/containers.lua and configs/server/contact.lua.

3 Grant Admin Access

The admin commands are registered through ox_lib and restricted to group.admin. If your admins are already in that group, there is nothing to do.

To give another group access, add this to your server.cfg:

cfg
add_ace group.mod command.deaddrop_start allow
add_ace group.mod command.deaddrop_stop allow

4 Start the Resource

Start the resource, or restart your server. Database tables are created on first boot, so there is nothing to import by hand.

TIP

There is no automatic scheduler by design. A drop only happens when a crew completes the relay intrusion, or when an admin forces one with /deaddrop_start.

5 Place Your Masts and Drop Zones

A fresh install ships with a working set of both, so the resource is playable immediately. To move them:

  1. Radio-mast spots live in configs/server/trigger.lua as Towers
  2. Container landing spots live in configs/server/world.lua as DropZones, captured in-game with /deaddrop_place
  3. Container interiors live in configs/shared/containers.lua as Layouts, captured in-game with /deaddrop_loadout

Both capture commands print a paste-ready block to the console.

Admin Commands

CommandWhat it does
/deaddrop_start [mode] [zone] [layout]Force a drop now. fast launches the plane immediately, drop skips the flyover, land releases 100 m up, instant lands them on their points, open also forces them open
/deaddrop_testdropDrop one robbable container about 25 m in front of you
/deaddrop_advanceStep the active event to its next phase
/deaddrop_statusPrint the active event's phase and age
/deaddrop_stopAbandon and clean up the active event
/deaddrop_tpcontactTeleport to the fence contact
/deaddrop_rep / /deaddrop_repsetRead or set a player's reputation
/deaddrop_statsRead a player's statistics
/deaddrop_rewardsresetClear claimed level rewards
/deaddrop_cleardefenseClear a relay's defence state
/deaddrop_placeCapture a drop zone at your position
/deaddrop_loadoutCapture a container interior layout

Configuration

Configure the resource to fit your server's needs. See the Configuration page for detailed explanations of each setting, or edit the config files directly in the resource's configs/ folder.

Turn Debug off before going live

configs/config.lua ships with Debug = true, which enables developer logging and draws target zone outlines. Set it to false on a production server.