# SLEEK CHAR CREATOR

{% embed url="<https://youtu.be/-N8wP8xNJEg?si=kOl1-JzfvlhXgUJf>" %}

{% hint style="danger" %}
To use this script, you also need the **FORGE-MULTICHARACTER**, both are purchased together so you should have no problem installing them together.
{% endhint %}

{% hint style="success" %}
This script is compatible with **ESX**, **QB, QBOX** and **Illenium**.
{% endhint %}

{% hint style="success" %}
This script is compatible with **Quasar Inventory**, **QB Inventory and OX Inventory**.
{% endhint %}

**INSTALLATION GUIDE**

{% tabs %}
{% tab title="ESX" %}
**1️⃣ Download & Extract**

* Download **forge-charcreator.pack.zip** from **KEYMASTER**.
* Unzip it and place the **forge-charcreator** folder inside your server's `resources` directory.

**2️⃣ Add to Server Startup**

* Open your **server.cfg** and add the following line:

  ```plaintext
  ensure forge-charcreator
  ```
* **Do not rename the folder**—it must remain as `forge-charcreator`, or the resource will not work properly.
* Ensure it is placed **just below your core resources** for proper loading.

**3️⃣ Remove Conflicting Scripts**

* **Delete or remove** any other Char Creator you previously installed, such as `esx_identity`.
* If you are using **ESX + Illenium**, you must also **remove the following scripts**:
  * `esx_skin`
  * `skinchanger`
* ⚠ **If you are using ESX + Default, do NOT delete these scripts.**

**4️⃣ Configure Your Settings**

* **Carefully edit** the `config.lua` file to match your preferences.
* You **must also** configure settings inside `server/serverconfig.lua`.

**5️⃣ Clear Cache & Restart Server**

* **Clear the cache** of both your server and your FiveM client.
* **Restart your entire server** with `forge-charcreator` **properly ensured** in your `server.cfg`.

🚀 Once installed, everything should be working smoothly!
{% endtab %}

{% tab title="QB and QBOX" %}
**1️⃣ Download & Extract**

* Download `forge-charcreator.pack.zip` from **Keymaster**.
* Unzip it and place the **forge-charcreator** folder inside your server's `resources` directory.

> ⚠️ **Do not rename the folder** — it must remain as `forge-charcreator` or the resource will not work correctly.

***

### 2️⃣ Add to Server Startup

Open your `server.cfg` and add:

```
ensure forge-charcreator
```

* Place this **just below your core resources** for proper loading order.

***

### 3️⃣ Remove Conflicting Scripts

* Delete or disable any other **Character Creator** you previously installed (e.g., `qb_multicharacter`).

***

### 4️⃣ If You Use QB-Apartments

You must delete a specific line from **qb-interior** to prevent double clothing flows:

* **File**: `qb-interior/client/main.lua`
* **Line**: Around line **71** (may vary depending on version)
* **Remove/Comment out**:

```lua
TriggerEvent('qb-clothes:client:CreateFirstCharacter')
```

***

### 5️⃣ If You Use QBOX with qbx\_properties

You must also delete a line from **qbx\_properties** to prevent conflicts:

* **File**: `qbx_properties/server/apartmentsselect.lua`
* **Remove/Comment out**:

```lua
-- TriggerClientEvent('qb-clothes:client:CreateFirstCharacter', playerSource)
```

***

### 6️⃣ Required Step for QB-Clothing Users (One-Time Only)

If you use **qb-clothing**, add the following compatibility block to ensure proper skin handling for all Forge scripts.

> 💡 **Important**: This must be added **only once**.\
> All Forge scripts that use QB-Clothing will rely on this single compatibility block.

* **File**: `qb-clothing/client/main.lua`
* **Add this block**:

```lua
RegisterNetEvent('qb-clothing:setSkinData', function(key, index, texture)
    skinData[key] = skinData[key] or {}
    skinData[key].item = index
    skinData[key].texture = texture
end)

RegisterNetEvent('qb-clothing:saveSkin', function()
    SaveSkin()
end)

AddEventHandler('qb-clothing:client:getSkin', function(cb)
    cb(skinData)
end)
```

> 📌 Place this code at the bottom of the file or near other event handlers.

