Configuration

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 mount

Theme

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 peds

Server 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 to mp_*_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
}