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.
| Framework | Status |
|---|---|
qbx_core (Qbox) | Supported |
qb-core (QBCore) | Supported |
es_extended (ESX) | Supported |
Supported Inventories
The inventory bridge is detected automatically.
| Inventory | Status |
|---|---|
ox_inventory | Supported - full feature set |
qb-inventory | Supported |
qs-inventory | Supported |
qs-inventory-pro | Supported |
ps-inventory | Supported |
lj-inventory | Supported |
origen_inventory | Supported |
codem-inventory | Supported |
jaksam_inventory | Supported |
tgiann-inventory | Supported |
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 System | Status |
|---|---|
ox_target | Supported |
qb-target | Supported |
qtarget | Supported |
Dependencies
Ensure the following dependencies are installed and running on your server before starting:
| Dependency | Required | Notes |
|---|---|---|
| Framework | Yes | qbx_core / qb-core / es_extended |
| ox_lib | Yes | Commands, progress bars, notifications, audit logger |
| oxmysql | Yes | Reputation, statistics and subscriptions |
| Inventory | Yes | Any of the supported inventories listed above |
| Target System | Yes | ox_target / qb-target / qtarget |
| Dispatch | Optional | Bridged 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
- Download the latest version of
sd-deaddropfrom the CFX Portal - Extract it into your server's
resourcesdirectory - Ensure the resource is started in your
server.cfg(orresources.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:
ensure ox_lib
ensure oxmysql
ensure qbx_core
ensure ox_inventory
ensure sd-deaddrop2 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.
| Item | Purpose |
|---|---|
merryweather_tablet | The hacking rig - opens the intrusion terminal |
deaddrop_usb_1 | Runner Kit - net-maze.exe, cipher-lock.exe |
deaddrop_usb_2 | Breaker Kit - node-grab.exe, code-inject.exe |
deaddrop_usb_3 | Decrypt Suite - highway-evade.exe, sig-replay.exe, pipe-route.exe |
deaddrop_usb_4 | Black ICE Suite - data-worm.exe, fw-defense.exe, ice-break.exe |
deaddrop_item_1 to deaddrop_item_12 | The haulable container loot |
Item Definitions
['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' },
},['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.' },-- 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:
add_ace group.mod command.deaddrop_start allow
add_ace group.mod command.deaddrop_stop allow4 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:
- Radio-mast spots live in
configs/server/trigger.luaasTowers - Container landing spots live in
configs/server/world.luaasDropZones, captured in-game with/deaddrop_place - Container interiors live in
configs/shared/containers.luaasLayouts, captured in-game with/deaddrop_loadout
Both capture commands print a paste-ready block to the console.
Admin Commands
| Command | What 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_testdrop | Drop one robbable container about 25 m in front of you |
/deaddrop_advance | Step the active event to its next phase |
/deaddrop_status | Print the active event's phase and age |
/deaddrop_stop | Abandon and clean up the active event |
/deaddrop_tpcontact | Teleport to the fence contact |
/deaddrop_rep / /deaddrop_repset | Read or set a player's reputation |
/deaddrop_stats | Read a player's statistics |
/deaddrop_rewardsreset | Clear claimed level rewards |
/deaddrop_cleardefense | Clear a relay's defence state |
/deaddrop_place | Capture a drop zone at your position |
/deaddrop_loadout | Capture 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.
