Multicharacter documentation
Title screen, multicharacter and spawn selector in one script. Players join into a live cinematic scene with your logo and a main menu:
- Play;
- News;
- Rules (acceptance required);
- Controls;
- About us;
- Discord;
- Quit.
Then they pick a character, who appears in front of the camera wearing their real clothes, or create a new one with your own clothing creator. Last, they choose where to spawn while the camera flies over each spot.
- Version 1.0.2
- Requirements: FXServer build 35245+, OneSync (the manifest declares
/onesync; every player waits alone in a routing bucket),ox_libandoxmysql. - Frameworks: QBCore · Qbox Legacy ·
'custom'(see Integrations / Custom) - Languages: es · en
- No lock-in: rolo_notify and every other ROLO SCRIPT resource are optional. Without rolo_notify the script uses ox_lib or the base game and its own colours.
- No tickets needed: everything you may want to adapt is in open files (see Escrow: what is open).
What's new in 1.0.2: Config.Weather ('auto' pauses qb-weathersync / cd_easytime / Renewed-Weathersync on the menus, 'custom' for your own weather script, 'none' to not touch the sync); 'custom' framework (load, create, delete and list characters from the open bridge files); Config.Clothing = 'custom' also covers re-applying the look after spawning; compat hardening (item counts are validated, a full ox_inventory counts as "cannot carry" for the starter items). New key to merge in your config.lua: Config.Weather = 'auto'.
Features
- 🎬 Live title scenes: in-game camera with a slow cinematic drift, NPCs doing scenarios, their own hour and weather. Several scenes rotate with a fade. Add your own in
Config.Scenes. - 🖼️ Your brand:
- logo from a file (
html/img/) or a link, or your server name as text; - tagline;
- optional background music (
html/music/or a link, mute button remembered); - colours from rolo_notify: each player sees their chosen theme.
- logo from a file (
- 📰 Panels: news, rules (by sections), controls (key + action), about us (text + links, website). All plain text in
config.lua. - ✅ Rules acceptance: players accept the rules once. Raise
Config.Rules.versionand everyone accepts them again. - 👤 Character cards: name, job and grade, cash, bank, birth date, nationality, play time, last played. Streamer mode blurs the money and the ID.
- 🧍 3D preview with the real saved look. Drag to rotate.
- ➕ Create:
- first and last name (validated, capitalised, optionally unique), birth date (age limits), sex, nationality (list);
- then your creator opens: origen_clothing, illenium-appearance, fivem-appearance or qb-clothing, with a
custombranch.
- Each character is shown with its own look in the selection. With origen_clothing the look is read from the database (nobody is loaded yet): every candidate table is checked and the row with the full look (face, hair, features) wins; saved-outfit / wardrobe / shop tables are ignored. The console lists the tables it checks. If a server ever shows the wrong clothes, force the table with
Config.LookTable.Config.Debug = trueprints what was read for each character. - 🗑️ Delete with double confirmation (type the full name). Can be disabled or admin-only.
- 🎟️ Slots: a default number, extra per player by admins, and a console command made for Tebex.
- 📍 Spawn selector: last location plus your points. The camera flies over each one. New characters spawn at a fixed point (or pick a qb-apartments apartment) and get the starter items (id_card / driver_license with their data).
- 🔒 Private while choosing: every player is alone in their own routing bucket. No HUD or radar, and weather sync is paused.
- 🔁
/logoutreturns to the title screen, for admins or everyone. rolo_admin's character switch works with it. - 🌍 Spanish and English. QBCore, Qbox, ESX Legacy and
'custom'. Inventories for the starter items: every one in the Compatibility section below.
Dependencies
Installation
- Remove your current multicharacter and spawn scripts: qb-multicharacter, qb-spawn, origen_titlemenu… Only one can run.
- Put
rolo_multicharacterin your resources andensureit after your framework, ox_lib and oxmysql. - Put your logo in
html/img/(or use a link) and setConfig.Branding: name, logo, Discord, music. - Write your news, rules, controls and "about us" in
config.lua. - Tables are created on the first start (
rolo_multichar_accounts,rolo_multichar_chars). Characters stay in your framework's own tables.
Loading screen
The loading screen closes the moment the title screen is ready. It fires loadingscreen:client:shutdown and also calls ShutdownLoadingScreenNui. If your loading screen waits for a resource name, set it to rolo_multicharacter.
Slots (admins / Tebex)
| Command | Where | What |
|---|---|---|
/multichar_slots <id|license> <n> |
in game (admins) or console | sets the slots of a player |
multichar_addslot <id|license> [n] |
console / Tebex | adds slots (default 1) |
In Tebex, add the command multichar_addslot {sid} to the package, with "requires the player to be online". To give slots offline, use the license instead.
Configuration (config.lua)
| Option | What it does |
|---|---|
Config.Framework, Clothing, Inventory, Notify, Weather |
'auto' detects them; 'custom' = your own in the open bridge/ / compat/ files (see Integrations / Custom). Notify: 'auto' / 'rolo_notify' / 'ox_lib' / 'qbcore' / 'esx' / 'okok' / 'custom' |
Config.LookTable, Debug |
Force the table that holds the full saved look (origen_clothing); print what was read for each character |
Config.RoutingBucketBase, WorldBucket |
Routing buckets: the menus use RoutingBucketBase + the player's id (10000), the game world is WorldBucket (0). Change only if another script uses those numbers |
Config.PreloadLooks |
Send every character's look with the list (faster preview) |
Config.Logout, AdminAce |
/logout command and who can use it; ace for the admin commands |
Config.Branding |
Server name, tagline, logo (file / link), Discord, website, music |
Config.MainMenu |
Buttons and their order |
Config.News, Rules, Controls, About |
Panel contents |
Config.Slots, MaxSlots, AllowDelete, DeleteNeedsAdmin |
Characters per player and deleting |
Config.MinAge, MaxAge, NameMin, NameMax, UniqueNames, Nationalities |
Identity rules |
Config.StarterItems |
Items for new characters (nil = the framework's list) |
Config.Logout |
/logout command and who can use it |
Config.Spawn, NewCharacter |
Spawn points, last location, new character spot, qb-apartments |
Config.Scenes, SceneRotateSeconds |
Title scenes (camera, NPCs, hour, weather) |
Config.Select |
Where the character stands in front of the camera |
Exports
-- server
exports.rolo_multicharacter:Logout(src) -- saves, logs out and shows the title screen
exports.rolo_multicharacter:OpenSelector(src) -- same as Logout (kept as a clearer name)
-- client
exports.rolo_multicharacter:IsOpen() -- true while the menus show
Integrations / Custom
Everything you may want to adapt is in open files (config.lua, locales/, bridge/, compat/): you never need the escrowed code.
Exports: see Exports above. Example, send a player back to the title screen from your own script (an admin tool, a "switch character" item...):
exports.rolo_multicharacter:Logout(source)
Events and commands: TriggerClientEvent('rolo_multicharacter:client:open', source) shows the title screen again (use the Logout export instead, it also saves the character). /logout, multichar_slots and multichar_addslot are described above. The loading screen is closed with the event loadingscreen:client:shutdown and ShutdownLoadingScreenNui; after the spawn the script fires the framework's own "loaded" events (see Bridge.OnSpawned).
Where to plug in your own system ('custom')
| System | config.lua |
Open file and function |
|---|---|---|
| Framework: characters, login, logout, delete | Config.Framework = 'custom' |
bridge/server.lua: Bridge.IsLoggedIn(src), Bridge.GetCharacters(src) (fields documented above the function), Bridge.OwnsCharacter(src, citizenid), Bridge.NameTaken(first, last), Bridge.Login(src, citizenid, new), Bridge.Logout(src), Bridge.Delete(src, citizenid), Bridge.Current(src), Bridge.IsAdmin(src). Client: Bridge.OnSpawned(isNew, skin) in bridge/client.lua (tell your scripts the character is loaded) |
| Clothing creator and saved look | Config.Clothing = 'custom' |
Bridge.GetSkin(citizenid) (server) and Bridge.ApplySkin, Bridge.OpenCreator(gender), the re-apply step of Bridge.OnSpawned (client) in the bridge files |
| Starter items | Config.Inventory = 'custom' |
Compat.CustomInventory in compat/server.lua; list in Config.StarterItems; Bridge.GiveStarterItems in bridge/server.lua |
| Notifications | Config.Notify = 'custom' |
Bridge.Notify(message, kind, duration) in bridge/client.lua |
| Weather / time sync | Config.Weather = 'custom' |
Bridge.PauseWeatherSync(pause) in bridge/client.lua |
| qb-apartments for new characters | Config.NewCharacter.apartments |
Bridge.ApartmentStart(charData) in bridge/client.lua |
| ESX delete (tables cleared when a character is deleted) | Config.ESXDeleteTables in bridge/server.lua |
|
| Brand, panels, scenes, spawn points, rules | config.lua, html/img/, html/music/ |
|
| Texts | locales/*.lua |
Example:
-- bridge/server.lua (Config.Framework = 'custom')
function Bridge.Logout(src) MyFramework.UnloadCharacter(src) end
function Bridge.Delete(src, citizenid) MyFramework.DeleteCharacter(citizenid) end
-- bridge/client.lua (Config.Weather = 'custom')
function Bridge.PauseWeatherSync(pause) TriggerEvent(pause and 'my_weather:pause' or 'my_weather:resume') end
Anything you leave empty answers "not supported" and the script keeps working without that part.
Escrow: what is open
These files stay open (editable) when the resource is escrowed, exactly as escrow_ignore in fxmanifest.lua says:
config.lua;locales/*.lua: every text;bridge/*.lua:bridge/server.lua(framework: characters, login, logout, delete, admins; saved looks; starter items) andbridge/client.lua(notifications, applying looks, opening the creator, after-spawn events, weather sync);compat/*.lua: inventories for the starter items (and vehicle keys / fuel / garage helpers shared by every ROLO SCRIPT resource).
The rest of the Lua code (client/, server/, shared/) is encrypted. This resource has no webhooks and no item definitions, so there is no config_server.lua or items/ folder. Your logo and music go in html/img/ and html/music/ (plain files, not encrypted).
ROLO SCRIPT · Support and updates on our Discord.
Compatibility
The shared compatibility core (compat/server.lua + compat/client.lua, open files) detects your systems on start and prints them in the server console, e.g. compat: framework qbcore · inventory ox_inventory · garages qb-garages · society qb-banking.
- Frameworks: QBCore, Qbox, ESX Legacy (
Config.Multichar = truein es_extended),'custom'. - Clothing: origen_clothing, illenium-appearance, fivem-appearance, qb-clothing, skinchanger (esx_skin),
'custom'(Config.Clothing). - Weather sync: qb-weathersync, cd_easytime, Renewed-Weathersync,
'custom','none'(Config.Weather). - Inventories (starter items): ox_inventory, origen_inventory, qs-inventory, codem-inventory, core_inventory, qb-inventory, ps-inventory / lj-inventory / tgiann-inventory (through the QBCore player functions).
Config.Inventory = 'custom'+Compat.CustomInventory. Item counts are validated and a full ox_inventory counts as "cannot carry". - Optional ROLO SCRIPT resources (rolo_notify, rolo_admin's character switch, rolo_interface): used when they run, never required.
- Errors are printed in the console with the system's name, never silent.
- Names and columns follow each script's public documentation. Test once after installing with your own setup.
Write to us in the Discord support channel with the script, your framework and the console error.
