Cómo funcionan las integraciones#
Tutorial Creator pide muy poco al resto de tu servidor: quién es el jugador, si puede abrir el creador y cómo mostrarle un mensaje. Todo ello vive en la carpeta abierta custom/, así que se puede cambiar sin tocar el recurso.
Capa | Compatibles | Sin ella |
|---|---|---|
Framework |
| El progreso se guarda con la licencia, el creador es solo por ace, y el texto ligado al jugador (trabajo, nombre del personaje) queda vacío. |
Base de datos |
| Los tutoriales incluidos se siguen reproduciendo, pero no se puede guardar nada y todos lo ven en cada spawn. |
Notificaciones |
| Los mensajes se muestran en el chat. |
Pantallas de personaje y spawn |
| El inicio automático espera a que el framework indique que el jugador ha cargado. |
HUD | Cualquiera, mediante | Solo se oculta el radar. |
Nada necesita ox_lib. Los adaptadores son archivos Lua planos que se leen al iniciar, por eso
custom/sigue siendo legible en la build con escrow y se puede editar libremente.
La capa de framework#
Config.Framework es 'auto' por defecto y elige el primer framework en ejecución. Ponlo en 'qs', 'esx' o 'qb' (QBCore y Qbox lo comparten) para fijar uno, o en 'standalone' para desactivar la capa. Con 'auto', un framework que aún no estaba en ejecución cuando se inició el recurso se vuelve a detectar unos segundos después y se activa.
custom/
├── client.lua -- picks the adapter, owns Notify()
├── server.lua -- picks the adapter, owns the admin group check
├── esx/{client,server}.lua
├── qb/{client,server}.lua -- QBCore and Qbox
├── qs/{client,server}.lua
└── standalone/{client,server}.luaCada adaptador es una tabla simple de métodos que se devuelve a sí misma:
Lado | Método | Responde |
|---|---|---|
Cliente |
| ¿El personaje está cargado y en el mundo? El inicio automático espera a esto. |
Cliente |
| Nombre del personaje, trabajo, grado, efectivo, banco, citizen id, teléfono, fecha de nacimiento, sexo — para los elementos de texto. |
Cliente |
| El objeto del core y los datos brutos del jugador. |
Servidor |
| Con qué se guarda el progreso. Devuelve |
Servidor |
| Si el jugador está en uno de |
Servidor |
| El objeto del core y un jugador por id de servidor. |
Añadir un framework#
Copia el adaptador más parecido
Duplica
custom/qb/(o el más parecido) en una carpeta nueva, por ejemplocustom/myfw/.Responde los métodos
Cambia cada método para que llame a tu framework. Mantén todos los métodos — devuelve
nildonde no tengas nada — y mantén elreturn frameworkal final.Fíjalo
lua Config.Framework = 'myfw'La detección automática solo conoce los cuatro frameworks incluidos, así que uno nuevo debe indicarse por nombre. Reinicia y busca
framework loaded: myfwen la consola.
Notificaciones#
Mensajes como "Your tutorial progress was reset" pasan por Notify() en custom/client.lua: qs-interface si está en ejecución, luego ox_lib y luego el chat. Para usar otro recurso de notificaciones, ponlo primero:
-- custom/client.lua
function Notify(message, kind)
if not message or message == '' then return end
if GetResourceState('okokNotify') == 'started' then
exports['okokNotify']:Alert('Tutorial', message, 5000, kind == 'error' and 'error' or 'info')
return
end
-- ...the existing fallbacks
endOcultar tu HUD#
Config.Hud contiene dos funciones: Disable se ejecuta al empezar el tutorial y Enable al terminar — también tras reiniciar el recurso, así que nadie se queda sin HUD. De serie solo activan y desactivan el radar; engancha aquí tu propio HUD:
-- shared/config.lua
Config.Hud = {
Enable = function()
DisplayRadar(true)
exports['qs-interface']:ToggleHud(true)
end,
Disable = function()
DisplayRadar(false)
exports['qs-interface']:ToggleHud(false)
end,
}Ambas se llaman dentro de una llamada protegida, así que un export que no existe en tu servidor no puede romper el tutorial.
Pantallas de personaje y spawn#
Con Config.Tutorial.autoStart activado, el tutorial espera a la sesión, luego al framework, luego a que se cierren las pantallas de personaje y spawn, y luego autoStartDelay — y reproduce el tutorial activo si este personaje no lo ha visto.
Automático. Se escuchan los eventos estándar qb-multicharacter, qb-multichar, qb-spawn y qbx_spawn, así que el tutorial queda en espera mientras el selector de personaje o de spawn está en pantalla y se ejecuta después de que el jugador elija una ubicación. Cerrar sesión hacia la pantalla de personajes lo vuelve a poner en espera.
Automático: el inicio automático espera hasta que es_extended indica que el jugador ha cargado. Los multipersonaje como qs-multicharacter también pueden iniciarlo ellos mismos con StartTutorial — consulta más abajo.
Para un fork que no lanza los eventos habituales, indica al tutorial cuándo están abiertas esas pantallas:
-- when the character or spawn UI opens
exports['qs-tutorial']:SetSpawnBusy(true)
-- after they have spawned into the world
exports['qs-tutorial']:SetSpawnBusy(false)Iniciarlo desde tu script de spawn#
Para iniciarlo tú mismo — el patrón que usa qs-multicharacter — pon esto al final de la función de spawn, por ejemplo PostSpawnPlayer y la ruta de éxito del apartamento en qb-spawn:
if GetResourceState('qs-tutorial') == 'started' then
exports['qs-tutorial']:SetSpawnBusy(false)
if exports['qs-tutorial']:ShouldPlay() then
exports['qs-tutorial']:StartTutorial()
end
endStartTutorial bloquea hasta que termina el tutorial y devuelve si se completó. Devuelve false de inmediato para un personaje que ya lo ha visto, así que es seguro llamarlo en cada spawn. Si una pantalla de spawn debe abrirse después del tutorial, espéralo primero:
if GetResourceState('qs-tutorial') == 'started' then
exports['qs-tutorial']:AwaitIdle()
endDatos del servidor en los elementos de texto#
Los elementos de texto ligados al nombre del servidor, Discord o sitio web leen Config.Server. Deja name vacío para usar sv_hostname en su lugar.
Config.Server = {
name = 'Quasar Roleplay',
discord = 'discord.gg/quasar-store',
website = 'quasar-store.com',
}Idiomas#
Se incluyen 41 idiomas en locales/: ar, bg, bn, ca, cs, da, de, el, en, es, et, fa, fi, fr, he, hi, hr, hu, id, it, ja, ko, lt, lv, ms, nl, no, pl, pt, ro, ru, sk, sl, sv, sw, th, tr, uk, ur, vi, zh. Configura Config.Language y listo.
Inglés y español están completos. Los otros 39 cubren lo que la gente realmente lee — cada notificación, la navegación del creador, la checklist, la pantalla de inicio, los nombres de los elementos y los selectores multimedia — mientras que las etiquetas más profundas del inspector se quedan en inglés. Una clave que falta en un idioma recurre al inglés en lugar de mostrar la clave, y cualquier clave que rellenes se usa a partir del siguiente reinicio del recurso.
Un idioma nuevo es un archivo JSON más en la misma carpeta: copia en.json, traduce los valores y pon Config.Language con su nombre de archivo.



