LCKSCRIPTS/Documentation/lck-multicharacter
Complete documentation

LCK Multicharacter

Install and configure a cinematic three-slot character selector with framework-native creation and deletion, saved appearance previews, a built-in spawn map, and safe relog support.

ESX LegacyQBCoreOX CoreoxmysqldpEmotes
01 / Installation

Installation

Install lck-multicharacter as the only character selector on the server. The resource uses the active framework's existing character tables, so no SQL import or database migration is required.

  • Copy the resource with the exact folder name lck-multicharacter.
  • Install oxmysql, dpemotes, and hn_cigarroom using those exact folder names.
  • Stop the stock selector: esx_multicharacter, qb-multicharacter, or ox_charselect.
  • Complete the framework-specific setup in the next guide.
  • Start lck-multicharacter after its framework and all selected integrations.

Requirements

ensure oxmysql
ensure qb-core          # or es_extended / ox_core
ensure dpemotes
ensure hn_cigarroom
ensure lck-multicharacter
Verify startup

The server console should print [lck-multicharacter] Framework adapter ready: esx, with esx, qb, or ox matching the active adapter. Then test selection, creation, all three preview placements, spawning, and /relog.

02 / Frameworks

Framework setup

Config.Framework = 'auto' detects es_extended, then qb-core, then ox_core. If more than one framework resource is present, set esx, qb, or ox explicitly.

01

ESX Legacy

Keep Config.Multichar = true in ESX, start esx_identity, and stop esx_multicharacter. LCK replaces the selector but retains ESX's multicharacter identifier lifecycle.

02

QBCore

Stop qb-multicharacter. The built-in LCK spawn selector replaces the character-spawn portion of login, so qb-spawn is not required by this resource.

03

OX Core

Disable OX's automatic chooser and set three character slots before ox_core starts. OX Core remains responsible for accounts, metadata, persistence, and soft deletion.

ESX startup

ensure oxmysql
ensure es_extended
ensure esx_identity
ensure dpemotes
ensure hn_cigarroom
ensure lck-multicharacter

OX Core convars

setr ox:characterSelect false
setr ox:characterSlots 3

ensure ox_lib
ensure oxmysql
ensure ox_core
ensure dpemotes
ensure hn_cigarroom
ensure lck-multicharacter
Character deletion

ESX deletion discovers tables with an identifier or owner varchar column and removes matching character rows in one transaction. Back up the production database and test custom tables with a disposable character before enabling deletion.

03 / Core settings

Slots, identity, and themes

All public settings are in config.lua. Restart the resource after changing them. This release supports a maximum of three slots because each slot has its own position, animation, and camera.

FRAMEWORK

Config.Framework = 'auto' selects the adapter automatically.

SLOTS

DefaultSlots and MaxSlots default to 3.

DELETION

AllowDelete = true shows and permits deletion controls.

RELOG

RelogCommand = 'relog' sets the primary logout command.

DEBUG

Debug = false controls extra client and server messages.

OX LIMIT

ox:characterSlots also limits the effective OX Core slot count.

Identity validation

Config.Identity = {
    MinNameLength = 2,
    MaxNameLength = 24,
    MinAge = 18,
    MaxAge = 90,
    DefaultHeight = 180,
    DefaultNationality = 'San Andreas'
}

Names, birth date, gender, nationality, selected slot, ownership, and capacity are validated again on the server. ESX and QBCore accept male or female identities; OX Core also accepts the non-binary form value. DefaultHeight is passed to ESX identity creation but is not exposed in the UI.

Themes

Config.Theme = 'yellow_black'

Config.Themes.custom = {
    label = 'Custom',
    primary = '#D8A7FF',
    secondary = '#08040D'
}
yellow_blackmidnight_blueemerald_noiremberpaper_cobalt

The interface derives readable control colors from the selected theme's primary and secondary values. Translate every selector string in Config.Locale; missing keys fall back to the interface's English defaults.

04 / Preview scene

Character placements and cameras

Config.Scene.PreviewPlacements contains one entry per slot. Each entry controls the preview ped position, dpEmotes pose, native animation fallback, optional prop, and camera.

{
    coords = vector4(x, y, z, heading),
    emote = 'sitchair3',
    animDict = 'timetable@reunited@ig_10',
    animName = 'base_amanda',
    animFlag = 1,
    camera = {
        side = 0.0,
        distance = 2.35,
        height = 1.4,
        lookSide = 0.0,
        lookForward = 0.0,
        lookHeight = 1.0,
        fov = 40.0
    }
}
Preview positions

Three bundled slots

sitchair3, sit4, and smoke2 are placed inside the Cigar Room. The first dpEmotes name is spelled exactly sitchair3.

Camera controls

Per-slot framing

Use side, distance, and height for camera position; use the three look offsets and fov for framing.

