# Configuración

Los ajustes de esta página están en `config.lua`. Modifica los campos de las tablas existentes y reinicia el recurso para aplicar los cambios.

## Valores iniciales y ajustes guardados

Las tiendas y reglas de progresión del archivo sirven como configuración inicial. Una vez guardadas desde el panel administrativo, sus valores efectivos se mantienen entre reinicios. Cambiarlas en el archivo no sustituye automáticamente lo guardado: utiliza el panel para actualizar tiendas, reglas y opciones del sistema ya inicializadas.

El idioma, los providers, los bridges, la cámara y la ropa de previsualización se configuran en el archivo. Las fuentes y los tatuajes se describen en [catálogo y packs](https://docs.cxgstudios.com/docs/es/01-cxg-tattoos/04-catalogo.md).

## Idioma global

```lua
Config.Locale = 'es'
Config.LocaleFallback = 'en'
```

`Locale` fija el idioma de la interfaz y de los mensajes para todos los jugadores. Reinicia el recurso después de cambiarlo; el jugador no lo cambia desde la NUI. `LocaleFallback` es el idioma de respaldo.

Idiomas incluidos: `en`, `es`, `pt-BR`, `fr`, `de`, `it`, `pl`, `ru`, `tr`, `th` y `ar`. La interfaz árabe utiliza dirección de lectura de derecha a izquierda.

## Sistema de identidades

`Config.Identity` configura la integración con el sistema de identidades del servidor. Define cómo se obtiene el identificador del personaje o de la cuenta que el recurso utiliza para guardar y recuperar tatuajes, XP y blueprints.

```lua
Config.Identity.mode = 'auto'
Config.Identity.qbxResource = 'qbx_core'
```

| Modo | Uso |
| --- | --- |
| `auto` | En Qbox, utiliza el identificador del personaje activo (`citizenid`). En otros servidores, utiliza el identificador estable de FiveM. |
| `qbx_character` | Utiliza explícitamente el identificador del personaje de Qbox (`citizenid`). |
| `license` | Utiliza la licencia de FiveM como identificador de cuenta. Los personajes de esa cuenta comparten tatuajes, XP y blueprints. |

Selecciona el modo antes de abrir el recurso a los jugadores. Cambiarlo después cambia la identidad con la que se consultan los datos; no traslada automáticamente los datos entre modos. No selecciones `license` si quieres separar los tatuajes entre personajes de una cuenta.

## Aviso de interacción

```lua
Config.HelpText.enabled = true
Config.HelpText.provider = 'auto'
Config.HelpText.position = 'left-center'
```

| Campo | Valores o efecto |
| --- | --- |
| `enabled` | Muestra u oculta el aviso de interacción de tiendas con marcador. |
| `provider` | `auto`, `ox_lib` o `native`. `auto` utiliza TextUI si está disponible y el aviso nativo en caso contrario. |
| `position` | `left-center`, `right-center`, `top-center` o `bottom-center`, para TextUI. |
| `style` | Colores, borde, sombra, tipografía y espacio interior del TextUI. |

Ejemplo de estilo:

```lua
Config.HelpText.style.backgroundColor = '#172328'
Config.HelpText.style.color = '#eef3f3'
Config.HelpText.style.fontSize = '15px'
```

## Tiendas iniciales

`Config.Shops` incluye seis ubicaciones. Para cambiar una entrada inicial, conserva su estructura:

```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 },
    },
},
```

| Campo | Uso |
| --- | --- |
| `label` | Nombre de la tienda. |
| `coords`, `heading` | Posición y orientación. |
| `drawDistance` | Distancia de visualización del marcador. |
| `interactDistance` | Distancia para interactuar. |
| `shopRadius` | Radio dentro del que se autoriza la operación de tienda. |
| `marker.type`, `scale`, `color` | Apariencia del marcador. |

Mantén `interactDistance` dentro de `shopRadius`. Para tiendas ya creadas, utiliza la sección de tiendas del panel administrativo; no esperes que una edición del archivo vuelva a crear o sustituya esas tiendas.

## Niveles y XP

| Ajuste de `Config.Levels` | Valor inicial | Uso |
| --- | --- | --- |
| `enabled` | `true` | Activa progresión, requisitos y descuentos. |
| `maxLevel` | `10` | Límite de nivel. |
| `defaultXpPerTattoo` | `10` | XP de un tatuaje que no indique `Xp`. |
| `thresholds` | Niveles 1 a 10 | XP acumulada necesaria para cada nivel. |
| `formula.base`, `formula.exponent` | `100`, `1.5` | Parámetros de la fórmula alternativa de umbrales. |
| `zoneRequirements` | `1` para cada zona | Requisito por zona cuando no exista un requisito individual. |
| `discounts` | Activado, `3` por nivel y máximo `25` | Descuento porcentual. |
| `blueprintSlots` | Base `5`, incremento `3` | Cupos de blueprints según el nivel. |

Los umbrales deben comenzar en nivel 1 con 0 XP, continuar sin saltos y aumentar la XP necesaria:

```lua
Config.Levels.thresholds = {
    { level = 1, xpRequired = 0 },
    { level = 2, xpRequired = 100 },
    { level = 3, xpRequired = 250 },
}
Config.Levels.maxLevel = 3
```

El descuento se calcula como `nivel × perLevel`, limitado por `maxDiscount`. Con los valores iniciales, nivel 5 obtiene un 15 % y el descuento máximo es un 25 %.

Los cupos se calculan como `base + (nivel - 1) × perLevel`. Con la configuración inicial, nivel 1 dispone de 5 y nivel 5 de 17.

Un `RequiredLevel` individual del catálogo tiene prioridad sobre el requisito de zona. Consulta [campos del catálogo](https://docs.cxgstudios.com/docs/es/01-cxg-tattoos/04-catalogo.md).

Al desactivar los niveles, no se aplican bloqueos por nivel, XP ni descuentos; el límite de blueprints utiliza `Config.Blueprints.maxPerPlayer`. Desactivar el sistema conserva la XP guardada. En instalaciones ya inicializadas, actualiza también el estado efectivo desde el panel.

## Blueprints

Los blueprints guardan grupos de tatuajes y permiten compartirlos mediante códigos. Sus límites iniciales están en `Config.Blueprints`:

| Campo | Valor inicial | Uso |
| --- | --- | --- |
| `enabled` | `true` | Activa el sistema. |
| `codePrefix` | `INK` | Prefijo de los códigos, por ejemplo `INK-A3X9`. |
| `codeLength` | `4` | Número de caracteres después del prefijo. |
| `maxPerPlayer` | `20` | Cupos utilizados cuando no hay progresión activa. |
| `maxTattoosPerBlueprint` | `50` | Máximo de tatuajes por grupo. |
| `nameMaxLength` | `60` | Máximo de caracteres del nombre. |

Canjear un código prepara los tatuajes en el flujo de compra; no concede una compra gratuita. La economía se configura en [integraciones](https://docs.cxgstudios.com/docs/es/01-cxg-tattoos/05-integraciones.md).

## Cámara

| Tabla | Qué controla |
| --- | --- |
| `CameraOffsets` | Hueso objetivo, distancia, offsets y campo de visión por zona. |
| `CameraFraming` | Composición general y desplazamiento del punto de enfoque. |
| `CameraFramingBySide` | Ajustes adicionales para vistas frontal y trasera. |
| `CameraManualControls` | Controles manuales, pasos de movimiento, rotación, zoom y límites. |

Las zonas configuradas son `ZONE_HEAD`, `ZONE_TORSO`, `ZONE_LEFT_ARM`, `ZONE_RIGHT_ARM`, `ZONE_LEFT_LEG` y `ZONE_RIGHT_LEG`.

Ejemplos de cambios puntuales:

```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
```

`screenOffset` positivo deja al personaje hacia la izquierda para reservar espacio al menú situado a la derecha. `lookAtOffsetX/Y/Z` cambia el punto de enfoque; `camOffsetX/Y/Z` de los ajustes por lado cambia la posición de cámara.

En controles manuales, `horizontalDegrees` y `rotationStepDegrees` ajustan la rotación. `ranges.y/z`, `radialClamp` y `maxDistance` limitan desplazamientos. `zoomCompositionMinBias` ajusta el centrado al acercar el zoom. Cambia un valor cada vez y prueba las seis zonas con personajes masculinos y femeninos.

## Ropa de previsualización

`Config.PreviewOutfit` permite despejar las zonas tatuadas mientras está abierta la interfaz:

```lua
Config.PreviewOutfit.enabled = true
Config.PreviewOutfit.useDefaultVariation = false
Config.PreviewOutfit.presets['mp_m_freemode_01'].components[11] = {
    drawable = 15,
    texture = 0,
}
```

Los presets incluidos distinguen `mp_m_freemode_01` y `mp_f_freemode_01`. Cada componente indica `drawable` y `texture`; `clearProps` retira accesorios durante la previsualización. Ajusta los índices a la ropa instalada en tu servidor. Mantén `useDefaultVariation = false` si solo quieres aplicar los componentes del preset sin resetear globalmente la apariencia.

## Permisos, economía y Qbox

`Config.Permissions`, `Config.AdminCommand`, `Config.Purchases` y `Config.QbxMulticharacterPreview` se explican en [integraciones](https://docs.cxgstudios.com/docs/es/01-cxg-tattoos/05-integraciones.md). Configura los nombres reales de tus recursos cuando difieran de los predeterminados.

## Diagnóstico

`Config.Debug` activa diagnóstico general. `Config.Permissions.debug` permite revisar decisiones de acceso. Mantén ambos desactivados al terminar.

`Config.DebugCommands.clientTattooCommand` está desactivado inicialmente. Activa ese comando visual únicamente para pruebas: no guarda tatuajes ni sustituye una compra.

[Continuar con el catálogo](https://docs.cxgstudios.com/docs/es/01-cxg-tattoos/04-catalogo.md).
