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 E. 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. |
Los puntos sin ped usan siempre el target, también en modo sprite.
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.
sets = {
Greeter = true,
Buyer = true,
Doctor = false,
},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.
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 },
},
},
},
},
}Después activa el conjunto:
sets = {
MisNpc = true,
},Lo que conviene saber de los archivos de datos:
- El id de cada punto es
<Archivo>_<Clave>. El del ejemplo esMisNpc_Chatarrero. - Una tienda escrita en un archivo de datos se registra sola en el servidor, en las coordenadas de su punto. Dentro de
shoppuedes poner ademásaccountydistancesolo para esa tienda. - Los nombres de los objetos deben existir en
ox_inventory. Un objeto sinlabeltoma 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
onSelectsolo se ejecutan en el cliente; no llames a natives de cliente fuera de una función. - Pon
enabled = falseen 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.
Cambios habituales
Hablar con una tecla en lugar del target
interaction = 'sprite',bl_sprites debe estar arrancado. Para cambiar un solo NPC, pon interaction = 'sprite' en su definición.
Quitar la cámara
camera = {
enabled = false,
},
dialog = {
hidePlayer = false,
},Deja las demás claves de los dos bloques como están.
Pagar las ventas en el banco
shop = {
account = 'bank',
},Limitar un NPC a un trabajo
Chatarrero = {
job = { police = 2 }, -- police, grado 2 o superior
-- ...
},