Configuration
All configuration lives in bablo-multicharacter/config.lua. The file is not escrowed and is fully editable. Below is a reference for every section.
Changes to config.lua require a resource restart to take effect (restart bablo-multicharacter in the console).
Core
Config.DEBUG = false -- Verbose console tracing for troubleshooting
Config.Framework = "auto" -- auto | qbcore | esx | qbox
Config.Appearance = "auto" -- auto | qb-clothing | tgiann-clothing | illenium-appearance
-- | fivem-appearance | bl_appearance | crm-appearance
-- | rcore_clothing | skinchanger
Config.Housing = "none" -- none | auto | qb-houses | qbx-apartments
Config.Locale = "en-US" -- en-US | sv-SE (add more in locales/<locale>.lua)Spawn & Create flow
Config.SpawnCoords = {
coords = vector3(-1041.2592, -2744.5063, 21.3594),
heading = 332.1771,
}
Config.PostCreate = {
TeleportToSpawn = true, -- teleport to Config.SpawnCoords after create
UseClothingTimer = true, -- show find-a-spot countdown before clothing editor
ClothingTimerMs = 15000, -- countdown duration in ms
}
Config.ShutdownLoadingScreen = true -- kill FiveM + NUI loading screens on mountTheme
Config.Theme = {
accent = '#7aadff', -- brand accent (PLAY button, hover pills, highlights)
accentFg = '#0e0e0e', -- text/icon colour shown on top of the accent
}Currency
The pattern uses %s as the number placeholder.
Config.Currency = {
pattern = '$ %s', -- '$ %s' → "$ 1,234" | '%s kr' → "1 234 kr"
thousands = ',', -- thousands separator
}Character detail panel
Toggle which info chips and money chips appear on the selected character.
Config.CharacterDetail = {
bio = true,
fields = {
{ kind = 'dob', enabled = true },
{ kind = 'gender', enabled = true },
{ kind = 'job', enabled = true },
{ kind = 'playtime', enabled = true },
},
money = {
{ kind = 'cash', enabled = true },
{ kind = 'bank', enabled = true },
},
}Custom entries
Add your own chip with a client-side fetcher. For money entries fetch must return a number (it's formatted through Config.Currency); for info entries it can return anything (it's tostring'd).
{
kind = 'custom',
id = 'reputation', -- unique id (React key + lookup)
icon = 'Star', -- Lucide icon name, PascalCase — https://lucide.dev/icons
label = 'REPUTATION', -- locale key OR raw display string
fetch = function(character)
return (character.metadata and character.metadata.reputation) or 0
end,
}Nameplates
Config.NameplateScale = 1.0 -- global multiplier for the DUI nameplate size above pedsServer logo
A wall-mounted logo billboard rendered into the scene. The image lives in the resource root; width/height are in metres.
Config.ServerLogo = {
enabled = false,
debug = false, -- show centre + corner markers and a 3D text label for placement
image = 'logo_example.png',
coords = { x = -600.2876, y = -711.4252, z = 114.6053 },
heading = 90.0564,
width = 1.5,
height = 1.5,
opacity = 0.8, -- 0.0 = fully transparent, 1.0 = fully opaque
}Socials
Built-in kinds: discord, youtube, twitter, tiktok, twitch, website, store, info, map, music, custom.
Config.Socials = {
{ kind = 'discord', enabled = true, url = 'https://discord.gg/your-server' },
{ kind = 'youtube', enabled = true, url = 'https://www.youtube.com/@your-channel' },
{ kind = 'website', enabled = true, url = 'https://your-server.com' },
-- { kind = 'custom', enabled = true, icon = 'Newspaper', label = 'Rules', url = 'https://your-server.com/rules' },
}Settings dialog defaults
Defaults for the in-game settings dialog. Player overrides persist per-server via KVP.
Config.Settings = {
defaultTheme = 'dark', -- 'dark' | 'light'
music = {
enabled = true,
url = 'https://www.youtube.com/watch?v=jfKfPfyJRdk', -- direct audio URL or YouTube link
volume = 0.05, -- 1.0 = full volume
},
blur = {
fps = 60, -- 15..120 — how often the scene blur redraws (lower = better perf)
intensity = 3, -- 1..6 — gaussian blur passes (higher = softer blur, more GPU)
},
}Locations & scenes
One Location is picked at random on init. Each location has a defaultCamera and a list of scenes (one per character slot). Optional per-scene fields:
pedModel = '<name>'— model used when the slot is empty / locked (defaults tomp_*_freemode_01). Real characters always use their own skin's model.locked = true— marks the slot as a premium slot (see below).
Config.Locations = {
{
defaultCamera = {
coords = vector3(-586.2933, -706.5692, 114.0051),
rotation = vector3(-3.0022, -0.0049, 123.6820),
fov = 57.0,
},
scenes = {
{
coords = vector4(-596.7833, -707.2360, 114.3052, 262.1913),
offset = { x = 10, y = 65 },
camera = {
coords = vector3(-596.7833, -707.2360, 114.3052),
rotation = vector3(-3.0022, -0.0049, 123.6820),
fov = 57.0,
},
animation = { type = "animation", lib = "timetable@ron@ig_3_couch", anim = "base" },
-- pedModel = 'a_m_y_business_01',
-- locked = true,
},
-- ...up to 4 scenes
}
}
}Premium slots
Mark any scene with locked = true to gate that slot behind an admin grant. Locked-and-not-unlocked slots spawn a ped with a 🔒 PREMIUM SLOT nameplate; clicking it opens an info dialog instead of the create flow. Unlocks are stored in the bablo_multicharacter_unlockedslots table.
Config.SlotCommands = {
open = 'openslot',
close = 'closeslot',
}Admin commands (gated by the framework's admin/god permission, or the command ACE):
/openslot <serverId|license:...> <slotIndex>
/closeslot <serverId|license:...> <slotIndex>Existing characters already in a locked slot are grandfathered — they always remain playable, even if the player's unlock status changes later.
Relog command
A /relog style command that unloads the player's character and reopens the selector without disconnecting them. Works on QBCore, Qbox and ESX.
Config.RelogCommand = {
enabled = true,
command = 'relog',
adminOnly = false, -- true = gate behind the framework admin check
}