Global scene values provide fallback camera coordinates and control CameraBlendSpeed, EnterFadeOut, and EnterFadeIn. Each list slot maps to the same index in PreviewPlacements, so keep all three entries in order.

Animation fallback

Each preview attempts its configured dpEmotes emote first. Native animations are included for every slot, and the smoking placement includes a cigarette prop fallback.

05 / Spawn selector

Spawn locations

Config.DefaultSpawn is used only when there is no valid configured spawn point. Add or reorder visible locations in Config.SpawnPoints.

Config.SpawnPoints = {
    {
        name = 'Legion Square',
        description = 'Central hub near shops and services',
        coords = vector4(215.6, -809.9, 30.7, 340.0),
        icon = 'city'
    }
}
  • name is the visible location title.
  • description provides supporting list text.
  • coords stores world position and heading.
  • icon accepts city, mountain, water, star, or plane.

Existing characters receive Last Location first when the framework returns valid saved coordinates. New characters do not. The map uses web/map-clean.png at 1280 × 1920; do not resize or crop it independently because marker positions are calculated from its geometry.

Competing spawn resources

Another resource that immediately changes routing, coordinates, visibility, camera, or screen fades can interrupt the built-in spawn flow. Test the selector without competing character or spawn resources first.

06 / Appearance

Appearance integrations

Start the selected appearance integration before lck-multicharacter. Without compatible saved data, the preview uses the base freemode model for the character's gender.

Saved preview priority

01

illenium-appearance

Preferred source for applying a saved preview appearance.

02

fivem-appearance

Supported for compatible saved preview data.

03

Framework clothing

qb-clothing is used on QBCore; ESX skin data is applied from users.skin.

New-character customization priority

The first spawn opens illenium-appearance, then qb-clothing on QBCore, or esx_skin with skinchanger on ESX. fivem-appearance can supply preview data, but this version does not open its creator automatically.

QBCore data

playerskins

The active row for the citizen ID supplies saved preview appearance when the table is available.

ESX data

users.skin

The saved JSON value supplies the preview skin and clothing state.

07 / Commands and events

Relog and post-spawn logic

/RELOG

Logs the active character out and reopens character selection.

/CHARACTERS

Built-in alias that remains available when the primary command changes.

PLAYER STATE

Normal routing, control, visibility, radar, and collision are restored after spawn.

Use the client event after the selected character is visible and placed at the final coordinates:

AddEventHandler('lck-multicharacter:client:characterSpawned', function(framework, isNew)
    -- framework: 'esx', 'qb', or 'ox'
    -- isNew: true only for a newly created character
end)

This is the intended hook for a HUD, tutorial, onboarding flow, or other post-selection logic. Normal framework loaded and spawned events continue to run.

Routing and visibility

ESX and QBCore players enter a private routing bucket while browsing. During selection and the spawn map, the player is hidden and invincible, control and radar are disabled, and collision is requested before the player is revealed.

08 / Troubleshooting

Common problems

First confirm the documented resource order, make sure only one selector is running, verify the exact dependency folder names, then set Config.Debug = true, restart, reconnect, and inspect the server and F8 consoles.

01

Full black screen

Confirm the adapter-ready message, stop every stock selector, verify web/index.html, styles.css, app.js, and map-clean.png, then restart and reconnect.

02

Stuck on Preparing the city

ESX needs esx_identity and multicharacter lifecycle support; QBCore needs a compatible players table; OX needs ox:characterSelect false before startup.

03

Black screen after Enter City

Verify at least one valid vector4 spawn, collision at the coordinates, the framework loaded event, and the absence of a competing spawn resource.

04

Wrong preview model or clothing

Start the appearance resource first, check the framework's saved skin record, and confirm the stored model exists and loads on the client.

05

Relog or deletion fails

Check the configured command, framework logout support, command conflicts, AllowDelete, ownership, confirmation input, and database health.

06

Linux-only problems

Resource and asset paths are case-sensitive. Match lck-multicharacter, dpemotes, hn_cigarroom, and web/map-clean.png exactly.

Identity registration failures

Names must meet the configured length and character rules, the birth date must produce an allowed age, the selected slot must remain empty, and the database must be healthy. The form passing browser validation never overrides the server's ownership, capacity, age, or database checks.

Missing Last Location

Last Location is hidden for new characters. For existing characters, inspect the saved QBCore position, ESX loaded coordinates, or OX character coordinates and heading.

Map alignment

If the spawn map is missing or has a bright rectangle, confirm web/map-clean.png is listed in fxmanifest.lua and used by the HTML. Do not substitute, resize, or crop the image without updating the marker coordinate system.

Configuration support is available.

Join the LCKSCRIPTS Discord for installation help, integration questions, and product updates.

Join Discord