> For the complete documentation index, see [llms.txt](https://docs.ak4y.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.ak4y.com/scripts/ak4y-multicharacter-v3/configuration.md).

# Configuration

```lua
Config = {}

-- Locale Configuration
-- Language setting (e.g., "en", "tr", "de")
Config.locales = {}
Config.locale = "en"

-- XP System Configuration
-- Amount of XP required to level up (e.g., 100 XP = level 2, 200 XP = level 3, etc.)
Config.NeedXpForLevel = 100

-- Identifier Configuration
-- Type of identifier to use (e.g., "license", "license2", "steam", etc.)
Config.Identifier = "license2"
-- Column name in database for identifier lookup
Config.IdentifierColumn = "license"

-- Character ID Column Configuration
-- Column name in database for character ID (QB uses "citizenid", ESX uses "identifier")
Config.CidColumn = "citizenid"

-- Character Slot Configuration
-- Default number of character slots per player
Config.DefaultCharCount = 3

-- Maximum number of character slots available
Config.CharSlotCount = 10

-- Routing Bucket Configuration
-- Routing bucket ID to use when character selection menu is open (set to 0 when character is selected)
Config.RoutingBucket = 1

-- Spawn Configuration
Config.LastPositionLoad = true -- Set to true to spawn at last position, false to use spawn selector
Config.UseQbApartments = false -- Set to true if you use qb-apartments
Config.DefaultSpawn = vector3(-1035.71, -2731.87, 12.86) -- Default spawn coords if apartments disabled

-- Delete Character Configuration
-- Tables that need to be cleaned before deleting a character
-- Format: ["table_name"] = "column_name"
-- Example: ["properties"] = "owner" means DELETE FROM properties WHERE owner = 'citizenid'
Config.DeletePlayersTable = {
    ["properties"] = "owner",
}

Config.PhotoLocation = vec4(-1877.34, -1210.9, 12.02, 221.67) -- Photo shoot location (x, y, z, heading)
Config.PhotoCamera = vec4(-1876.76, -1211.64, 13.6, 43.37) -- Camera position for photo
Config.PhotoCameraLookAt = vec4(-1877.34, -1210.9, 13.6, 221.67) -- Camera look at position (character head)

-- Spawn Selector Function (called when LastPositionLoad is false)
-- You can add your spawn selector logic here (qb-apartments, qb-spawn, etc.)
Config.SpawnSelector = function(src, citizenid, framework)
    -- Example: Add your spawn selector logic here
    if GetResourceState('ak4y-spawn') == 'started' then
        TriggerClientEvent('ak4y-spawn:OpenSpawnSelector', src)
    end

    if GetResourceState('ak4y-spawnselector') == 'started' then
        TriggerClientEvent('ak4y-spawnselector:openUI', src)
    end

    if GetResourceState('qb-apartments') == 'started' then
        TriggerClientEvent('apartments:client:setupSpawnUI', src, {citizenid = citizenid})
    elseif GetResourceState('qb-spawn') == 'started' then
        TriggerClientEvent('qb-spawn:client:setupSpawns', src, {citizenid = citizenid}, false, nil)
        TriggerClientEvent('qb-spawn:client:openUI', src, true)
    end
end

-- PlayerLoaded function (called after character selection for QB)
Config.PlayerLoaded = function(citizenId)
    -- Custom code here if needed
end

-- PlayerLoaded function (called after character selection for ESX)
Config.PlayerLoadedESX = function(isNew)
    -- Custom code here if needed
end

-- Voice/Sound Configuration
-- Female voice options for character creation
Config.Sounds = {}

Config.Sounds.Female = {
    [1] = { label = "Voice 1", soundName = "sound2" },
    [2] = { label = "Voice 2", soundName = "sound4" },
    [3] = { label = "Voice 3", soundName = "sound6" },
    [4] = { label = "Voice 4", soundName = "sound8" },
    [5] = { label = "Voice 5", soundName = "sound10" },
}

-- Male voice options for character creation
Config.Sounds.Male = {
    [1] = { label = "Voice 1", soundName = "sound1" },
    [2] = { label = "Voice 2", soundName = "sound3" },
    [3] = { label = "Voice 3", soundName = "sound5" },
    [4] = { label = "Voice 4", soundName = "sound7" },
    [5] = { label = "Voice 5", soundName = "sound9" },
}

-- Character Photo Options
-- Predefined photos that players can select for their characters
-- Add image paths here to add more photo options
-- You can use local paths (./img/filename.jpg) or online URLs
-- Recommended: Square images (1:1 ratio) work best, around 512x512px or larger
Config.Photos = {
    [1] = "https://i.pravatar.cc/512?img=1",
    [2] = "https://i.pravatar.cc/512?img=5",
    [3] = "https://i.pravatar.cc/512?img=12",
    [4] = "https://i.pravatar.cc/512?img=18",
    [5] = "https://i.pravatar.cc/512?img=22",
    [6] = "https://i.pravatar.cc/512?img=27",
    [7] = "https://i.pravatar.cc/512?img=33",
    [8] = "https://i.pravatar.cc/512?img=38",
    [9] = "https://i.pravatar.cc/512?img=42",
    [10] = "https://i.pravatar.cc/512?img=47",
    [11] = "https://i.pravatar.cc/512?img=52",
    [12] = "https://i.pravatar.cc/512?img=57",
    [13] = "https://i.pravatar.cc/512?img=62",
    [14] = "https://i.pravatar.cc/512?img=68",
    [15] = "https://i.pravatar.cc/512?img=70",
}

-- Music Configuration
-- Supported sites: YouTube
-- Example format: Just paste the URL of the music/video
Config.Music = {
    [1] = "https://www.youtube.com/watch?v=dQw4w9WgXcQ", -- Rick Astley - Never Gonna Give You Up
    [2] = "https://www.youtube.com/watch?v=kJQP7kiw5Fk", -- Luis Fonsi - Despacito
    [3] = "https://www.youtube.com/watch?v=9bZkp7q19f0", -- PSY - GANGNAM STYLE
    [4] = "https://www.youtube.com/watch?v=OPf0YbXqDm0", -- Mark Ronson - Uptown Funk
    [5] = "https://www.youtube.com/watch?v=fJ9rUzIMcZQ", -- Queen - Bohemian Rhapsody
    [6] = "https://www.youtube.com/watch?v=kXYiU_JCYtU", -- Linkin Park - Numb
    [7] = "https://www.youtube.com/watch?v=IcrbM1l_BoI", -- Eminem - Lose Yourself
    [8] = "https://www.youtube.com/watch?v=y6120QOlsfU", -- Survivor - Eye of the Tiger
    [9] = "https://www.youtube.com/watch?v=StTqXEQ2l-Y" -- AC/DC - Thunderstruck
}

-- Character Animation Options
-- Animations that players can preview on their characters in the character selection screen
-- Format: { label = "Display Name", dict = "animation dictionary", anim = "animation name", duration = milliseconds }
Config.Animations = {
    [1] = {
        label = "Hand Shake",
        dict = "gestures@m@standing@casual",
        anim = "gesture_hello",
        duration = 4500,
    },
    [2] = {
        label = "Salute",
        dict = "anim@mp_player_intincarsalutestd@ds@",
        anim = "idle_a",
        duration = 4500,
    },
    [3] = {
        label = "Thumbs Up",
        dict = "anim@mp_player_intupperthumbs_up",
        anim = "idle_a",
        duration = 4500,
    },
    [4] = {
        label = "Celebration Salute",
        dict = "anim@mp_player_intcelebrationmale@salute",
        anim = "salute",
        duration = 2500,
    },
    [5] = {
        label = "Blow Kiss",
        dict = "anim@mp_player_intcelebrationfemale@blow_kiss",
        anim = "blow_kiss",
        duration = 4500,
    },
    [6] = {
        label = "Facepalm",
        dict = "anim@mp_player_intupperface_palm",
        anim = "idle_a",
        duration = 4000,
    },
    [7] = {
        label = "Clap",
        dict = "anim@mp_player_intcelebrationmale@slow_clap",
        anim = "slow_clap",
        duration = 3000,
    },
}
```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.ak4y.com/scripts/ak4y-multicharacter-v3/configuration.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
