Skip to content

ESX Setup

Complete guide for setting up 0r-multicharacterv3 with ESX framework.

βœ… Requirements#

  • ESX Legacy (1.9.0+) or ESX Infinity
  • ox_lib
  • oxmysql
  • A compatible inventory
  • A compatible clothing script (skinchanger or alternatives)

πŸš€ Quick Setup#

Step 1: Enable Multicharacter in ESX#

Edit es_extended/config.lua:

lua
Config.Multichar = true  -- Enable multicharacter support

Step 2: Disable Default Multicharacter#

cfg
# server.cfg
# ensure esx_multicharacter  <-- Comment out or remove
ensure 0r-multicharacterv3

Step 3: Start Order#

cfg
ensure oxmysql
ensure ox_lib
ensure es_extended
ensure ox_inventory  # or qs-inventory
ensure skinchanger   # or bl_appearance
ensure 0r-multicharacterv3

πŸ—„οΈ Database#

ESX uses the users table for character storage:

ColumnUsage
identifierCharacter identifier (char1:license, char2:license)
firstnameFirst name
lastnameLast name
dateofbirthBirth date
sexGender (m/f)
jobJob name
job_gradeJob grade
accountsMoney accounts (JSON)
positionLast position (JSON)
skinAppearance data (JSON)

πŸ”§ Character Identifier Format#

ESX multicharacter uses a specific identifier format:

text
char{number}:{license}

Examples:

  • char1:abc123def456 - First character
  • char2:abc123def456 - Second character
  • char3:abc123def456 - Third character

Configure the prefix in config/config.lua:

lua
Config.Prefix = 'char'  -- Creates char1:, char2:, etc.

πŸ“Š Data Conversion#

The script converts ESX data to a standardized format:

lua
-- ESX format
{
    identifier = 'char1:license123',
    firstname = 'John',
    lastname = 'Doe',
    dateofbirth = '1990-01-15',
    sex = 'm',
    job = 'unemployed',
    job_grade = 0,
    accounts = '{"money":500,"bank":5000}',
    position = '{"x":0,"y":0,"z":0}',
}

-- Converted format
{
    cid = 1,
    citizenid = 'char1:license123',
    charinfo = {
        firstname = 'John',
        lastname = 'Doe',
        birthdate = '1990-01-15',
        gender = 'm',
        nationality = 'N/A',
    },
    job = {
        name = 'Unemployed',
        label = 'Unemployed',
        grade = { name = 'Unemployed' }
    },
    money = {
        cash = 500,
        bank = 5000,
    },
    position = {
        x = 0.0,
        y = 0.0,
        z = 0.0,
        w = 0.0,
    }
}

⚑ Events#

Server Events#

lua
-- When player loads character
RegisterNetEvent('esx:playerLoaded', function(player, xPlayer, isNew)
    -- Triggered after character selection
end)

-- When player disconnects
RegisterNetEvent('esx:playerDropped', function(playerId, reason)
    -- Cleanup
end)

Client Events#

lua
-- After spawning
TriggerServerEvent('esx:onPlayerSpawn')
TriggerEvent('esx:onPlayerSpawn')
TriggerEvent('playerSpawned')
TriggerEvent('esx:restoreLoadout')

πŸ”„ Character Deletion & Reindexing#

When a character is deleted, remaining characters are reindexed:

lua
-- Before deletion: char1, char2, char3
-- Delete char2
-- After reindex: char1, char2 (was char3)

Configure tables in config/database.lua:

lua
Database.List = {
    ['es_extended'] = {
        { table = 'users', column = 'identifier', type = 'citizenid' },
        { table = 'user_accounts', column = 'identifier', type = 'citizenid' },
        { table = 'user_inventory', column = 'identifier', type = 'citizenid' },
        { table = 'owned_vehicles', column = 'owner', type = 'citizenid' },
        { table = 'user_licenses', column = 'owner', type = 'citizenid' },
        -- Add more tables as needed
    }
}

πŸ“‹ Complete Configuration#

lua
-- config/config.lua for ESX

Config.Debug = false
Config.DeveloperMode = false
Config.Locale = 'en'
Config.HideRadar = true
Config.Prefix = 'char'  -- ESX character prefix
Config.DefaultCharacterSlots = 2
Config.SkipWarning = false
Config.DisableDeleteCharacter = false

-- Spawn configuration
Config.SkipSpawnSelector = true
Config.SpawnSelector = '0r-spawn'
Config.ApartmentStart = false
Config.NewPlayerSpawnCoords = vec4(195.17, -933.77, 29.7, 144.5)

πŸ†š ESX vs QBCore Differences#

FeatureESXQBCore
Identifierchar1:licensecitizenid
Genderm/f0/1
Money StorageJSON accountsJSON money
Skin Storageusers.skinplayerskins
Player ObjectxPlayerPlayer

❓ Troubleshooting#

"Multichar not enabled" error#

Ensure in es_extended/config.lua:

lua
Config.Multichar = true

Skin not loading#

  1. Check users.skin column has data
  2. Verify skinchanger is started
  3. Ensure skin format is correct

Character reindex issues#

If characters are out of order after deletion:

sql
-- Manual reindex query
UPDATE users 
SET identifier = CONCAT('char', @row := @row + 1, ':', SUBSTRING_INDEX(identifier, ':', -1))
WHERE identifier LIKE 'char%:your-license-here'
ORDER BY identifier;

Job not showing correctly#

The script reads job labels from ESX's job system. Ensure jobs are properly configured in your database.