Before You Begin#
Before installing Tutorial Creator, make sure your server meets the minimum requirements. Only a database resource is mandatory; everything else is optional and detected on its own.
Requirement | Status | Notes |
|---|---|---|
oxmysql or mysql-async | Required | Stores the tutorials you make and who has already watched them. The tables create themselves. |
Framework | Optional | QBCore, Qbox, ESX or qs-core — auto-detected. Standalone works on ace permissions and the player's licence. |
Notifications | Optional |
|
Character & spawn screens | Optional |
|
Each layer is looked for in this order, and the first one found running wins:
Layer | Detection order |
|---|---|
Framework |
|
Database |
|
Notifications |
|
Nothing here needs ox_lib. Every framework-specific line lives in the open custom/ folder, so a missing integration only means that part runs standalone.
Downloading Tutorial Creator#
After purchasing Tutorial Creator, the resource is automatically linked to your CFX Portal account.
Sign in to the CFX Portal using the same account used during checkout, open Granted Assets, and download Tutorial Creator.
After extracting the download, you should have the following folder:
qs-tutorial/
├── shared/config.lua -- the config
├── custom/ -- framework layer and notifications (yours to edit)
├── presets/ -- the eight bundled tutorials, as JSON
├── locales/ -- 41 translations
├── images/ -- portraits, logos, slides
├── videos/ -- WebM clips
├── audio/ -- music and sound
├── database/sql.sql -- the schema, if you prefer to import it by hand
└── client/ server/ web/ -- the resource itselfKeep the folder named
qs-tutorial. Every export and event your other scripts call is written asexports['qs-tutorial']andqs-tutorial:…, and multicharacter scripts look for that exact name.
Installing the Resource#
Move the qs-tutorial folder into your server's resources directory. It can live anywhere inside it, including a category folder:
resources/
└── [qs]/
└── qs-tutorial/Once copied, open your server.cfg and make sure the database, your framework and your character screens start before Tutorial Creator:
ensure oxmysql
# Framework (one of them)
ensure qb-core
# ensure qbx_core
# ensure es_extended
# ensure qs-core
# Optional
ensure ox_lib
ensure qb-multicharacter
ensure qb-spawn
ensure qs-tutorialThe loading order matters for the database: the driver is looked for when the resource starts, and if neither oxmysql nor mysql-async is running then, nothing can be saved. Framework detection is more forgiving — with Config.Framework = 'auto', a framework that starts late is picked up a few seconds later — but starting it first is still the clean setup.
The Database#
There is nothing you must import. On every start, Tutorial Creator runs CREATE TABLE IF NOT EXISTS for its three tables. database/sql.sql holds the same statements as plain SQL — paste it into HeidiSQL or phpMyAdmin if your database user is not allowed to create tables.
Table | Holds |
|---|---|
| Every tutorial you save in the creator, one row each. |
| Which tutorial is live. |
| Who has watched what: one row per character and tutorial, with the last step reached and whether it was finished. |
The eight bundled tutorials are not in the database. They ship in
presets/and inside the interface, so there is nothing to seed and the overlay draws correctly before the client has even spoken to the server. The tables only hold what you make.
Who Can Open the Creator#
Anyone can watch the tutorial, but /tutorialcreator — where tutorials are built and set live — is for staff. Either of these grants it:
Works on every server, framework or not. Add the ace to a group and put your staff in that group in server.cfg:
add_ace group.admin command.tutorialcreator allow
add_principal identifier.license:your_license_here group.adminThe ace name is Config.Creator.permission in shared/config.lua.
Any group listed in Config.Creator.adminGroups — admin, superadmin and god by default:
Config.Creator = {
command = 'tutorialcreator',
permission = 'command.tutorialcreator',
adminGroups = { 'admin', 'superadmin', 'god' },
}ESX reads the player's group, QBCore and Qbox ask the core's own permission check, and qs-core reads the player's group or permission. The check lives in custom/<framework>/server.lua if you need it to work differently.
The permission is checked once per session, the first time the player types the command. Somebody granted access while connected must reconnect before it works.
Configuring the Resource#
The config is short on purpose — the tutorial itself, its cameras, its look and its behaviour all live in the creator. What you can open and edit:
File | Contents |
|---|---|
| Language, framework, the three commands, auto-start, camera streaming, your HUD hook, server details and blocked commands. |
| Which framework adapter loads, how notifications are shown, and the admin group check. |
| One small adapter per framework: who the player is and which group they belong to. |
| The eight bundled tutorials. Easier to change in the creator, where saving keeps your copy. |
| The translations. |
| Your media. Anything dropped in appears in the creator's pickers. |
The values worth reviewing first:
Config.Language = 'en' -- any file in locales/
Config.Framework = 'auto' -- 'auto' | 'qs' | 'esx' | 'qb' | 'standalone'
Config.Tutorial = {
command = 'tutorial', -- plays the live tutorial on demand
resetCommand = 'resettutorial', -- forgets what this character has watched
autoStart = true, -- play it by itself on first spawn
autoStartDelay = 5000, -- ms after spawn (and after the spawn screens close)
defaultTutorial = 'welcome', -- used until you set one live
updateInterval = 250, -- ms between player data pushes while it plays
enableControlsWhenFocus = false, -- let the game keep reading keys during it
}
Config.Cinematic = {
focusStreaming = true, -- load the world at the camera. Leave this on.
teleportPlayer = false, -- also move the ped to each shot. Rarely needed.
streamWait = 900, -- ms a shot may spend loading between steps
maxStreamWait = 8000, -- ms for the first shot, hidden by the fade
restoreWeather = true, -- put the weather back when it ends
restoreTime = true, -- put the clock back when it ends
}
Config.Server = { -- read by text elements bound to these values
name = 'Quasar Roleplay',
discord = 'discord.gg/quasar-store',
website = 'quasar-store.com',
}
Config.MaxTutorials = 45 -- how many may be saved; the bundled ones do not count
Config.Debug = false -- print what the resource is doingWhether a tutorial plays only once, can be skipped or freezes the player is set per tutorial, in the creator's Settings tab — not in this file.
Config.HudandConfig.Actionsare covered in Integrations and Usage.
Verifying the Installation#
After completing the installation, restart your server and read the console. Two lines confirm the layers it picked:
[qs-tutorial] framework loaded: qb
[qs-tutorial] storage driver: oxmysqlframework loaded: standalone means no framework was found — correct on a standalone server, a load-order problem otherwise. A red no database resource found means nothing will be saved; see Common Errors.
Then join your server and work through the first loop:
Watch it as a player
A new character gets the live tutorial a few seconds after spawning — Welcome to the city until you choose another. On a character that has already seen it,
/tutorialplays it on demand.Open the creator
/tutorialcreatoropens on the picker: the eight bundled tutorials, anything you have saved, and Start from nothing.Make it yours and set it live
Pick one, change a line of narration, press Save and then Set live. Every connected player has the new version immediately.
Nothing needs a restart from here on. Every camera, line, element and setting is changed in the creator and pushed to players the moment it is saved. The one exception is media: files added to
images/,videos/oraudio/need the resource restarted before they are served.



