Cómo funcionan las integraciones#
Safezone Creator llega a tu framework y a tu inventario a través de pequeños archivos puente sin cifrar. Al iniciar mira qué recursos están en ejecución, carga el puente correspondiente e imprime en la consola el framework que eligió.
Capa | Compatibles | Sin él |
|---|---|---|
Framework |
| Obligatorio. El recurso se detiene al iniciar: los trabajos, los rangos, las bandas y la comprobación de administrador vienen de él. |
Inventario |
| Funciona en modo standalone: sin armas que elegir como armas permitidas, y con una advertencia repetida en la consola. La protección, la curación, los límites de velocidad y el control de acceso siguen funcionando. |
Bandas | Bandas de QBCore y Qbox · | El selector de bandas se oculta de Access Control; los trabajos funcionan como siempre. |
HUD |
| Solo se oculta el minimapa mientras el creador está abierto. |
Librería |
| Obligatorio. Cada zona segura es una zona poligonal de ox_lib. |
Base de datos |
| Obligatorio. |
La detección solo ve los recursos que ya están iniciados, así que todo lo anterior debe arrancarse con ensure antes de
qs-safezone-creatorenserver.cfg.
Frameworks#
El framework se elige en config/main.lua a partir de los recursos que encuentra en ejecución. Qbox pasa por el puente de QBCore, sin nada extra que configurar.
local frameworks = {
['es_extended'] = 'esx',
['qb-core'] = 'qb',
['qbx_core'] = 'qb'
}
Config.Framework = DependencyCheck(frameworks) or 'none'Si tu recurso de framework se ha renombrado, pon tu nombre a la izquierda de esa tabla. Para omitir la detección por completo, sustituye la última línea por Config.Framework = 'esx' o 'qb'.
Puente: custom/esx/client.lua y custom/esx/server.lua.
Trabajos y rangos de
ESX.GetJobs(); el trabajo del jugador, de sus datos de jugador, actualizado medianteesx:setJob.Administradores: los grupos
adminysuperadmin.Bandas de
qs-gangscuando está en ejecución — todas las bandas exceptoneutral.
Puente: custom/qb/client.lua y custom/qb/server.lua.
Trabajos de
QBCore.Shared.Jobsy bandas deQBCore.Shared.Gangs; el rango del jugador, dejob.grade.level.Administradores: el permiso
adminogod, o el acecommand.Los cambios de trabajo se detectan en vivo mediante
QBCore:Client:OnJobUpdate.
Inventarios#
El inventario se usa para una sola cosa: la lista de armas permitidas. El creador ofrece todos los ítems cuyo nombre empieza por weapon_, con la etiqueta y la imagen que les da tu inventario. La detección funciona a partir de esta tabla en config/main.lua:
local inventories = {
['qs-inventory'] = 'qs',
['ox_inventory'] = 'ox',
['qb-inventory'] = 'qb',
['tgiann-inventory'] = 'tgiann',
['codem-inventory'] = 'codem',
['origen_inventory'] = 'origen'
}
Config.Inventory = DependencyCheck(inventories) or 'standalone'Cada inventario tiene su propio puente en server/custom/inventory/, que también indica dónde están las imágenes de sus ítems:
Puente | Imágenes leídas de |
|---|---|
|
|
| La convar |
|
|
|
|
|
|
|
|
Si las imágenes del creador aparecen rotas, esa ruta es la que hay que revisar. En QBCore la lista de ítems viene de los ítems compartidos del framework; en ESX, de la lista de ítems de ESX; con ox_inventory y tgiann-inventory, del propio inventario.
Notificaciones y el HUD#
Notificaciones#
Los mensajes de entrada y salida y las confirmaciones del creador se muestran como toasts propios del script, con el estilo del creador. Para usar el sistema de notificaciones de tu servidor, reescribe Notification en custom/client.lua — el archivo incluye ejemplos comentados para qs-interface y ox_lib:
-- custom/client.lua
function Notification(msg, type) -- type: 'info' | 'error' | 'success'
lib.notify({
title = 'Safe Zone',
description = msg,
type = type
})
endLos mensajes enviados por el servidor llegan a través del evento safezone:notification y terminan en la misma función, así que una sola edición cubre ambos lados.
Ocultar el HUD#
Mientras el creador está abierto se oculta el minimapa, y también el HUD de qs-interface cuando está en ejecución; ambos vuelven al cerrar el creador. Cualquier otro HUD va en ToggleHud, en el mismo archivo:
-- custom/client.lua
function ToggleHud(bool)
DisplayRadar(bool)
if GetResourceState('qs-interface') == 'started' then
exports['qs-interface']:ToggleHud(bool)
end
-- add your own HUD here
endLogs de Discord#
Cada zona creada, editada y borrada se publica en Discord como un embed, con el nombre del administrador, su id de servidor y sus identificadores — Steam, Discord, license, Xbox, FiveM y, si lo permites, la IP. Configura el webhook en server/webhooks.lua:
-- server/webhooks.lua
Config.ShowWebhookIP = false -- true shows the admin's IP in the log
_G['webhook'] = {
revive = '',
heal = '',
death = '',
creator = 'https://discord.com/api/webhooks/...' -- zones created, edited and deleted
}Añadir un framework o inventario#
Dar soporte a algo que no está en la lista requiere un puente y una línea de configuración. Nada más del recurso cambia, porque nada más hace referencia a tu framework o inventario por su nombre.
Copia el puente más parecido
Para un framework, copia
custom/qb/ocustom/esx/acustom/<name>/, con ambosclient.luayserver.lua. Para un inventario, copia el archivo más parecido enserver/custom/inventory/.Completa las funciones
Un puente de framework devuelve una tabla de pequeñas funciones — el trabajo y el rango del jugador, la lista de trabajos, las bandas, la comprobación de administrador, el identificador. Un puente de inventario solo necesita
formatItemList, que devuelve todos los ítems con su nombre, etiqueta e imagen:lua if Config.Inventory ~= 'my_inventory' then return end function sv_inventory:formatItemList() local items = {} for name, item in pairs(exports['my_inventory']:Items()) do items[name] = { name = name, label = item.label, image = ('nui://my_inventory/images/%s.png'):format(name) } end return items endRegístralo para la detección
Añade tu recurso a la tabla
frameworksoinventoriesenconfig/main.lua. El valor de la derecha es el nombre de carpeta de un puente de framework, o el nombre que comprueba tu puente de inventario —['my_inventory'] = 'my_inventory'.
Si eso es más de lo que quieres asumir, envíanos el nombre del recurso.
Idiomas#
Se incluyen diecinueve traducciones en locales/: árabe (ar), búlgaro (bg), danés (da), alemán (de), inglés (en), español (es), persa (fa), francés (fr), hindi (hi), húngaro (hu), italiano (it), japonés (ja), coreano (ko), neerlandés (nl), portugués (pt), rumano (ro), ruso (ru), turco (tr) y chino simplificado (zh-CN). Configura Config.Locale en config/main.lua; el creador, las notificaciones y los logs de Discord lo siguen.
Para añadir otra, copia en.json al nuevo código, tradúcelo y configura el locale con ese código. Cualquier texto que falte en una traducción recurre al inglés, y unos segundos después del inicio la consola nombra cada clave que falta para que puedas añadirla.



