Cómo funcionan las integraciones#
Digital Den Shops no contiene scripts. Coloca edificios, puertas y colisiones; todo lo que los jugadores hacen dentro — comprar un teléfono, fichar, cerrar por la noche — viene de los recursos que ya usas. Eso es lo que lo mantiene compatible con todos ellos:
Capa | Funciona con | Úsalo para |
|---|---|---|
Framework | ESX · QBCore · Qbox · standalone | Nada que configurar — el mapa nunca se comunica con el framework. |
Tiendas | ox_inventory · qb-shops · cualquier script de tiendas | Vender teléfonos, radios y electrónica en cada tienda. |
Cerraduras de puertas | ox_doorlock · qb-doorlock · cualquier script que cierre por modelo y posición | Cerrar las puertas delanteras y del personal para un trabajo. |
Target | ox_target · qb-target | Opcional — interactúa con un dependiente o con el mostrador en lugar de un marcador. |
Teléfono | Cualquier recurso de teléfono vendido como ítem | El ítem que vende tu tienda — normalmente |
Cada fragmento de esta página va en un recurso tuyo — tu script de tienda, de cerraduras o de trabajo. No se edita nada dentro de
qs_digitalden. Las coordenadas y orientaciones vienen de la Guía del mapa.
Blips#
El mapa no añade blips, así que las tiendas quedan sin marcar hasta que las marques. Si tu script de tiendas ya dibuja un blip por ubicación (tanto ox_inventory como qb-shops pueden), omite esto. Si no, pégalo en un archivo de cliente de cualquier recurso tuyo:
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)Sirve cualquier sprite y color de la referencia de FiveM:
Cfx.re DocsBlips — Cfx.re DocsEvery blip sprite and colour available in GTA V, with its id.Vender teléfonos y electrónica#
La forma más rápida de dar vida a las tiendas es poner una tienda en cada una. Las coordenadas de abajo son el centro de la zona de ventas a la altura de una persona de pie; muévelas al mostrador si prefieres una caja fija.
Añade una entrada a ox_inventory/data/shops.lua, dentro de la tabla que devuelve. La línea blip marca por ti las cinco tiendas en el mapa.
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
},
},Añade una entrada por tienda a Config.Locations en qb-shops/config.lua. La orientación gira al dependiente hacia la entrada.
['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)Cerrar las puertas#
La puerta doble delantera y la puerta del personal de cada tienda pueden cerrarse para un trabajo. La delantera usa qs_digital_den_ext_door para ambas hojas; la puerta del personal es qs_digital_den_int_door.
ox_doorlock selecciona las puertas en el juego, así que no hay nada que pegar:
Colócate dentro de la tienda
Las puertas solo existen a menos de 200 m de un jugador, así que ve primero a la tienda que estás configurando.
Crea la puerta delantera
Ejecuta
/doorlockcomo administrador y crea una puerta nueva. Activa la opción de puerta doble, selecciona ambas hojas de cristal y asígnale los grupos (trabajos) que pueden abrirla.Crea la puerta del personal
Crea una segunda puerta simple y selecciona la puerta del fondo de la zona de ventas.
Repite para cada tienda
Cinco tiendas, dos entradas cada una. ox_doorlock las guarda en su base de datos, así que esto se hace una sola vez.
Crea qb-doorlock/configs/digitalden.lua y pega el bloque de abajo. Registra las diez puertas — la entrada delantera y la puerta del personal de cada tienda — para el trabajo digitalden. Cambia jobs por quien deba tener las llaves y luego reinicia 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,
}
endLas puertas delanteras empiezan abiertas para que los clientes puedan entrar en horario de apertura; la puerta del personal empieza cerrada.
¿Está el jugador dentro de una tienda?#
Para un trabajo de reparación, un robo o cualquier cosa que solo deba funcionar dentro de una Digital Den, compara el interior en el que está el jugador con las cinco tiendas. En el cliente:
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
endDevuelve true y el número de la tienda — 1 para Del Perro hasta 5 para Downtown, en el mismo orden que la Guía del mapa.



