> For the complete documentation index, see [llms.txt](https://docs.cuxial.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.cuxial.com/scripts/es/nucleo/cuxial-interactions/configuration.md).

# Configuración

Todas las opciones de Cuxial Interactions explicadas: config, conjuntos de NPC y cómo escribir tu propio NPC.

El comportamiento está en `shared/config.lua`. Los NPC están en `data/`, un archivo por conjunto. Reinicia el recurso después de cualquier cambio.

## General

| Opción        | Tipo         | Por defecto  | Qué hace                                                                                                                                                                                                                                                                                              |
| ------------- | ------------ | ------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `debug`       | boolean      | `false`      | Escribe trazas en la consola: puntos registrados, tiendas registradas, ventas. También se activa poniendo la convar `cuxial_interactions_debug` a `1`.                                                                                                                                                |
| `ui.accent`   | string (hex) | configurable | Color de acento del diálogo y de la tienda.                                                                                                                                                                                                                                                           |
| `interaction` | string       | `'target'`   | Cómo inicia el jugador una conversación, en los puntos que no indican el suyo. `'target'` = opción de tu recurso de target. `'sprite'` = aviso de tecla sobre el NPC; necesita `bl_sprites` arrancado, si no se usa el target. `'none'` = sin opción; el punto solo se abre con el export `Interact`. |

## Target · `target`

| Opción     | Tipo   | Por defecto             | Qué hace                                                                          |
| ---------- | ------ | ----------------------- | --------------------------------------------------------------------------------- |
| `icon`     | string | `'fas fa-comment-dots'` | Clase Font Awesome de la opción de target, en los puntos sin `targetIcon`.        |
| `distance` | number | `2.5`                   | Metros desde los que se puede usar la opción, en los puntos sin `activeDistance`. |

## Aviso de tecla · `sprite`

Solo se usa con `interaction = 'sprite'`.

| Opción     | Tipo   | Por defecto | Qué hace                                                                                 |
| ---------- | ------ | ----------- | ---------------------------------------------------------------------------------------- |
| `key`      | string | `'E'`       | Letra que se dibuja en el aviso.                                                         |
| `control`  | number | `38`        | Control de GTA que abre la conversación. `38` es <kbd>E</kbd>. Cámbialo junto con `key`. |
| `shape`    | string | `'hex'`     | Forma del aviso, se pasa a `bl_sprites`.                                                 |
| `distance` | number | `2.5`       | Metros desde los que reacciona el aviso, en los puntos sin `activeDistance`.             |

{% hint style="info" %}
Los puntos sin ped usan siempre el target, también en modo sprite.
{% endhint %}

## NPC · `npc`

| Opción          | Tipo   | Por defecto           | Qué hace                                                                                                         |
| --------------- | ------ | --------------------- | ---------------------------------------------------------------------------------------------------------------- |
| `spawnDistance` | number | `60.0`                | Metros a los que se crea y se quita el ped, en los puntos sin `spawnDistance` propio.                            |
| `zOffset`       | number | `-1.0`                | Se suma a la Z de `coords` al crear el ped. Con `-1.0` puedes pegar las coordenadas tomadas de pie en el sitio.  |
| `modelTimeout`  | number | `5000`                | Milisegundos de espera a que cargue el modelo del ped.                                                           |
| `animTimeout`   | number | `2000`                | Milisegundos de espera a que cargue un diccionario de animación.                                                 |
| `fallbackModel` | string | `'a_m_y_business_01'` | Modelo que se usa cuando un punto no tiene modelo o el suyo no existe.                                           |
| `watchInterval` | number | `1000`                | Milisegundos entre comprobaciones de los puntos colgados de un ped creado por otro recurso (`entity` / `netId`). |

## Cámara · `camera`

| Opción       | Tipo    | Por defecto | Qué hace                                                                                                                                                          |
| ------------ | ------- | ----------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `enabled`    | boolean | `true`      | `true` lleva la cámara delante del NPC mientras se habla. `false` mantiene la cámara del jugador. Un punto puede desactivarla para sí mismo con `camera = false`. |
| `forward`    | number  | `1.2`       | Metros por delante del NPC donde se coloca la cámara.                                                                                                             |
| `height`     | number  | `0.52`      | Metros por encima de la posición del NPC.                                                                                                                         |
| `yawOffset`  | number  | `181.0`     | Grados que se suman a la rotación del NPC para que la cámara lo mire.                                                                                             |
| `transition` | number  | `2000`      | Milisegundos de la transición de cámara, al entrar y al salir.                                                                                                    |
| `settle`     | number  | `1500`      | Milisegundos que espera la ventana antes de aparecer, para que la cámara llegue primero.                                                                          |

La cámara solo se activa cuando el punto tiene ped. Los puntos sin ped abren la ventana al momento.

## Diálogo · `dialog`

| Opción              | Tipo    | Por defecto | Qué hace                                                                                                                                             |
| ------------------- | ------- | ----------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
| `hidePlayer`        | boolean | `true`      | `true` vuelve invisible al ped del jugador mientras la ventana está abierta, para que no tape la cámara. `false` lo deja visible.                    |
| `hideDelay`         | number  | `2000`      | Milisegundos desde que se abre hasta que se oculta al jugador.                                                                                       |
| `textSpeed`         | number  | `25`        | Milisegundos por carácter del efecto de escritura, en las páginas sin `textSpeed` propio.                                                            |
| `conditionInterval` | number  | `500`       | Milisegundos durante los que se reutiliza el resultado de las condiciones de un punto (`job`, `item`, `canInteract`) antes de volver a comprobarlas. |

## Tienda · `shop`

| Opción        | Tipo   | Por defecto                               | Qué hace                                                                                                     |
| ------------- | ------ | ----------------------------------------- | ------------------------------------------------------------------------------------------------------------ |
| `account`     | string | `'cash'`                                  | Cuenta en la que se paga la venta, en las tiendas sin cuenta propia: `'cash'`, `'bank'` o `'black_money'`.   |
| `currency`    | string | `'$'`                                     | Símbolo que se muestra junto a los precios y en la notificación de venta.                                    |
| `maxDistance` | number | `6.0`                                     | Metros desde la tienda dentro de los que el servidor acepta una venta, en las tiendas sin `distance` propia. |
| `maxQuantity` | number | `1000`                                    | Máximo de unidades en una sola venta.                                                                        |
| `cooldown`    | number | `300`                                     | Milisegundos que un jugador debe esperar entre dos ventas.                                                   |
| `image`       | string | `'nui://ox_inventory/web/images/%s.webp'` | Imagen de un objeto sin `image` propia. `%s` es el nombre del objeto.                                        |

## Aspecto de jugadores · `skins`

Lo usan los puntos con `usePlayerSkin = true`.

| Opción         | Tipo   | Por defecto           | Qué hace                                                                                                                                                                                                    |
| -------------- | ------ | --------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `resource`     | string | `'cuxial_appearance'` | Recurso que aplica la apariencia al ped. Si no está arrancado, el ped conserva el modelo base.                                                                                                              |
| `activeDays`   | number | `7`                   | Solo se usan personajes jugados en los últimos días indicados aquí.                                                                                                                                         |
| `pool`         | number | `8`                   | Apariencias que se cargan la primera vez que hace falta una y se conservan hasta reiniciar el recurso. El recurso carga más si los conjuntos de `data/` tienen más NPC con `usePlayerSkin` que este número. |
| `defaultModel` | string | `'mp_m_freemode_01'`  | Modelo que se usa cuando una apariencia guardada no trae modelo.                                                                                                                                            |
| `retry`        | number | `60`                  | Segundos hasta que el servidor vuelve a buscar cuando no encontró ninguna apariencia.                                                                                                                       |

## Médico NPC de pago · `maria`

Un servicio que reanima al jugador a cambio de dinero cuando hay pocos médicos de servicio. Lo usan los botones del conjunto de ejemplo `Doctor`, que viene desactivado, a través del callback de servidor `cuxial_interactions:server:ReviveNpc`, que devuelve `true` cuando se atendió al jugador.

| Opción        | Tipo   | Por defecto                                                | Qué hace                                                                                                                                                       |
| ------------- | ------ | ---------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `cost`        | number | `1200`                                                     | Precio del servicio.                                                                                                                                           |
| `account`     | string | `'bank'`                                                   | Cuenta de la que se cobra.                                                                                                                                     |
| `job`         | string | `'ambulance'`                                              | Trabajo cuyos miembros de servicio se cuentan.                                                                                                                 |
| `maxOnDuty`   | number | `2`                                                        | Con este número de médicos de servicio, o más, el NPC se niega y manda al jugador a un hospital.                                                               |
| `revive`      | table  | `{ resource = 'cuxial_medical', export = 'RevivePlayer' }` | Export de servidor al que se llama para reanimar al jugador. Si el recurso no está arrancado, el servicio no cobra. Si el export falla, se devuelve el dinero. |
| `set`         | string | `'Doctor'`                                                 | Conjunto de `data/` cuyos NPC ofrecen el servicio. Si ese conjunto está desactivado, no se atiende a nadie.                                                    |
| `maxDistance` | number | `8.0`                                                      | Metros desde uno de esos NPC dentro de los que el servidor acepta la petición.                                                                                 |

## Conjuntos de NPC · `sets`

Cada clave es el nombre de un archivo de `data/`, sin `.lua`. `true` carga el archivo; `false`, o no poner la clave, lo ignora.

{% code title="shared/config.lua" %}

```lua
sets = {
    Greeter = true,
    Buyer = true,
    Doctor = false,
},
```

{% endcode %}

Los conjuntos que vienen con el recurso son ejemplos: cambia sus coordenadas, textos, trabajos y objetos, o desactívalos y escribe los tuyos.

## Escribir un NPC

Un archivo de datos devuelve una tabla. Cada clave es un NPC; su valor es la definición del punto.

{% code title="data/MisNpc.lua" %}

```lua
return {
    Chatarrero = {
        coords = vec4(25.7, -1347.3, 29.49, 271.0),
        model = 's_m_y_dealer_01',
        scenario = 'WORLD_HUMAN_STAND_IMPATIENT',
        behavior = { invincible = true, noTemporaryEvents = true, freeze = true },
        label = 'Hablar con el comprador',
        activeDistance = 2.5,
        blip = { id = 52, scale = 0.6, colour = 5, name = 'Chatarrero' },

        shop = {
            name = 'Sam',
            job = 'Comprador',
            items = {
                { name = 'scrapmetal', price = 12 },
                { name = 'copper', label = 'Cable de cobre', price = 20 },
            },
        },

        dialog = {
            {
                id = 'inicio',
                name = 'Sam',
                job = 'Comprador',
                text = '¿Traes algo para mí?',
                buttons = {
                    { id = 'vender', label = 'Enseñar lo que llevo', icon = 'hand-coins', shop = true },
                    { id = 'adios', label = 'Hoy no', icon = 'x', close = true },
                },
            },
        },
    },
}
```

{% endcode %}

Después activa el conjunto:

{% code title="shared/config.lua" %}

```lua
sets = {
    MisNpc = true,
},
```

{% endcode %}

Lo que conviene saber de los archivos de datos:

* El id de cada punto es `<Archivo>_<Clave>`. El del ejemplo es `MisNpc_Chatarrero`.
* Una tienda escrita en un archivo de datos se registra sola en el servidor, en las coordenadas de su punto. Dentro de `shop` puedes poner además `account` y `distance` solo para esa tienda.
* Los nombres de los objetos deben existir en `ox_inventory`. Un objeto sin `label` toma el nombre del inventario.
* Una tienda solo compra. El jugador vende objetos al NPC y recibe dinero.
* El archivo se carga en el cliente y en el servidor. Las funciones como `onSelect` solo se ejecutan en el cliente; no llames a natives de cliente fuera de una función.
* Pon `enabled = false` en un punto, una página o un botón para desactivarlo sin borrarlo.

Todos los campos de un punto, una página, un botón y una tienda están en [Exports y eventos](/scripts/es/nucleo/cuxial-interactions/developers.md).

## Cambios habituales

### Hablar con una tecla en lugar del target

{% code title="shared/config.lua" %}

```lua
interaction = 'sprite',
```

{% endcode %}

`bl_sprites` debe estar arrancado. Para cambiar un solo NPC, pon `interaction = 'sprite'` en su definición.

### Quitar la cámara

{% code title="shared/config.lua" %}

```lua
camera = {
    enabled = false,
},
dialog = {
    hidePlayer = false,
},
```

{% endcode %}

Deja las demás claves de los dos bloques como están.

### Pagar las ventas en el banco

{% code title="shared/config.lua" %}

```lua
shop = {
    account = 'bank',
},
```

{% endcode %}

### Limitar un NPC a un trabajo

{% code title="data/MisNpc.lua" %}

```lua
Chatarrero = {
    job = { police = 2 },   -- police, grado 2 o superior
    -- ...
},
```

{% endcode %}


---

# 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 by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.cuxial.com/scripts/es/nucleo/cuxial-interactions/configuration.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

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.
