Comandos#
Tutorial Creator registra tres comandos en el juego, dos de los cuales también funcionan desde la consola del servidor con un id de jugador. Todos los nombres se pueden cambiar en shared/config.lua.
Comando | Dónde | Descripción |
|---|---|---|
| En el juego | Reproduce el tutorial activo ahora, lo hayas visto o no. Si lo escribes de nuevo mientras se reproduce, lo detiene. |
| En el juego | Olvida todos los tutoriales que has visto, así que el próximo spawn lo vuelve a reproducir. |
| En el juego · staff | Abre el creador, o lo cierra si está abierto. |
| Consola | Reproduce un tutorial para ese jugador — el activo si no se indica id de tutorial — lo haya visto o no. |
| Consola | Olvida el progreso de ese jugador en un tutorial, o en todos, y se lo comunica. |
<id> es el id de servidor del jugador. El id del tutorial se muestra en el creador en Settings → Tutorial id y en el panel </>; los incluidos son welcome, spotlight, skyline, anthem, broadcast, noir, neon y dispatch.
custom/client.luatambién incluye/tutorialbroadcastcomo ejemplo de un comando ligado a un tutorial: reproduce Broadcast solo si el jugador aún no lo ha visto. Cópialo para el tuyo o elimínalo.
Exports de cliente#
Para iniciar el tutorial desde tus propios scripts — un multipersonaje, un selector de spawn, un trabajo, un NPC en el aeropuerto. Cuando un id es opcional, omitirlo significa el tutorial activo. El panel </> del creador muestra cada línea de abajo con el id del tutorial actual ya rellenado.
Iniciar y detener
-- Blocks until it ends and returns true if it was completed.
-- Returns false at once if this character has already watched it.
local completed = exports['qs-tutorial']:StartTutorial(id)
-- The same, but plays even if they have watched it.
local completed = exports['qs-tutorial']:ForceTutorial(id)
exports['qs-tutorial']:StopTutorial() -- ends it without counting it as watched
exports['qs-tutorial']:IsPlaying() -- true while it is on screenStartTutorial vuelve a leer primero el progreso del personaje, así que es seguro llamarlo después de cada spawn y cada cambio de personaje.
Progreso
exports['qs-tutorial']:ShouldPlay(id) -- true if this character still needs to watch it
exports['qs-tutorial']:HasCompleted(id) -- true if they finished it
exports['qs-tutorial']:GetProgress() -- { [tutorialId] = { step = 3, completed = false }, ... }Spawn y multipersonaje
exports['qs-tutorial']:SetSpawnBusy(true) -- a character or spawn screen opened; auto-start waits
exports['qs-tutorial']:SetSpawnBusy(false) -- they picked a location; auto-start may run
exports['qs-tutorial']:IsSpawnBusy()
exports['qs-tutorial']:AwaitIdle() -- blocks while the tutorial is on screenConsulta Integraciones → Pantallas de personaje y spawn para saber dónde va cada llamada.
El creador
exports['qs-tutorial']:OpenCreator() -- same as /tutorialcreator, permission includedExports de servidor#
Para un script de servidor que decide quién ve qué — una contratación, un panel de administración, una recompensa de bienvenida.
El tutorial activo
exports['qs-tutorial']:GetActiveTutorial() -- the live tutorial's id, or nil
exports['qs-tutorial']:GetTutorials() -- every tutorial, bundled and saved, sorted by name
exports['qs-tutorial']:SetActiveTutorial(id) -- make it live for everyone; true on successSetActiveTutorial no comprueba que el id exista — pasa uno de GetTutorials.
Reproducirlo para un jugador
-- Always plays it. Does not block.
exports['qs-tutorial']:StartTutorial(source, id)
-- Plays it only if they have not watched it: the false at the end respects progress.
TriggerClientEvent('qs-tutorial:client:start', source, id, false)Progreso
exports['qs-tutorial']:HasCompleted(source, id) -- read from the database
exports['qs-tutorial']:GetProgress(source) -- { [tutorialId] = { step, completed } }
exports['qs-tutorial']:ResetProgress(source, id) -- leave id out to forget every tutorialEventos#
Evento | Lado | Se lanza |
|---|---|---|
| Cliente | Cuando se abre un tutorial. |
| Cliente | Cuando se cierra; |
| Servidor | Cada vez que un jugador termina o salta un tutorial, después de guardar la finalización — repeticiones incluidas, así que lleva tu propio registro antes de entregar una recompensa única. |
| Cliente, lo envías tú | Inicia un tutorial. |
Client event on enter | Cliente | El nombre de tu propio evento, configurado por paso en Flow. |
Client event when it ends | Cliente | El nombre de tu propio evento, configurado en la pestaña Settings. Solo cuando el tutorial se completa. |
Ejemplos#
Instruye a un nuevo agente con Dispatch#
Dispatch está pensado para lanzarse desde un script de trabajo. Llama a esto en el servidor allí donde tu script de trabajo contrate a alguien en la policía:
TriggerClientEvent('qs-tutorial:client:start', source, 'dispatch', true)Un kit inicial después del recorrido#
-- server
local rewarded = {}
AddEventHandler('qs-tutorial:server:completed', function(src, id)
if id ~= 'welcome' or rewarded[src] then return end
rewarded[src] = true
-- give the starter money or items with your framework here
end)Para una recompensa que deba sobrevivir a los reinicios, lleva tu propio registro en la base de datos: el evento también se lanza cuando un jugador repite el tutorial con /tutorial.