***

### 7️⃣ Configure Your Settings

* Edit `forge-charcreator/shared/config.lua` to match your preferences (UI, colors, volume, etc.).
* Configure additional settings inside `server/serverconfig.lua`.

***

### 8️⃣ Clear Cache & Restart Server

1. Clear your **server cache**.
2. Clear your **FiveM client cache**.
3. Restart your entire server with:

```
ensure forge-charcreator
```

correctly placed in your `server.cfg`.

***

Si quieres, puedo ahora integrarte esta guía en el **formato oficial que usamos para GitBook** con tablas de compatibilidad, notas de advertencia y bloques plegables para que quede idéntico al resto de tu documentación.\
Así quedará mucho más uniforme y profesional.
{% endtab %}
{% endtabs %}

**CONFIG**

The following will explain all the settings, one of the most important things that I recommend you spend a few minutes to understand in order to offer your users the best possible experience.

In addition, inside CLIENT and SERVER you will have the files related to the frameworks, where you will have many open ESX and QB functions for you to adapt them to your framework needs.

<figure><img src="/files/B4jwzJLxEilwiwnhPlcA" alt=""><figcaption></figcaption></figure>

{% hint style="warning" %}
If you use **Illenium**, remember to make sure that the illenium fxmanifest contains:

`provides { "esx_skin", "skinchanger" }`
{% endhint %}

{% tabs %}
{% tab title="CONFIG" %}
{% hint style="warning" %}
If you use the latest update of the script it **will automatically detect everything regarding Framework, Skin Manager and Identifier**. <mark style="color:red;">Don't touch anything where it says</mark> <mark style="color:red;"></mark><mark style="color:red;">**"You don't need to touch this".**</mark>
{% endhint %}

{% code lineNumbers="true" %}

