# Configurar GTFAT

Edita `config.lua` y reinicia `CXG_GTFAT`. Los valores de peso se declaran en kilogramos y deben ajustarse a una cuadrícula válida.

## Idioma y peso

```lua
Config.Locale = 'es'

Config.Weight = {
    minKg = 50,
    maxKg = 180,
    defaultKg = 75,
    fatThresholdKg = 100,
    stepKg = 0.5,
}
```

Idiomas disponibles: en, es, `pt-BR`, fr, de, it, pl, ru, tr, th, ar, sv y br. br conserva los textos de portugués brasileño antiguo; para la selección normal se recomienda `pt-BR`.

El peso inicial admite 50–180 kg, empieza en 75 kg y activa Fat desde 100 kg inclusive. `minKg` debe ser mayor o igual que cero; `stepKg` debe ser positivo, y se requiere `minKg` <= `defaultKg` <= `maxKg`. El umbral debe ser mayor que el mínimo y no superar el máximo. El peso inicial, el umbral y el máximo deben estar en la cuadrícula que comienza en `minKg`; por ejemplo, con mínimo 50 kg y paso 0,5 kg, son válidos 75 y 100 kg. Una configuración inválida desactiva las operaciones de peso.

La unidad LB convierte solo la presentación. El servidor guarda y valida valores en kg.

## Comandos y permisos

```lua
Config.Commands = {
    enabled = true,
    access = 'ace',
    ace = 'cxg_gtfat.use',
    job = nil,
    group = nil,
    custom = nil,
    open = 'fatweight',
    control = 'fatdecal',
}
```

enabled registra los comandos configurados. El comando de apertura predeterminado es `/fatweight`; el de control es `/fatdecal`. El control acepta on, off, status o ui. on ajusta el peso al menos al umbral Fat; off lo deja como máximo un paso por debajo. No son interruptores gráficos independientes.

| access               | Comportamiento                                                                                           |
| -------------------- | -------------------------------------------------------------------------------------------------------- |
| ace                  | Exige el permiso `ACE` indicado por ace. Es el valor predeterminado.                                     |
| everyone             | Permite el uso a cualquier jugador que cumpla las comprobaciones del servidor.                           |
| jobs, groups, custom | Requiere implementar la política en `bridge/server.lua`; no está conectada automáticamente al framework. |

Para dar acceso `ACE` a administradores:

```cfg
add_ace group.admin cxg_gtfat.use allow
```

Un menú o target puede solicitar abrir la interfaz, pero la autorización sigue comprobándose en el servidor. Desactivar el registro de comandos no impide que otro recurso de servidor use el export `OpenWeightUI`.

## Estaciones

No se habilita ninguna báscula física al instalar. Copia la entrada `gym_scale` dentro de `Config.Stations`, usa una clave única, completa las coordenadas reales y activa enabled.

```lua
Config.Interaction = {
    key = 'E',
    streamDistance = 60.0,
}

Config.Stations = {
    gimnasio = {
        enabled = true,
        coords = { x = 0.0, y = 0.0, z = 0.0 },
        heading = 0.0,
        distance = 1.8,
        bucket = 0,
        access = 'ace',
        ace = 'cxg_gtfat.use',
        job = nil,
        group = nil,
        custom = nil,
        model = false,
        spawnProp = false,
    },
}
```

Sustituye las coordenadas de ejemplo. El alcance distance admite hasta 5 metros. bucket debe coincidir con el routing bucket de la estación; normalmente es 0. Cada estación tiene su propia política access.

| Modalidad                | Ajustes                                      | Resultado                                                                                     |
| ------------------------ | -------------------------------------------- | --------------------------------------------------------------------------------------------- |
| Punto sin objeto         | model = false, `spawnProp` = false           | Interacción invisible en las coordenadas configuradas.                                        |
| Objeto existente         | model = 'nombre_modelo', `spawnProp` = false | Requiere encontrar ese modelo dentro de 1 metro de las coordenadas. El recurso no lo elimina. |
| Objeto creado localmente | model = 'nombre_modelo', `spawnProp` = true  | Crea un objeto congelado local al acercarse y lo retira al alejarse o detener el recurso.     |

El punto de interacción no coloca el objeto en el suelo automáticamente. Ajusta coords al origen real del objeto y heading a su orientación. El aviso usa E por defecto y el jugador puede reasignar “Usar báscula” en Ajustes de FiveM > Asignación de teclas.

El adaptador predeterminado permite ace y everyone. Las otras modalidades requieren una implementación de servidor. Mostrar un aviso o un prop no concede permiso; el servidor vuelve a validar el acceso y la proximidad.

## Persistencia por personaje

```lua
Config.Persistence = { framework = 'none' }
```

| Modo   | Uso                                                                        |
| ------ | -------------------------------------------------------------------------- |
| none   | Predeterminado. Solo sesión; al reconectar o reiniciar se usa `defaultKg`. |
| qb     | Resuelve el personaje mediante qb-core y su citizenid.                     |
| esx    | Resuelve el personaje mediante es_extended y su identificador.             |
| custom | Usa `GTFatCustomCharacterId`(source) en `identity.lua`.                    |

El recurso no detecta Qbox automáticamente. Para varios personajes, configura un identificador estable y único para cada uno mediante una opción compatible o un adaptador propio. No uses un identificador compartido entre personajes ni aceptes una identidad enviada por el cliente. En custom, devuelve nil hasta que el personaje esté cargado.

El peso persistido se guarda separado de la ropa y los outfits. Conserva el nombre de recurso `CXG_GTFAT` y haz copias de seguridad del almacenamiento `KVP` del servidor junto al resto de los datos persistentes.
