Cómo funcionan las integraciones#
El menú en sí no necesita nada más que el juego. Todo lo demás se alcanza a través de una capa pequeña y abierta en custom/, que se detecta al arrancar, y la consola indica lo que eligió. Al framework solo se le preguntan dos cosas: qué poner en la tarjeta del jugador y si alguien puede abrir el creador.
Capa | Compatible | Sin ella |
|---|---|---|
Framework |
| Standalone: la tarjeta del jugador mantiene el nombre de FiveM, la salud, la armadura y la ubicación, y las filas de dinero, trabajo e identidad se ocultan. El creador se abre solo mediante ACE, y los lugares guardados se asocian a la licencia de Rockstar. |
Base de datos |
| El menú se abre y muestra los temas incluidos; no se puede guardar nada. |
Notificaciones |
| Los mensajes van al chat. |
Estado (ESX) |
| El hambre, la sed y el estrés se ocultan en ESX. QBCore y Qbox los leen de los metadatos del jugador. |
Nombres de blips | El hook de blips · el export | La leyenda recurre a |
qs-smartphone | La app Maps | No hay nada que conectar: ambos usan el mismo atlas y calibración de Rockstar, y ambos usan el punto de ruta propio de GTA, así que el móvil y el menú siempre coinciden. |
Cada integración opcional se degrada sin hacer ruido. Un recurso que falta hace que su parte se retire en lugar de dar error; por eso importan las líneas
framework loadedystorage driverde la consola. Son el único lugar que te avisa de que falta algo antes de que lo haga un jugador.
Frameworks#
Config.Framework vale 'auto' por defecto y busca qs-core, es_extended, qbx_core y qb-core, en ese orden. Configúralo para fijar uno, o en 'standalone' para desactivar la capa:
Config.Framework = 'auto' -- 'auto' | 'qs' | 'esx' | 'qb' | 'standalone'Qbox y QBCore comparten el adaptador 'qb', que habla con cualquiera de los dos que esté en ejecución. Con 'auto', un framework que aún no estaba en ejecución cuando arrancó el recurso se vuelve a buscar unos segundos después y se activa, así que una carrera en el orden de arranque no deja una sesión con el adaptador standalone.
Qué se lee de cada framework#
Campo | ESX · qs-core | QBCore · Qbox |
|---|---|---|
Nombre |
|
|
Trabajo · rango |
|
|
Efectivo · banco · dinero negro |
|
|
Identidad | identificador, número de teléfono, fecha de nacimiento, sexo, altura | citizen id, teléfono, fecha de nacimiento, género |
Hambre · sed · estrés |
| Los metadatos del jugador |
Lugares guardados asociados a | El identificador del jugador | El citizen id |
Grupos del creador | El grupo del jugador ( | Los permisos del framework ( |
Añadir tu propio framework#
Cada adaptador es una tabla simple de métodos que se devuelve a sí misma, así que añadir un framework consiste en copiar una carpeta de custom/, renombrarla y poner en Config.Framework el nombre de la carpeta.
custom/
├── client.lua -- picks the adapter, and owns Notify()
├── server.lua -- picks the adapter, and owns the creator's group check
├── blip_hook.lua -- included by your other resources
├── esx/{client,server}.lua
├── qb/{client,server}.lua -- QBCore and Qbox
├── qs/{client,server}.lua
└── standalone/{client,server}.luaLado | Métodos que debe responder |
|---|---|
Cliente |
|
Servidor |
|
getPlayer devuelve la única estructura que entiende el menú:
function framework:getPlayer()
return {
name = 'John Doe',
job = 'Police', grade = 'Sergeant',
cash = 1500, bank = 42000, black = nil,
citizenId = 'ABC12345', phone = '555-0101',
dob = '1990-01-01', sex = 'm', height = 180,
hunger = 80, thirst = 65, stress = 10,
}
endDeja como
nilcualquier campo que no puedas rellenar, en lugar de cero. Eso es lo que hace que un módulo oculte la fila en lugar de mostrar con total seguridad$0.getIdentifierdecide a quién pertenece un lugar guardado: devuelve el id del personaje, no el de la cuenta, si los lugares deben seguir a los personajes.
El driver de base de datos#
Config.Database.driver fija un driver; 'auto' usa oxmysql si está en ejecución y, si no, mysql-async. Los nombres de las tablas se pueden cambiar en el mismo bloque, algo útil cuando dos servidores comparten una base de datos.
Config.Database = {
driver = 'auto', -- 'auto' | 'oxmysql' | 'mysql-async'
themesTable = 'qs_pausemenu_themes',
settingsTable = 'qs_pausemenu_settings',
blipsTable = 'qs_pausemenu_blips',
}Notificaciones#
Los pocos mensajes que muestra el recurso (sin permiso, se marcó el punto de ruta, el menú aún se está cargando) pasan por Notify() en custom/client.lua. Usa qs-interface cuando está en ejecución, ox_lib si no, y el chat como último recurso. Para usar otro recurso de notificaciones, cambia esa única función:
-- custom/client.lua
function Notify(message, kind)
if not message or message == '' then return end
-- kind is 'error' or nil
exports['okokNotify']:Alert('Pause Menu', message, 5000, kind == 'error' and 'error' or 'info')
endNombres de blips desde tus recursos#
GTA permite a un script poner nombre a un blip, pero nunca leerlo después. Con Config.Menu.readBlipNames activado, el recurso lee los nombres del juego de uno en uno, lo que cubre la mayoría de servidores sin hacer nada. Para los blips que no puede leer, o para desactivar la lectura por completo, tus recursos pueden entregar sus nombres directamente.
Añade una línea al fxmanifest.lua de cada recurso que cree blips, antes de sus propios scripts de cliente. Cada nombre que ponga ese recurso se recoge en directo; no cambia nada más en él.
client_script '@qs-pausemenu/custom/blip_hook.lua'
client_scripts {
'client/main.lua',
}Captura las formas habituales de nombrar un blip (BeginTextCommandSetBlipName con una cadena o una etiqueta de texto, y SetBlipNameFromTextFile), olvida un blip cuando se elimina y vuelve a entregar todos los nombres activos si qs-pausemenu se reinicia. Solo funciona en recursos Lua.
Llámalo tú mismo justo después de crear el blip, desde Lua, JavaScript o C#:
local blip = AddBlipForCoord(215.8, -810.1, 30.7)
SetBlipSprite(blip, 357)
BeginTextCommandSetBlipName('STRING')
AddTextComponentSubstringPlayerName('Central Garage')
EndTextCommandSetBlipName(blip)
exports['qs-pausemenu']:SetBlipName(blip, 'Central Garage')Los códigos de color como ~r~ o ^1 se eliminan. Pasa false como nombre para olvidarlo.
Para los blips que no puedes tocar, nómbralos por su id de sprite en shared/config.lua. Es el último recurso antes del nombre del propio icono.
Config.BlipNames = {
[357] = 'Garage',
[71] = 'Barber',
[73] = 'Clothing Store',
}Guardar a un jugador antes de que salga#
Por defecto, el botón Leave the server desconecta al jugador con Config.Actions.disconnectReason. Si tu servidor necesita guardar algo antes, cámbialo a un evento y gestiona tú la salida:
-- shared/config.lua
Config.Actions.disconnect = 'event'
Config.Actions.disconnectEvent = 'qs-pausemenu:client:disconnect'-- In one of your client scripts
AddEventHandler('qs-pausemenu:client:disconnect', function()
TriggerServerEvent('myserver:saveAndDrop')
end)
-- In one of your server scripts
RegisterNetEvent('myserver:saveAndDrop', function()
local src = source
-- save the character here
DropPlayer(src, 'See you soon!')
end)El evento es un evento de cliente, disparado en el jugador que pulsó el botón. Un script de cliente no puede ejecutar quit por sí mismo, así que la desconexión real tiene que venir del servidor, como arriba.