```lua
Config = {}
Config.Game = {}
Config.Game.database = {}
Config.UI = {}
Config.Game.Start = {}
Config.CC = {}
Config.CC.Camera = {}

--  ██████╗ ██████╗ ███╗   ██╗███████╗██╗ ██████╗ ██╗   ██╗██████╗  █████╗ ████████╗██╗ ██████╗ ███╗   ██╗
-- ██╔════╝██╔═══██╗████╗  ██║██╔════╝██║██╔════╝ ██║   ██║██╔══██╗██╔══██╗╚══██╔══╝██║██╔═══██╗████╗  ██║
-- ██║     ██║   ██║██╔██╗ ██║█████╗  ██║██║  ███╗██║   ██║██████╔╝███████║   ██║   ██║██║   ██║██╔██╗ ██║
-- ██║     ██║   ██║██║╚██╗██║██╔══╝  ██║██║   ██║██║   ██║██╔══██╗██╔══██║   ██║   ██║██║   ██║██║╚██╗██║
-- ╚██████╗╚██████╔╝██║ ╚████║██║     ██║╚██████╔╝╚██████╔╝██║  ██║██║  ██║   ██║   ██║╚██████╔╝██║ ╚████║
--  ╚═════╝ ╚═════╝ ╚═╝  ╚═══╝╚═╝     ╚═╝ ╚═════╝  ╚═════╝ ╚═╝  ╚═╝╚═╝  ╚═╝   ╚═╝   ╚═╝ ╚═════╝ ╚═╝  ╚═══╝                                                                                                 

Config.DEBUG = true -- This will activate debug mode, with a bunch of LOGs on F8 that will corroborate the script's operation. Enable it only in necessary cases

-- GENERAL:
Config.framework = GetResourceState('es_extended') == "started" and "ESX" or GetResourceState('qb-core') == "started" and "QB" or "CUSTOM" -- You don't need to touch this
Config.resource = nil -- Change this if your esx or qb has a custom resource name
Config.appearance = (GetResourceState("illenium-appearance") == "started" and "illenium" or "default") -- You don't need to touch this
Config.noClothing = false -- If you set this to true, players won't see the CLOTHES button when creating characters
Config.dateFormat = 'DD MMMM YYYY' -- Date format for the date of birth field
--[[
    ~id~        = character id (ESX) / citizenid (QBCore)
    ~license~   = license identifier
    ~steam~     = steam identifier
    ~discord~   = discord identifier 

    default:
        ESX: 'char~id~:~license~'
        QB:  '~id~'
]]
Config.identifier = Config.framework == 'ESX' and 'char~id~:~license~' or '~id~' -- You don't need to touch this
Config.Game.database.tool = "oxmysql" -- mysql-async / oxmysql
-- INTERFACE:
Config.UI.volume = 30 -- 0 - 100 
Config.lowPerformanceMode = false -- If you put true here. All UI animations will be removed, so there's no possible LAG. This lowers the aesthetics and beauty of the system.
Config.particles = true -- If you put false here, it means there will be no particles or dark background. If you think it looks too dark when creating a character, set it to false here. This lowers the aesthetics and beauty of the system.
Config.preventIdleAnimations = true -- If set to true, freeze the character and prevent any animations
Config.thumbsUpAnimation = true -- If set to true, the character will play a thumbs up animation during the registration page
Config.UI.color = { -- Here you can change the primary colour, which is blue, to the colour of your choice
    r = 0,
    g = 224,
    b = 255,
} 
-- GAME START
Config.Game.Start.Accounts = {
    money = 5000,               -- IMPORTANT!: Change to "cash" for QBCore or "money" for ESX
    bank = 0,
    black_money = 0
}
Config.Game.Start.Items = {
    ['phone'] = 1,              -- ['itemName'] = amount
    ['id_card'] = 1,            -- ['itemName'] = amount
    ['tosti'] = 3               -- ['itemName'] = amount
}
Config.Game.Start.Coords = vector4(-1037.6056, -2737.6169, 20.1693, 329.7833) -- The position where the player will spawn after the creation
Config.CC.spawn = vector4(-284.2856, 562.4627, 172.9182, 19.9895) -- The position where the player is during the char creation
-- CAMERAS 
Config.CC.Camera.offset = vector3(0, 2.5, 0.4) -- The offset the camera will have from Config.CC.spawn
Config.CC.Camera.settings = {}
Config.CC.Camera.settings = {
    head = {
        focus = 0.6, -- the z offset of the player position the camera will focus on
        fov = 30.0
    },
    ['upper-body'] = {
        focus = 0.5, -- the z offset of the player position the camera will focus on
        fov = 40.0
    },
    ['lower-body'] = {
        focus = -0.5, -- the z offset of the player position the camera will focus on
        fov = 30.0
    },
}

-- NATIONALITIES
Config.nationalities = { -- You can add or change the nationalities as you like, just add the flag SVG to ui / assets / svgs
    ['germany']         = "germany.svg",
    ['metherlands']     = "netherlands.svg",
    ['uk']              = "uk.svg",
    ['ukraine']         = "ukraine.svg",
    ['usa']             = "usa.svg",
    ['spain']           = "spain.svg",
    ['russia']          = "russia.svg",
    ['mexico']          = "mexico.svg",
    ['colombia']        = "colombia.svg",
    ['italy']           = "italy.svg",
    ['sweden']          = "sweden.svg",
    ['cuba']            = "cuba.svg",
    ['portugal']        = "portugal.svg",
    ['france']          = "france.svg",
    ['china']           = "china.svg",
    ['australia']       = "australia.svg",
    ['arabian']         = "arabian.svg",
    ['india']           = "india.svg",
    ['pakistan']        = "pakistan.svg",
}

Config.language = 'en'
Language = {}
Language.en = {
    ['gender']                  = "Gender",
    ['choose_gender']           = "Choose your Gender",
    ['parent_mother']           = "Mother",
    ['parent_father']           = "Father",
    ['dad']                     = "dad",
    ['mum']                     = "mum",
    ['similarity']              = "similarity",
    ['skin_tone']               = "Skin Tone",
    ['eye_color']               = "Eye Color",
    ['save_character']          = "Save Character",
    ['nationality']             = "Nationality",
    ['cant_leave_empty']        = "You cannot leave this step empty",
    ['name']                    = "Name",
    ['more_info']               = "More information",
    ['more_info_description']   = "Give us a little more information about your height and your date of birth",
    ['where_from']              = "Where are you from?",
    ['where_from_description']  = "This will greatly condition the attitude of your character",
    ['whats_your_name']         = "What's your name?",
    ['whats_your_name_desc']    = "In the name, only add characters and no more than 10. In the last name, only one last name.",
    ['first_name']              = "First Name",
    ['last_name']               = "Last Name",
    ['birthday']                = "Birthday",
    ['height']                  = "Height",
    ['final_step']              = "Final step",
    ['final_step_description']  = "Everything is ready. Check that you have not had any errors when filling in.",
    ['create_character']        = "CREATE NEW CHARACTER",
    ['age']                  = "Ageing",
    ['makeup']                  = "Makeup",
    ['makeup_color']            = "Makeup Color",
    ['blush']                   = "Blush",
    ['blush_color']             = "Blush Color",
    ['lipstick']                = "Lipstick",
    ['lipstick_color']          = "Lipstick Color",
    ['moles']                   = "Moles/Freckles",
    ['eyebrows']                = "Eyebrows",
    ['eyebrows_color']          = "Eyebrows Color",
    ['beard']                   = "Beard",
    ['beard_color']             = "Beard Color",
    ['mask']                    = "Mask",
    ['ears']                    = "Ears",
    ['hair']                    = "Hair",
    ['hair_color']              = "Hair Color",
    ['hair_color_2']            = "Secondary Hair Color",
    ['torso']                   = "Torso",
    ['tshirt']                  = "T-Shirt",
    ['decals']                  = "Decals",
    ['arms']                    = "Arms",
    ['pants']                   = "Pants",
    ['shoes']                   = "Shoes",
    ['bproof']                  = "Bullet Proof",
    ['chain']                   = "Chain",
    ['bags']                    = "Bag",
    ['helmet']                  = "Helmet",
    ['glasses']                 = "Glasses",
    ['watches']                 = "Watch",
    ['bracelets']               = "Bracelet",
    ['all_right']               = "All Right!",
    ['one_word_only']           = "Your name can only have 1 word",
    ['max_characters']          = "Maximum 20 characters are allowed",
    ['no_numbers']              = "You have added a number to your name",
    ['wrong_input']             = "Wrong Input",
    ['min_age']                 = "You must bbe at least 18 years old",
    ['min_size']                = "You cannot put measure less than 1 meter",
    ['max_size']                = "You cannot put measure more than 2 meter",
    ['nav_dna']                 = "DNA",
    ['nav_face']                = "FACE",
    ['nav_hair']                = "HAIR",
    ['nav_clothes']             = "CLOTHES"
}

Language.de = {
    ['gender']                  = "Geschlecht",
    ['choose_gender']           = "Wähle dein Geschlecht",
    ['parent_mother']           = "Mutter",
    ['parent_father']           = "Vater",
    ['dad']                     = "Mutter",
    ['mum']                     = "Vater",
    ['similarity']              = "gemeinsamkeit",
    ['skin_tone']               = "Hautfarbe",
    ['eye_color']               = "Augenfarbe",
    ['save_character']          = "Character speichern",
    ['nationality']             = "Nationalität",
    ['cant_leave_empty']        = "Du kannst diesen schritt nicht auslassen.",
    ['name']                    = "Name",
    ['more_info']               = "Weitere informationen",
    ['more_info_description']   = "Gib uns etwas mehr informationen über deine größe und dein Geburtsdatum",
    ['where_from']              = "Von wo kommst du?",
    ['where_from_description']  = "Dies soll das verhalten deinen Characters beeinflussen.",
    ['whats_your_name']         = "Wie lautet dein Name?",
    ['whats_your_name_desc']    = "Dein Name darf nur aus Buchstaben bestehen und nicht länger als 10 Zeichen sein. Dein Nachname sollte aus nicht mehr als 1 Namen bestehen.",
    ['first_name']              = "Vorname",
    ['last_name']               = "Nachname",
    ['birthday']                = "Geburtstag",
    ['height']                  = "Größe",
    ['final_step']              = "Letzer schritt",
    ['final_step_description']  = "Alles ist fertig. Überprüfe deine Angaben.",
    ['create_character']        = "CHARCTER ERSTELLEN",
    ['age']                     = "Alterung",
    ['makeup']                  = "Makeup",
    ['makeup_color']            = "Makeup Farbe",
    ['blush']                   = "Blush",
    ['blush_color']             = "Blush Color",
    ['lipstick']                = "Lipenstift",
    ['lipstick_color']          = "Lipenstift Farbe",
    ['moles']                   = "Muttermale/Sommersprossen",
    ['eyebrows']                = "Augenbrauen",
    ['eyebrows_color']          = "Augenbrauen Farbe",
    ['beard']                   = "Bart",
    ['beard_color']             = "Bart Farbe",
    ['mask']                    = "Maske",
    ['ears']                    = "Ohren",
    ['hair']                    = "Haare",
    ['hair_color']              = "Haar Farbe",
    ['hair_color_2']            = "Sekundäre Haar Farbe",
    ['torso']                   = "Torso",
    ['tshirt']                  = "T-Shirt",
    ['decals']                  = "Decals",
    ['arms']                    = "Arme",
    ['pants']                   = "Hose",
    ['shoes']                   = "Schuhe",
    ['bproof']                  = "Schussichere Weste",
    ['chain']                   = "Ketten",
    ['bags']                    = "Rucksack",
    ['helmet']                  = "Helm",
    ['glasses']                 = "Brille",
    ['watches']                 = "Uhr",
    ['bracelets']               = "Armband",
    ['all_right']               = "ok!",
    ['one_word_only']           = "Dein Name darf nur aus 1 Wort bestehen.",
    ['max_characters']          = "Dein Name darf nicht mehr als 20 Zeichen lang sein.",
    ['no_numbers']              = "Dein Name darf keine Zahlen enthalten.",
    ['wrong_input']             = "Falsche Eingabe.",
    ['min_age']                 = "Du musst mindestens 18 Jahre alt sein.",
    ['min_size']                = "Du kannst nicht kleiner als 1 meter sein.",
    ['max_size']                = "Du kannst nicht größer als 2 meter sein.",
    ['nav_dna']                 = "DNA",
    ['nav_face']                = "GESICHT",
    ['nav_hair']                = "HAARE",
    ['nav_clothes']             = "KLEIDUNG"
}
```

