Commands#
Multicharacter keeps its commands to a minimum: one for players, one for staff, and a few test commands that only exist in debug mode.
Command | Who | Description |
|---|---|---|
| Everyone | Saves the current character and returns to the selection room. Registered only while |
| Admins | Unlocks the next locked slot for that online player, permanently. |
| Everyone (in game) | Redeems a Tebex transaction ID for the player typing it. See Character Slots and Tebex. |
| Debug mode | Plays a random scenario, as the landing page would. |
| Debug mode | Plays that one scenario — handy while moving its camera or position. |
| Debug mode | Plays the new-character plane cutscene. |
Debug commands are registered only when Config.Debug = true; turn it off again before going live.
Who counts as an admin#
/addslot needs no ace of its own — it asks your framework:
Framework | Allowed |
|---|---|
ESX | Groups |
QBCore / Qbox | Permissions |
qs-core | Groups |
The check lives in
custom/<framework>/server.lua— change it there if your staff use other groups.
Client Exports#
Opening the spawn selector
Opens the spawn selector for the current character — after a prison sentence, a hospital discharge or an admin teleport menu.
---@param isNew boolean true = treat as a new character (apartments offered, no last location)
---@param apps table|nil apartment list to offer; nil uses the detected one
---@param deferUI boolean true = prepare the camera but wait before showing the interface
---@param slotId number the character's slot, used for its skin, last position and houses
exports['qs-multicharacter']:OpenSpawnSelector(isNew, apps, deferUI, slotId)
-- Example: let an existing character in slot 0 choose where to go
exports['qs-multicharacter']:OpenSpawnSelector(false, nil, false, 0)Playing the wake-up scene
Plays the beach wake-up animation on the player — about 14 seconds.
exports['qs-multicharacter']:SpawnScene()Server Exports#
Deleting a character
Deletes a character through your framework, then from every table with an identifier, owner or creator column that matches it.
---@param src number the player's server id (used for logs)
---@param identifier string ESX: 'char<slot>:<license>' · QB/Qbox/qs-core: the citizenid
exports['qs-multicharacter']:DeleteCharacter(src, identifier)
-- ESX example: delete the first character of a license
exports['qs-multicharacter']:DeleteCharacter(source, 'char0:' .. license)Events#
Events you can listen to from your own scripts:
Event | Side | Fired when |
|---|---|---|
| Client | The player has been placed in the world and the menu cameras are gone. The safe moment to show your own UI. |
| Client | ESX and qs-core, after a character is loaded — as with the stock menu. |
| Client | QBCore and Qbox, after a character is loaded. |
| Server | A new character picked a starting apartment. |
Events you can trigger:
-- Client: skip the landing page intro (e.g. from a queue or tutorial script)
TriggerEvent('multicharacter:skipIntro', true)
-- Client → server: log out to the selection room, same as /qs:logout
TriggerServerEvent('multicharacter:backToCharacterSelect')
-- Server: show a notification in the multicharacter interface
TriggerClientEvent('multicharacter:notification', source, 'Welcome back!', 'success') -- info | error | successEvery spawn ends in
multicharacter:endSpawn, whichever path it took — the selector, a direct spawn or a new ESX character. Hook into that rather than the framework's loaded event when your UI must not appear over the spawn selector.



