Documentación de Control de NPC
Control de NPC (ov_npc_control)
Control de NPC desde el «ojito» (target) con una interfaz moderna: detener, arrodillar, seguir, robar, subir al coche, tomar de rehén y cargar, con frases graciosas sobre la cabeza del NPC.
Que hace
- Añade la opción Controlar al apuntar a un NPC con el ojito (y Controlar ocupante al apuntar a un vehículo con gente dentro). También puedes abrir el panel con el comando
/npc, que elige el NPC controlable más cercano. - El panel muestra el nombre del NPC, su estado y las acciones disponibles: Detente, Arrodillarse, Seguirme, Robar, Subir al coche (o Bajar del coche), Tomar de rehén (o Soltar), Cargar (o Soltar) y Dejar ir. Si el NPC va dentro de un coche y está libre, solo aparece Sacar del coche.
- Cada acción tiene un requisito (llevar un arma, haber sometido ya al NPC o ninguno). Si no se cumple, el botón se muestra apagado con el motivo escrito.
- El robo entrega dinero en efectivo y, con cierta probabilidad, objetos. El servidor valida distancia, enfriamientos y topes.
- Rehén entre jugadores: con un arma con balas puedes tomar de rehén a otro jugador que tenga las manos arriba. Es una opción distinta del ojito sobre jugadores («Tomar de rehén»); el servidor decide quién es captor y quién es rehén, y el captor puede soltarlo o ejecutarlo.
- Los NPC dicen frases al azar (con burbuja de texto). Opcionalmente se puede reproducir audio.
- Puedes controlar a varios NPC a la vez (por defecto 3 por jugador). Si el NPC se aleja demasiado, se libera solo.
- Interfaz y textos editables: colores del panel, idiomas (español e inglés incluidos) y frases.
Requisitos
| Requisito | Detalle |
|---|---|
| Juego | FiveM (gta5), fx_version 'cerulean', Lua 5.4 |
| Framework | Detección automática de Qbox (qbx_core), QBCore (qb-core) y ESX (es_extended). También funciona standalone |
| Inventario | Si ox_inventory está iniciado, se usa para dar objetos. Si no, se usa el inventario del framework (QBCore, Qbox o ESX) |
| Target | Detección automática de ov_target, ox_target o qb-target, para NPC, vehículos y jugadores (con el comando /npc puedes usar los NPC sin target) |
| Dependencias del manifiesto | No declara dependencies: ningún recurso es obligatorio para arrancar |
En modo standalone no hay dinero ni inventario que entregar. Para ver cómo se comporta el robo en ese caso, consulta el archivo de configuración y los eventos descritos más abajo.
Instalacion
- Copia la carpeta
ov_npc_controldentro de la carpetaresourcesde tu servidor. - Añade
ensure ov_npc_controlen tuserver.cfg, después de tu framework, tu inventario y tu recurso de target. - Abre
config.luay revisa, como mínimo,Config.Framework,Config.Target,Config.Idioma,Config.Comandoy la secciónConfig.Robo. - Reinicia el servidor o ejecuta
ensure ov_npc_control.
El recurso no lee convars propios; toda la configuración está en config.lua.
Protección. El recurso viene PROTEGIDO con Asset Escrow de Cfx.re. Se descarga desde el Portal de Cfx.re con la cuenta Cfx del comprador y solo funciona en servidores asociados a esa cuenta. config.lua, los idiomas (locales/) y la interfaz web (html/) quedan sin cifrar para que puedas editarlos. El código Lua (bridge, client y server) va cifrado.
Licencia. Licencia comercial de uso en un servidor (consulta LICENSE.txt).
Configuracion
Todas las opciones están en config.lua. Valores por defecto leídos del archivo:
General
| Clave | Por defecto | Para qué sirve |
|---|---|---|
Config.Idioma | 'es' | Idioma ('es' o 'en', archivos en locales/) |
Config.Framework | 'auto' | 'auto', 'qbx', 'qb', 'esx' o 'standalone' |
Config.Target | 'auto' | 'auto', 'ov_target', 'ox_target', 'qb-target' o 'none' |
Config.TargetDistancia | 3.0 | Metros desde los que aparece «Controlar» |
Config.Comando | 'npc' | Comando que abre el panel del NPC más cercano (nil para quitarlo) |
Config.Notificar | 'propio' | 'propio' (interfaz del recurso), 'ox_lib', 'qb' o 'esx' |
Config.Debug | false | Mensajes de depuración en consola |
Quién se puede controlar y límites
| Clave | Por defecto | Para qué sirve |
|---|---|---|
Config.TiposProhibidos | { [6]=true, [27]=true, [28]=true, [29]=true } | Tipos de ped nunca controlables (policía, SWAT, animales, ejército) |
Config.ModelosProhibidos | s_m_y_cop_01, s_f_y_cop_01, s_m_y_swat_01, s_m_m_paramedic_01 | Modelos concretos no controlables |
Config.MaxNpcsPorJugador | 3 | NPC sometidos a la vez por jugador |
Config.DistanciaMaxima | 60.0 | Si el NPC se aleja más, se libera solo |
Requisitos por acción
Config.Requisitos acepta 'arma' (arma en la mano), 'sometido' (NPC ya sometido o arma en la mano) o 'ninguno'.
| Acción | Por defecto |
|---|---|
detente, arrodillar, rehen | 'arma' |
seguir, robar, vehiculo, cargar | 'sometido' |
Config.PermitirArmaCuerpoACuerpo = false: cuchillos, bates y similares no cuentan como arma.
Animaciones y posición
Config.Anims (cambiables sin tocar el código): manosArriba, arrodillado, robarJugador, rehenAgresor, rehenVictima, cargarAgresor y cargarVictima, cada una con dict, clip y flag. Config.Pegado define la posición del NPC pegado a ti (rehén y cargar). Config.TeclaSoltar = 38 (E) y Config.TeclaSoltarAlt = 73 (X) sueltan al NPC.
Rehén entre jugadores (Config.Jugadores)
| Clave | Por defecto | Para qué sirve |
|---|---|---|
activo | true | Activa la opción «Tomar de rehén» sobre otros jugadores |
distanciaTarget | 3.0 | Distancia del ojito para mostrar la opción |
distanciaServidor | 8.0 | El servidor rechaza si los jugadores están más lejos |
teclaSoltar | 38 (E) | Tecla del captor para soltar |
teclaSoltarAlt | 177 (Retroceso) | Tecla alternativa para soltar (por si E está bloqueada por otro recurso) |
teclaEjecutar | 20 (Z) | Tecla del captor para ejecutar al rehén |
permitirEjecutar | true | El captor puede matar al rehén |
requiereManosArriba | true | La víctima debe tener las manos levantadas |
confirmacionSeg | 3 | Tiempo que tiene la víctima para confirmar al servidor que tiene las manos arriba |
animsManosArriba | 5 animaciones (random@mugging3, missminuteman_1ig_2 x2, random@arrests x2) | Animaciones que cuentan como «manos arriba»; añade las de tus emotes o de tu sistema de rendición |
bloquearSalirVehiculo | true | El rehén no puede bajarse de un vehículo mientras está retenido |
Seguir y subir al coche
| Clave | Por defecto | Para qué sirve |
|---|---|---|
Config.Seguir.velocidad | 1.6 | 1.0 camina, 2.0 corre |
Config.Seguir.distancia | 1.6 | Distancia a la que te sigue |
Config.Vehiculo.radioBusqueda | 12.0 | Radio para buscar un coche si no vas en uno |
Config.Vehiculo.asientosPreferidos | { 2, 1, 0, 3, 4, 5, 6 } | Orden de asientos (-1 conductor, 0 copiloto) |
Config.Vehiculo.tiempoMaximoMs | 9000 | Tiempo máximo para subir |
Config.Vehiculo.teletransporteSiFalla | true | Si no sube a tiempo, se le sienta directamente |
Robo (botín, enfriamientos y topes)
| Clave | Por defecto | Para qué sirve |
|---|---|---|
Config.Robo.requiereEstado | detenido, arrodillado | Estados en los que se puede robar |
Config.Robo.duracionMs | 2500 | Duración de la animación de robo |
Config.Robo.dinero | min = 40, max = 350 | Efectivo obtenido |
Config.Robo.objetos | phone (10 %), lockpick (6 %), sandwich x1-2 (12 %) | Objetos posibles con probabilidad prob (0 a 1) |
Config.Robo.cooldownJugadorSeg | 45 | Espera entre robos, por jugador |
Config.Robo.maxPorHora | 12 | Tope de robos por jugador y hora |
Config.Robo.cooldownNpcSeg | 900 | Tiempo antes de poder robar al mismo NPC otra vez |
Config.Robo.probAlertaPolicia | 0.35 | Probabilidad de aviso a la policía |
Config.Robo.distanciaMaxServidor | 8.0 | Distancia máxima jugador-NPC validada por el servidor |
Ajusta los nombres de objetos de Config.Robo.objetos a los que existan en tu inventario: el servidor solo entrega los que existen.
Voces
| Clave | Por defecto | Para qué sirve |
|---|---|---|
Config.Voz.activa | true | Activa las frases |
Config.Voz.burbuja | true | Texto sobre la cabeza del NPC |
Config.Voz.duracionMs | 3800 | Duración de la burbuja |
Config.Voz.cantidadVoces | 6 | «Personalidades» de voz para elegir audios |
Config.Voz.audio.activo | false | Reproduce además un archivo de audio |
Config.Voz.audio.proveedor | 'evento' | 'xsound' o 'evento' (dispara el evento de cliente ov_npc_control:reproducirVoz) |
Config.Voz.audio.base | '' | URL base; se busca <base>/<voz>/<accion>_<n>.mp3 (n de 1 a 3) |
Config.Voz.audio.volumen | 0.7 | Volumen |
Config.Voz.audio.distancia | 20.0 | Distancia de escucha |
El recurso no incluye archivos de audio: debes alojar los tuyos con esa estructura de nombres.
Interfaz, registro y nombres
Config.Tema: colores del panel (acento,acentoAlto,acentoBajo,fondo,fondo2,fondo3,texto,textoSuave), en formato hexadecimal.Config.Webhook = '': URL de Discord para registrar los robos (opcional).Config.Nombres: lista de nombres que se asignan a los NPC en el panel.
Comandos y permisos
| Comando | Qué hace |
|---|---|
/npc | Abre el panel del NPC controlable más cercano (nombre configurable en Config.Comando) |
/soltar | Suelta al NPC que llevas de rehén o cargado, o al jugador que retienes como rehén |
Los comandos son para todos los jugadores; el recurso no define permisos ni ACE propios.
Eventos
ov_npc_control:alertaPolicia(servidor): se dispara con(src, coords)cuando un robo activa el aviso. Engancha aquí tu despacho de policía:
AddEventHandler('ov_npc_control:alertaPolicia', function(src, coords)
-- llama a tu sistema de despacho con coords
end)
ov_npc_control:reproducirVoz(cliente): conConfig.Voz.audio.activo = truey proveedor'evento'recibe una tabla conurl,pos,volumen,distancia,vozyaccionpara que tu audio 3D lo reproduzca.ov_npc_control:rehenTomado(servidor): se dispara con(captor, rehen)cuando empieza una retención entre jugadores.ov_npc_control:rehenTerminado(servidor): se dispara con(captor, rehen, modo)al terminar;modoes'soltar','matar'o'cancelar'. Útil para tus registros o para otros scripts.ov_npc_control:robar(servidor, interno): lo envía el cliente tras la animación; no lo uses desde otros scripts.
Exports de cliente
exports.ov_npc_control:abrirPanel(ped): abre el panel para un NPC concreto.exports.ov_npc_control:estaControlado(ped): devuelvetruesi ese NPC está bajo control.
Textos e idiomas. Edita locales/es.lua o locales/en.lua (interfaz, mensajes y frases por acción en voces). Los textos del rehén entre jugadores están en msg: rehenTomar («Tomar de rehén»), rehenSinArma, rehenSinManos, rehenOcupado, rehenLejos, rehenTomado («¡TE TOMARON DE REHÉN!»), rehenLiberado («¡Te soltaron!»), rehenAyuda y rehenAyudaSolo (ayuda en pantalla, con las teclas E o Retroceso). Para añadir un idioma, copia uno de los archivos a locales/<codigo>.lua con Locales.<codigo> = { ... } y pon ese código en Config.Idioma.
Como se usa
- Acércate a un NPC (menos de
Config.TargetDistanciametros) y usa el ojito, o escribe/npc. - Elige la acción con el ratón o con las teclas 1 a 9. Las flechas mueven el foco y Esc cierra el panel.
- Los botones apagados indican el motivo (por ejemplo «Necesitas un arma en la mano» o «Primero somete al NPC»).
- Con Tomar de rehén o Cargar aparece el botón Soltar; también sueltas con E, Retroceso o
/soltar. Mientras llevas a alguien se bloquean correr, saltar, disparar, apuntar y entrar a vehículos.
Rehén entre jugadores
- Lleva un arma con balas en la mano (los cuchillos y armas cuerpo a cuerpo no cuentan).
- Apunta con el ojito a otro jugador que tenga las manos arriba (a menos de
distanciaTarget) y elige Tomar de rehén. La opción solo aparece si ya tienes arma, no estás ocupado y la víctima tiene las manos arriba. - El servidor comprueba que ninguno de los dos esté ya en una retención y que estén a menos de
distanciaServidor. SirequiereManosArribaestá activo, le pregunta a la propia víctima si tiene las manos arriba; tieneconfirmacionSegsegundos para responder. Si no confirma o ya no está cerca, no pasa nada (y el captor recibe el aviso de manos arriba). - Cuando se confirma, el captor ve los botones Soltar (E, o Retroceso, o
/soltar) y Ejecutar (Z, sipermitirEjecutarestá activo). El rehén queda pegado al captor con la animación de rehén y recibe el aviso «¡TE TOMARON DE REHÉN!». Mientras dura se bloquean varios controles de ambos (correr, saltar, disparar, apuntar...) y el rehén no puede moverse ni, sibloquearSalirVehiculoestá activo, bajarse de un vehículo. - Soltar libera al rehén con un empujón y el aviso «¡Te soltaron!». Ejecutar mata al rehén.
- La retención se cancela sola si el rehén muere o deja de estar disponible, si el captor muere (se suelta) o si cualquiera de los dos se desconecta. Un mismo jugador no puede estar en dos retenciones a la vez, ni tener a un NPC y a un jugador de rehén al mismo tiempo.
- Subir al coche usa el vehículo en el que vas o el más cercano; Bajar del coche lo devuelve a pie. Dejar ir lo libera y huye.
Reglas por defecto
- Detente, Arrodillarse y Tomar de rehén exigen un arma en la mano.
- Seguirme, Robar, Subir al coche y Cargar exigen que el NPC ya esté sometido o que lleves un arma.
- Robar además exige que el NPC esté detenido o arrodillado.
- Sacar del coche exige arma.
- Tomar de rehén a un jugador exige arma con balas y que la víctima tenga las manos arriba (configurable).
- Si vas a controlar más NPC que el máximo permitido, el panel avisa del límite.
Para administradores
Validaciones del servidor en el robo. El servidor comprueba que el NPC exista y que el jugador esté a menos de distanciaMaxServidor; aplica el enfriamiento por jugador, el tope por hora y el enfriamiento por NPC; calcula el botín y entrega dinero y objetos. Estas comprobaciones corren en el servidor, no en el cliente.
Validaciones del servidor en el rehén entre jugadores. El servidor asigna los roles: comprueba que el objetivo sea un jugador válido y distinto del captor, que ninguno esté ya retenido o retenga a alguien, y la distancia (distanciaServidor). Con requiereManosArriba la confirmación la da la víctima, no el captor, y caduca a los confirmacionSeg segundos. Para aceptar tus animaciones de rendición como válidas, añádelas a Config.Jugadores.animsManosArriba. Usa los eventos rehenTomado y rehenTerminado para registros o integraciones. Para desactivar la función entera, pon Config.Jugadores.activo = false.
NPC no controlables. Jugadores, NPC muertos, no humanos, los tipos de Config.TiposProhibidos (policía, SWAT, animales y ejército por defecto) y los modelos de Config.ModelosProhibidos.
Conectar el despacho de policía. Escucha el evento de servidor ov_npc_control:alertaPolicia (ver ejemplo en «Comandos y permisos») y llama a tu recurso de despacho. La frecuencia se controla con Config.Robo.probAlertaPolicia.
Registro en Discord. Pon la URL en Config.Webhook. Si lo dejas vacío, no se registra nada.
Apariencia. Cambia los colores en Config.Tema para adaptar el panel a tu servidor.
Preguntas frecuentes
¿Funciona sin framework? Sí, en modo standalone arranca y el panel funciona. El dinero y los objetos dependen del framework y del inventario; consulta el archivo de configuración.
No me aparece «Controlar» al apuntar a un NPC. Comprueba que tu recurso de target esté iniciado antes que este, o fija Config.Target. Mientras tanto puedes usar /npc. Recuerda que policías, animales y los modelos prohibidos no se pueden controlar.
Todos los botones salen apagados. Es normal sin arma o sin haber sometido al NPC. El motivo aparece escrito en cada botón; los requisitos se cambian en Config.Requisitos.
No recibo objetos al robar. El servidor solo entrega objetos que existen en tu inventario. Revisa los nombres de Config.Robo.objetos.
No puedo tomar de rehén a otro jugador. Necesitas un arma con balas en la mano y que el jugador tenga las manos arriba con una de las animaciones de Config.Jugadores.animsManosArriba. Si tu servidor usa otra animación de rendición, añádela ahí.
¿Qué pasa si el captor o el rehén mueren o se desconectan? La retención termina sola y el rehén queda libre.
¿Puedo cambiar las frases o añadir un idioma? Sí, en locales/ (sin cifrar). Ver «Comandos y permisos».
¿Puedo usar mis propios audios? Sí: activa Config.Voz.audio, define base con la estructura <base>/<voz>/<accion>_<n>.mp3 o escucha el evento ov_npc_control:reproducirVoz.
Actualizaciones y soporte
Las actualizaciones se publican en el Portal de Cfx.re, desde donde puedes volver a descargar el recurso con tu cuenta. Antes de actualizar, guarda una copia de tu config.lua y de tus archivos de locales/ para conservar tus ajustes. Para soporte, dudas o sugerencias: [enlace de soporte].
