# Configuration

Les réglages de cette page se trouvent dans `config.lua`. Modifiez les champs des tables existantes et redémarrez la ressource pour appliquer les changements.

## Valeurs initiales et réglages enregistrés

Les boutiques et les règles de progression du fichier servent de configuration initiale. Une fois leurs valeurs enregistrées depuis le panneau d’administration, elles restent effectives après les redémarrages. Les modifier dans le fichier ne remplace pas automatiquement les valeurs enregistrées : utilisez le panneau pour mettre à jour les boutiques, les règles et les options du système déjà initialisées.

La langue, les providers, les bridges, la caméra et la tenue d’aperçu se configurent dans le fichier. Les sources et les tatouages sont décrits dans [Catalogue et packs](https://docs.cxgstudios.com/docs/fr/01-cxg-tattoos/04-catalogo.md).

## Langue globale

```lua
Config.Locale = 'es'
Config.LocaleFallback = 'en'
```

`Locale` définit la langue de l’interface et des messages pour tous les joueurs. Redémarrez la ressource après l’avoir modifié ; le joueur ne peut pas la changer depuis la NUI. `LocaleFallback` définit la langue de secours.

Langues incluses : `en`, `es`, `pt-BR`, `fr`, `de`, `it`, `pl`, `ru`, `tr`, `th` et `ar`. L’interface arabe utilise une direction de lecture de droite à gauche.

## Système d’identités

`Config.Identity` configure l’intégration au système d’identités du serveur. Ce réglage définit comment obtenir l’identifiant du personnage ou du compte que la ressource utilise pour enregistrer et récupérer les tatouages, l’XP et les blueprints.

```lua
Config.Identity.mode = 'auto'
Config.Identity.qbxResource = 'qbx_core'
```

| Mode | Utilisation |
| --- | --- |
| `auto` | Sur Qbox, utilise l’identifiant du personnage actif (`citizenid`). Sur les autres serveurs, utilise l’identifiant FiveM stable. |
| `qbx_character` | Utilise explicitement l’identifiant du personnage Qbox (`citizenid`). |
| `license` | Utilise la licence FiveM comme identifiant de compte. Les personnages de ce compte partagent leurs tatouages, leur XP et leurs blueprints. |

Choisissez le mode avant d’ouvrir la ressource aux joueurs. Le modifier ensuite change l’identité utilisée pour rechercher les données ; les données ne sont pas transférées automatiquement d’un mode à l’autre. Ne sélectionnez pas `license` si vous souhaitez séparer les tatouages entre les personnages d’un même compte.

## Notification d’interaction

```lua
Config.HelpText.enabled = true
Config.HelpText.provider = 'auto'
Config.HelpText.position = 'left-center'
```

| Champ | Valeurs ou effet |
| --- | --- |
| `enabled` | Affiche ou masque la notification d’interaction des boutiques avec marqueur. |
| `provider` | `auto`, `ox_lib` ou `native`. `auto` utilise TextUI si disponible et la notification native dans le cas contraire. |
| `position` | `left-center`, `right-center`, `top-center` ou `bottom-center` pour TextUI. |
| `style` | Couleurs, bordure, ombre, typographie et espacement intérieur de TextUI. |

Exemple de style :

```lua
Config.HelpText.style.backgroundColor = '#172328'
Config.HelpText.style.color = '#eef3f3'
Config.HelpText.style.fontSize = '15px'
```

## Boutiques initiales

`Config.Shops` comprend six emplacements. Pour modifier une entrée initiale, conservez sa structure :

```lua
{
    label = 'Tattoo Studio',
    coords = vector3(322.62, 180.34, 103.59),
    heading = 156.2,
    drawDistance = 10.0,
    interactDistance = 1.5,
    shopRadius = 4.0,
    marker = {
        type = 1,
        scale = vector3(1.0, 1.0, 1.0),
        color = { r = 255, g = 100, b = 0, a = 100 },
    },
},
```

| Champ | Utilisation |
| --- | --- |
| `label` | Nom de la boutique. |
| `coords`, `heading` | Position et orientation. |
| `drawDistance` | Distance d’affichage du marqueur. |
| `interactDistance` | Distance d’interaction. |
| `shopRadius` | Rayon dans lequel l’opération de boutique est autorisée. |
| `marker.type`, `scale`, `color` | Apparence du marqueur. |

Gardez `interactDistance` inférieur ou égal à `shopRadius`. Pour les boutiques déjà créées, utilisez la section dédiée du panneau d’administration ; ne vous attendez pas à ce qu’une modification du fichier recrée ou remplace ces boutiques.

## Niveaux et XP

| Réglage de `Config.Levels` | Valeur initiale | Utilisation |
| --- | --- | --- |
| `enabled` | `true` | Active la progression, les prérequis et les réductions. |
| `maxLevel` | `10` | Niveau maximal. |
| `defaultXpPerTattoo` | `10` | XP accordée pour un tatouage sans champ `Xp`. |
| `thresholds` | Niveaux 1 à 10 | XP cumulée nécessaire pour chaque niveau. |
| `formula.base`, `formula.exponent` | `100`, `1.5` | Paramètres de la formule alternative des seuils. |
| `zoneRequirements` | `1` pour chaque zone | Prérequis par zone en l’absence de prérequis individuel. |
| `discounts` | Activé, `3` par niveau et maximum `25` | Réduction en pourcentage. |
| `blueprintSlots` | Base `5`, incrément `3` | Nombre de blueprints selon le niveau. |

Les seuils doivent commencer au niveau 1 avec 0 XP, se suivre sans saut et augmenter la quantité d’XP requise :

```lua
Config.Levels.thresholds = {
    { level = 1, xpRequired = 0 },
    { level = 2, xpRequired = 100 },
    { level = 3, xpRequired = 250 },
}
Config.Levels.maxLevel = 3
```

La réduction est calculée comme `niveau × perLevel`, dans la limite de `maxDiscount`. Avec les valeurs initiales, le niveau 5 donne une réduction de 15 % et la réduction maximale est de 25 %.

Le nombre de places est calculé comme `base + (niveau - 1) × perLevel`. Avec la configuration initiale, le niveau 1 en compte 5 et le niveau 5 en compte 17.

Un `RequiredLevel` individuel dans le catalogue est prioritaire sur le prérequis de zone. Consultez les [champs du catalogue](https://docs.cxgstudios.com/docs/fr/01-cxg-tattoos/04-catalogo.md).

Lorsque les niveaux sont désactivés, aucune restriction de niveau, XP ni réduction ne s’applique ; la limite des blueprints utilise `Config.Blueprints.maxPerPlayer`. La désactivation du système conserve l’XP enregistrée. Dans les installations déjà initialisées, mettez également à jour l’état effectif depuis le panneau.

## Blueprints

Les blueprints enregistrent des groupes de tatouages et permettent de les partager au moyen de codes. Leurs limites initiales se trouvent dans `Config.Blueprints` :

| Champ | Valeur initiale | Utilisation |
| --- | --- | --- |
| `enabled` | `true` | Active le système. |
| `codePrefix` | `INK` | Préfixe des codes, par exemple `INK-A3X9`. |
| `codeLength` | `4` | Nombre de caractères après le préfixe. |
| `maxPerPlayer` | `20` | Nombre de places utilisé quand la progression est inactive. |
| `maxTattoosPerBlueprint` | `50` | Nombre maximal de tatouages par groupe. |
| `nameMaxLength` | `60` | Nombre maximal de caractères du nom. |

L’utilisation d’un code prépare les tatouages dans le parcours d’achat ; elle ne donne pas droit à un achat gratuit. L’économie est configurée dans [Intégrations](https://docs.cxgstudios.com/docs/fr/01-cxg-tattoos/05-integraciones.md).

## Caméra

| Table | Contrôle |
| --- | --- |
| `CameraOffsets` | Os ciblé, distance, décalages et champ de vision par zone. |
| `CameraFraming` | Composition générale et décalage du point de mise au point. |
| `CameraFramingBySide` | Réglages supplémentaires pour les vues avant et arrière. |
| `CameraManualControls` | Commandes manuelles, pas de déplacement, rotation, zoom et limites. |

Les zones configurées sont `ZONE_HEAD`, `ZONE_TORSO`, `ZONE_LEFT_ARM`, `ZONE_RIGHT_ARM`, `ZONE_LEFT_LEG` et `ZONE_RIGHT_LEG`.

Exemples de modifications ciblées :

```lua
Config.CameraOffsets['ZONE_TORSO'].fov = 50.0
Config.CameraFraming.screenOffset = 0.35
Config.CameraManualControls.enabled = true
Config.CameraManualControls.step = 0.035
Config.CameraManualControls.zoomStep = 0.08
```

Une valeur positive de `screenOffset` place le personnage vers la gauche afin de laisser de la place au menu situé à droite. `lookAtOffsetX/Y/Z` modifie le point de mise au point ; `camOffsetX/Y/Z` dans les réglages par côté modifie la position de la caméra.

Dans les commandes manuelles, `horizontalDegrees` et `rotationStepDegrees` règlent la rotation. `ranges.y/z`, `radialClamp` et `maxDistance` limitent les déplacements. `zoomCompositionMinBias` ajuste le centrage lors du zoom avant. Modifiez une valeur à la fois et testez les six zones avec des personnages masculins et féminins.

## Tenue d’aperçu

`Config.PreviewOutfit` permet de dégager les zones tatouées pendant que l’interface est ouverte :

```lua
Config.PreviewOutfit.enabled = true
Config.PreviewOutfit.useDefaultVariation = false
Config.PreviewOutfit.presets['mp_m_freemode_01'].components[11] = {
    drawable = 15,
    texture = 0,
}
```

Les presets fournis distinguent `mp_m_freemode_01` et `mp_f_freemode_01`. Chaque composant indique `drawable` et `texture` ; `clearProps` retire les accessoires pendant l’aperçu. Ajustez les index aux vêtements installés sur votre serveur. Gardez `useDefaultVariation = false` si vous voulez appliquer uniquement les composants du preset sans réinitialiser globalement l’apparence.

## Permissions, économie et Qbox

`Config.Permissions`, `Config.AdminCommand`, `Config.Purchases` et `Config.QbxMulticharacterPreview` sont expliqués dans [Intégrations](https://docs.cxgstudios.com/docs/fr/01-cxg-tattoos/05-integraciones.md). Configurez les noms réels de vos ressources lorsqu’ils diffèrent des valeurs par défaut.

## Diagnostic

`Config.Debug` active le diagnostic général. `Config.Permissions.debug` permet d’examiner les décisions d’accès. Laissez les deux options désactivées lorsque vous avez terminé.

`Config.DebugCommands.clientTattooCommand` est désactivé par défaut. Activez cette commande visuelle uniquement pour les tests : elle n’enregistre pas de tatouage et ne remplace pas un achat.

[Continuer avec le catalogue](https://docs.cxgstudios.com/docs/fr/01-cxg-tattoos/04-catalogo.md).