{% endcode %}
{% endtab %}

{% tab title="OPEN" %}

```lua
Open = {}

---called when a player first joins and should get his start items.
---@param serverId integer the serverId of the player who should get the start items
---@param items table a key-value table, containing itemname as key and amount as value (e.g. {"water"=2} => should give the player two water)
---@return boolean used true if this function is used
function Open:giveStartItems(serverId, items)
    -- QUASAR:
    --for item, count in pairs(items) do
    --    exports['qs-inventory']:AddItem(serverId, item, count)
    --end

    -- OX:
    -- for item, count in pairs(items) do
    --     exports.ox_inventory:AddItem(serverId, item, count)
    -- end

    return false -- IMPORTANT: change to 'true' if you are using this function
end

---called when a player created a new character
---@param serverId integer the players serverId
function Open:onCharacterCreated(serverId)
    return false -- IMPORTANT: change to 'true' if you are using this function
end

---Should call an export on the hud to hide the hud
---@param bool boolean if set to true, the hud should be hidden, if not the hud should be visible
function Open:hideHud(bool) end

---Forces the UI to stay hidden or not<br>
---can be used with `exports["forge-charcreator"]:forceHide(true)` or `exports["forge-charcreator"]:forceHide(false)`
---@param hide boolean if set to true the UI will be hidden, if not the UI will be visible, IF the UI would be visibile in the current situation
exports("forceHide", function(hide)
    UI.forceHide(hide)
end)
```

{% endtab %}

{% tab title="SERVERCONFIG" %}

```lua
---@class ServerConfig
ServerConfig = {}

---@type string? the webhook where the logs should be sent
---set to nil to disable
ServerConfig.webhook = "your_webhook_url_here" -- "https://discord.com/api/webhooks/example_webhook"

```

{% endtab %}
{% endtabs %}

{% hint style="success" %}
**If you want to edit the aesthetics or design. You have the HTML open so you can modify the style and everything as you want.**

The script is **RESPONSIVE** for all resolutions as well.
{% endhint %}


---

# Agent Instructions: 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://codeforge.gitbook.io/codeforge/sleek-series/sleek-char-creator.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.
