> For the complete documentation index, see [llms.txt](https://wiki.qfdevelopers.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://wiki.qfdevelopers.com/scripts/editor-3/additional-informations.md).

# Additional Informations

#### Core Features

* **Native Overrides:** Acts as a master provider for `skinchanger` and `illenium-appearance`, ensuring 100% compatibility with older third-party scripts.
* **Unified Interface:** One cohesive UI handling clothes, DNA, parents, makeup, props, and tattoos.
* **Photo Studio:** Leverages `screenshot-basic` to take actual mugshots of the player's ped for Wardrobe saves.
* **Dynamic Peds:** Natively supports switching to animal peds, custom addon peds, or specific multiplayer models, locked behind admin permissions.

#### UI Assets & Rendering Tools

To capture high-quality previews of clothes, props, and peds for custom wardrobe thumbnails, items, or UI assets, we recommend the open-source [**fivem-greenscreener**](https://github.com/Bentix-cs/fivem-greenscreener) tool. This script allows you to isolate and photograph peds or clothing items against a solid color backdrop (green screen) for seamless background removal, providing a clean and professional look for your server's custom asset library.

#### Developer API (Exports & Events)

`qf_skinmenu_v2` provides a rich developer API through client-side exports, client events, and legacy wrappers. You can choose the integration method that fits your codebase:

{% tabs %}
{% tab title="Client Exports" %}

#### 1. Appearance & Model Handlers

**getPedAppearance**

* **Usage:** Retrieves the complete appearance configuration of a specific ped (DNA, face features, clothing, tattoos).
* **Syntax:** `exports['qf_skinmenu_v2']:getPedAppearance(ped)`
* **Returns:** `table` representing the full appearance payload.

```lua
-- Example: Save player appearance to a custom database or backup table
local playerPed = PlayerPedId()
local appearanceData = exports['qf_skinmenu_v2']:getPedAppearance(playerPed)

-- Print the hair texture index from appearance payload
print("Active Hair Model: " .. tostring(appearanceData.hair_1))
```

**setPlayerAppearance**

* **Usage:** Applies a complete appearance payload directly to the local player's character.
* **Syntax:** `exports['qf_skinmenu_v2']:setPlayerAppearance(appearance)`

```lua
-- Example: Reload a previously saved appearance on spawn
local savedAppearance = TriggerServerCallback('getSavedAppearance') -- Custom callback
if savedAppearance then
    exports['qf_skinmenu_v2']:setPlayerAppearance(savedAppearance)
end
```

**setPedAppearance**

* **Usage:** Applies an appearance payload to a specific ped entity (such as NPCs, dummies, or showroom targets).
* **Syntax:** `exports['qf_skinmenu_v2']:setPedAppearance(ped, appearance)`

```lua
-- Example: Applying appearance payload to a dummy ped inside a showroom
local dummyPed = CreatePed(4, `mp_m_freemode_01`, coords.x, coords.y, coords.z, heading, false, false)
exports['qf_skinmenu_v2']:setPedAppearance(dummyPed, appearanceData)
```

***

#### 2. Ped Variations (Components & Props)

**getPedComponents**

* **Usage:** Retrieves an array of all clothing components currently equipped on the ped (torso, pants, undershirt, etc.).
* **Syntax:** `exports['qf_skinmenu_v2']:getPedComponents(ped)`
* **Returns:** `table` array containing the component ID, drawable, and texture.

```lua
-- Example structure returned:
-- { { component_id = 1, drawable = 4, texture = 2 }, ... }

local playerPed = PlayerPedId()
local components = exports['qf_skinmenu_v2']:getPedComponents(playerPed)

for _, comp in ipairs(components) do
    print(string.format("Component ID: %d | Drawable: %d | Texture: %d", comp.component_id, comp.drawable, comp.texture))
end
```

**setPedComponents**

* **Usage:** Programmatically applies a set of clothing components to a ped.
* **Syntax:** `exports['qf_skinmenu_v2']:setPedComponents(ped, components)`

```lua
-- Example: Equip a specific uniform setup
local policeUniform = {
    { component_id = 11, drawable = 55, texture = 0 }, -- Torso jacket
    { component_id = 4, drawable = 32, texture = 1 }   -- Pants
}
exports['qf_skinmenu_v2']:setPedComponents(PlayerPedId(), policeUniform)
```

**getPedProps**

* **Usage:** Retrieves an array of all props currently equipped on a ped (helmet, glasses, watch, bracelets, ears).
* **Syntax:** `exports['qf_skinmenu_v2']:getPedProps(ped)`
* **Returns:** `table` array containing the prop ID, drawable, and texture.

```lua
-- Example structure returned:
-- { { prop_id = 0, drawable = 12, texture = 0 }, ... }

local props = exports['qf_skinmenu_v2']:getPedProps(PlayerPedId())
for _, prop in ipairs(props) do
    print(string.format("Prop ID: %d | Drawable: %d | Texture: %d", prop.prop_id, prop.drawable, prop.texture))
end
```

**setPedProps**

* **Usage:** Programmatically applies specific props to a ped (or removes them by passing drawable `-1`).
* **Syntax:** `exports['qf_skinmenu_v2']:setPedProps(ped, props)`

```lua
-- Example: Put on police hat and sunglasses (Prop ID 0 = Helmet, Prop ID 1 = Glasses)
local policeProps = {
    { prop_id = 0, drawable = 46, texture = 0 },
    { prop_id = 1, drawable = 2, texture = 0 }
}
exports['qf_skinmenu_v2']:setPedProps(PlayerPedId(), policeProps)
```

***

#### 3. Face, Hair & Head Blend Features

**getPedHair**

* **Usage:** Retrieves styling and color properties of the ped's hair.
* **Syntax:** `exports['qf_skinmenu_v2']:getPedHair(ped)`
* **Returns:** `table` representing style, colors, and highlights.

```lua
-- Example structure returned:
-- { style = 12, color = 4, highlight = 2, texture = 0 }

local hairInfo = exports['qf_skinmenu_v2']:getPedHair(PlayerPedId())
print(string.format("Hair Style: %d | Main Color ID: %d", hairInfo.style, hairInfo.color))
```

**getPedHeadBlend**

* **Usage:** Retrieves genetic blending details of the face (mom/dad shapes and skin tones).
* **Syntax:** `exports['qf_skinmenu_v2']:getPedHeadBlend(ped)`
* **Returns:** `table` representing parent blend indices and mix values.

```lua
-- Example structure returned:
-- { shapeFirst = 2, shapeSecond = 5, skinFirst = 2, skinSecond = 2, shapeMix = 1.0, skinMix = 1.0 }

local blendData = exports['qf_skinmenu_v2']:getPedHeadBlend(PlayerPedId())
```

***

#### 4. Interactive UI & Camera Controls

**IsMenuOpen**

* **Usage:** Checks if the player is currently inside the skin menu UI.
* **Syntax:** `exports['qf_skinmenu_v2']:IsMenuOpen()`
* **Returns:** `boolean` (`true`/`false`).

```lua
-- Example: Block action commands while customizing character
RegisterCommand('robstore', function()
    if exports['qf_skinmenu_v2']:IsMenuOpen() then
        exports['qf_skinmenu_v2']:ShowNotification("You cannot do this while in the clothing menu!")
        return
    end
    -- Trigger robbery logic
end)
```

**OpenWardrobe**

* **Usage:** Programmatically opens the player's saved wardrobe list.
* **Syntax:** `exports['qf_skinmenu_v2']:OpenWardrobe()`

```lua
-- Example: Open wardrobe list when selecting wardrobe target in housing script
RegisterNetEvent('myHousing:openCloset', function()
    exports['qf_skinmenu_v2']:OpenWardrobe()
end)
```

{% endtab %}

{% tab title="Client Events" %}
You can programmatically open customization menus using standard client events:

```lua
-- CLIENT-SIDE EXAMPLES

-- 1. Open the Full Character Creator (Typically triggered by your multicharacter script)
-- Takes success callback as the first argument, and cancel callback as the second.
TriggerEvent('qf_skinmenu_v2:openCreationMenu', function()
    print("Player finished and saved their character appearance!")
end, function()
    print("Player cancelled the character appearance creator!")
end)

-- 2. Open a specialized shop type manually (e.g., via a target system or radial menu)
-- Valid types: 'clothing', 'barber', 'tattoo', 'surgeon'
TriggerEvent('qf_skinmenu_v2:openShop', 'clothing')
```

{% endtab %}

{% tab title="Legacy Compatibility" %}
Because `qf_skinmenu_v2` registers as a provider for older systems, you do **not** need to rewrite your job scripts, wardrobes, or faction lockers. The following legacy wrappers will be intercepted and processed flawlessly:

```lua
-- CLIENT-SIDE EXAMPLES

-- Simulating illenium-appearance / fivem-appearance export
exports['illenium-appearance']:startPlayerCustomization(function(appearance)
    if appearance then
        print("Appearance saved successfully!")
    else
        print("Player cancelled customization.")
    end
end, {
    ped = true, headBlend = true, faceFeatures = true,
    headOverlays = true, components = true, props = true
})

-- Simulating skinchanger fetch
TriggerEvent('skinchanger:getSkin', function(skin)
    print("Player's current torso: " .. (skin.torso_1 or 0))
end)
```

{% endtab %}
{% endtabs %}

***

#### Frequently Asked Questions (Q\&A)

**Q: Can I use this alongside illenium-appearance?**\
A: **Absolutely not.** This script entirely replaces `illenium-appearance`. If both are running, the game engine will encounter fatal synchronization errors. `qf_skinmenu_v2` handles all appearance logic.

**Q: How do I add custom addon clothes (EUP)?**\
A: Stream your EUP files to your server as you normally would. The script dynamically reads all available clothing components directly from the GTA V engine at runtime. Any properly streamed clothing will automatically populate in the menu.

**Q: Why are wardrobe images failing to save?**\
A: This usually indicates an issue with `screenshot-basic`. Ensure it is updated. If you are using `Config.ImageSource = "remote"`, verify that your `RemoteImagePath` is a valid, accessible backend capable of receiving POST requests for image data.


---

# 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://wiki.qfdevelopers.com/scripts/editor-3/additional-informations.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.
