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.
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, andhn_cigarroomusing those exact folder names. - Stop the stock selector:
esx_multicharacter,qb-multicharacter, orox_charselect. - Complete the framework-specific setup in the next guide.
- Start
lck-multicharacterafter its framework and all selected integrations.
Requirements
- Current FiveM artifact with Lua 5.4
oxmysqldpemotes— download from GitHub ↗- Hane Studios Free Cigar Room — download from Cfx.re ↗
Install it ashn_cigarroom. es_extended,qb-core, orox_core- Cigar Room interior at
-1003.55, -484.95, 50.10
ensure oxmysql
ensure qb-core # or es_extended / ox_core
ensure dpemotes
ensure hn_cigarroom
ensure lck-multicharacter
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.
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.
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.
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.
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
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.
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.
Config.Framework = 'auto' selects the adapter automatically.
DefaultSlots and MaxSlots default to 3.
AllowDelete = true shows and permits deletion controls.
RelogCommand = 'relog' sets the primary logout command.
Debug = false controls extra client and server messages.
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'
}
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.
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
}
}
Three bundled slots
sitchair3, sit4, and smoke2 are placed inside the Cigar Room. The first dpEmotes name is spelled exactly sitchair3.
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.
Each preview attempts its configured dpEmotes emote first. Native animations are included for every slot, and the smoking placement includes a cigarette prop fallback.
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'
}
}
nameis the visible location title.descriptionprovides supporting list text.coordsstores world position and heading.iconacceptscity,mountain,water,star, orplane.
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.
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.
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
illenium-appearance
Preferred source for applying a saved preview appearance.
fivem-appearance
Supported for compatible saved preview data.
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.
playerskins
The active row for the citizen ID supplies saved preview appearance when the table is available.
users.skin
The saved JSON value supplies the preview skin and clothing state.
Relog and post-spawn logic
Logs the active character out and reopens character selection.
Built-in alias that remains available when the primary command changes.
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.
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.
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.
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.
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.
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.
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.
Relog or deletion fails
Check the configured command, framework logout support, command conflicts, AllowDelete, ownership, confirmation input, and database health.
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.
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 ↗