How Integrations Work#
Digital Den Shops contains no scripts. It places buildings, doors and collisions; everything players do inside — buying a phone, clocking in, locking up for the night — comes from the resources you already run. That is what keeps it compatible with all of them:
Layer | Works with | Use it for |
|---|---|---|
Framework | ESX · QBCore · Qbox · standalone | Nothing to set — the map never talks to the framework. |
Shops | ox_inventory · qb-shops · any shop script | Selling phones, radios and electronics in each store. |
Door locks | ox_doorlock · qb-doorlock · any script that locks by model and position | Locking the front and staff doors to a job. |
Target | ox_target · qb-target | Optional — interact with a shopkeeper or the counter instead of a marker. |
Phone | Any phone resource sold as an item | The item your shop sells — usually |
Every snippet on this page goes into a resource you own — your shop, door lock or job script. Nothing inside
qs_digitaldenis edited. Coordinates and headings come from the Map Guide.
Blips#
The map adds no blips, so the stores stay unmarked until you mark them. If your shop script already draws a blip per location (ox_inventory and qb-shops both can), skip this. Otherwise paste it into a client file of any resource you own:
local stores = {
vec3(-1529.56, -403.34, 36.90), -- Del Perro
vec3(-662.68, -879.52, 25.92), -- Little Seoul
vec3(155.21, 244.49, 108.33), -- Vinewood
vec3(238.52, -1487.59, 30.56), -- Strawberry
vec3(386.69, -825.55, 30.58), -- Downtown
}
CreateThread(function()
for _, coords in ipairs(stores) do
local blip = AddBlipForCoord(coords.x, coords.y, coords.z)
SetBlipSprite(blip, 521)
SetBlipColour(blip, 3)
SetBlipScale(blip, 0.8)
SetBlipAsShortRange(blip, true)
BeginTextCommandSetBlipName('STRING')
AddTextComponentSubstringPlayerName('Digital Den')
EndTextCommandSetBlipName(blip)
end
end)Any sprite and colour from the FiveM reference works:
Cfx.re DocsBlips — Cfx.re DocsEvery blip sprite and colour available in GTA V, with its id.Selling Phones and Electronics#
The quickest way to bring the stores to life is a shop in each one. The coordinates below are the centre of the sales floor at standing height; move them onto the counter if you prefer a fixed till.
Add an entry to ox_inventory/data/shops.lua, inside the table it returns. The blip line marks all five stores on the map for you.
DigitalDen = {
name = 'Digital Den',
blip = { id = 521, colour = 3, scale = 0.8 },
inventory = {
{ name = 'phone', price = 900 },
{ name = 'radio', price = 250 },
},
locations = {
vec3(-1529.56, -403.34, 35.81), -- Del Perro
vec3(-662.68, -879.52, 24.80), -- Little Seoul
vec3(155.21, 244.49, 107.20), -- Vinewood
vec3(238.52, -1487.59, 29.44), -- Strawberry
vec3(386.69, -825.55, 29.44), -- Downtown
},
},Add an entry per store to Config.Locations in qb-shops/config.lua. The heading turns the shopkeeper to face the entrance.
['digitalden_delperro'] = {
['label'] = 'Digital Den',
['coords'] = vector4(-1529.56, -403.34, 35.81, 230.0),
['ped'] = 'mp_m_shopkeep_01',
['scenario'] = 'WORLD_HUMAN_STAND_MOBILE',
['radius'] = 1.5,
['targetIcon'] = 'fas fa-mobile-alt',
['targetLabel'] = 'Open Digital Den',
['products'] = Config.Products['normal'], -- swap for your own electronics list
['showblip'] = true,
['blipsprite'] = 521,
['blipscale'] = 0.8,
['blipcolor'] = 3,
},
-- Repeat for the other four stores:
-- digitalden_littleseoul vector4(-662.68, -879.52, 24.80, 270.0)
-- digitalden_vinewood vector4(155.21, 244.49, 107.20, 160.0)
-- digitalden_strawberry vector4(238.52, -1487.59, 29.44, 222.9)
-- digitalden_downtown vector4(386.69, -825.55, 29.44, 270.0)Locking the Doors#
The front double door and the staff door of every store can be locked to a job. The front uses qs_digital_den_ext_door for both leaves; the staff door is qs_digital_den_int_door.
ox_doorlock picks doors in game, so there is nothing to paste:
Stand inside the store
The doors only exist within 200 m of a player, so go to the store you are setting up first.
Create the front door
Run
/doorlockas an admin and create a new door. Turn on the double-door option, select both glass leaves, and give it the groups (jobs) that may open it.Create the staff door
Create a second, single door and select the door at the back of the sales floor.
Repeat for each store
Five stores, two entries each. ox_doorlock saves them in its database, so this is done once.
Create qb-doorlock/configs/digitalden.lua and paste the block below. It registers all ten doors — the front entrance and the staff door of each store — for the digitalden job. Change jobs to whoever should hold the keys, then restart qb-doorlock.
local jobs = { ['digitalden'] = 0 } -- job name = minimum grade
local stores = {
delperro = {
front = { { vec3(-1523.292, -407.124, 35.809), 49.6 }, { vec3(-1524.723, -408.809, 35.809), 229.6 } },
staff = { vec3(-1529.243, -397.907, 35.798), 50.0 },
},
littleseoul = {
front = { { vec3(-655.465, -878.384, 24.799), 90.0 }, { vec3(-655.465, -880.597, 24.799), 270.0 } },
staff = { vec3(-665.940, -875.155, 24.815), 90.0 },
},
vinewood = {
front = { { vec3(153.821, 237.354, 107.204), 340.0 }, { vec3(151.742, 238.111, 107.204), 160.0 } },
staff = { vec3(160.428, 246.054, 107.222), 340.0 },
},
strawberry = {
front = { { vec3(244.261, -1492.111, 29.439), 42.9 }, { vec3(242.636, -1493.619, 29.439), 222.9 } },
staff = { vec3(239.500, -1482.237, 29.459), 42.9 },
},
downtown = {
front = { { vec3(393.914, -826.637, 29.439), 270.0 }, { vec3(393.914, -824.423, 29.439), 90.0 } },
staff = { vec3(383.437, -821.185, 29.481), 90.0 },
},
}
for name, store in pairs(stores) do
Config.DoorList['digitalden_' .. name .. '_front'] = {
doorType = 'double',
doors = {
{ objName = `qs_digital_den_ext_door`, objCoords = store.front[1][1], objYaw = store.front[1][2] },
{ objName = `qs_digital_den_ext_door`, objCoords = store.front[2][1], objYaw = store.front[2][2] },
},
authorizedJobs = jobs,
locked = false,
distance = 2.5,
doorRate = 1.0,
}
Config.DoorList['digitalden_' .. name .. '_staff'] = {
doorType = 'door',
objName = `qs_digital_den_int_door`,
objCoords = store.staff[1],
objYaw = store.staff[2],
authorizedJobs = jobs,
locked = true,
distance = 2.0,
doorRate = 1.0,
}
endThe front doors start unlocked so customers can walk in during opening hours; the staff door starts locked.
Is the Player Inside a Store?#
For a repair job, a robbery or anything that should only work inside a Digital Den, compare the interior the player stands in with the five stores. Client side:
local stores = {
vec3(-1529.56, -403.34, 36.90), -- 1 Del Perro
vec3(-662.68, -879.52, 25.92), -- 2 Little Seoul
vec3(155.21, 244.49, 108.33), -- 3 Vinewood
vec3(238.52, -1487.59, 30.56), -- 4 Strawberry
vec3(386.69, -825.55, 30.58), -- 5 Downtown
}
local function IsInsideDigitalDen(ped)
local interior = GetInteriorFromEntity(ped or PlayerPedId())
if interior == 0 then return false end
for index, coords in ipairs(stores) do
if GetInteriorAtCoordsWithType(coords.x, coords.y, coords.z, 'qs_digitalden') == interior then
return true, index
end
end
return false
endIt returns true and the store's number — 1 for Del Perro through 5 for Downtown, the same order as the Map Guide.



