SCRIPT

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

Requisitos

RequisitoDetalle
JuegoFiveM (gta5), fx_version 'cerulean', Lua 5.4
FrameworkDetección automática de Qbox (qbx_core), QBCore (qb-core) y ESX (es_extended). También funciona standalone
InventarioSi ox_inventory está iniciado, se usa para dar objetos. Si no, se usa el inventario del framework (QBCore, Qbox o ESX)
TargetDetecció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 manifiestoNo 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

  1. Copia la carpeta ov_npc_control dentro de la carpeta resources de tu servidor.
  2. Añade ensure ov_npc_control en tu server.cfg, después de tu framework, tu inventario y tu recurso de target.
  3. Abre config.lua y revisa, como mínimo, Config.Framework, Config.Target, Config.Idioma, Config.Comando y la sección Config.Robo.
  4. 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

ClavePor defectoPara 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.TargetDistancia3.0Metros 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.DebugfalseMensajes de depuración en consola

Quién se puede controlar y límites

ClavePor defectoPara qué sirve
Config.TiposProhibidos{ [6]=true, [27]=true, [28]=true, [29]=true }Tipos de ped nunca controlables (policía, SWAT, animales, ejército)
Config.ModelosProhibidoss_m_y_cop_01, s_f_y_cop_01, s_m_y_swat_01, s_m_m_paramedic_01Modelos concretos no controlables
Config.MaxNpcsPorJugador3NPC sometidos a la vez por jugador
Config.DistanciaMaxima60.0Si 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ónPor 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)

ClavePor defectoPara qué sirve
activotrueActiva la opción «Tomar de rehén» sobre otros jugadores
distanciaTarget3.0Distancia del ojito para mostrar la opción
distanciaServidor8.0El servidor rechaza si los jugadores están más lejos
teclaSoltar38 (E)Tecla del captor para soltar
teclaSoltarAlt177 (Retroceso)Tecla alternativa para soltar (por si E está bloqueada por otro recurso)
teclaEjecutar20 (Z)Tecla del captor para ejecutar al rehén
permitirEjecutartrueEl captor puede matar al rehén
requiereManosArribatrueLa víctima debe tener las manos levantadas
confirmacionSeg3Tiempo que tiene la víctima para confirmar al servidor que tiene las manos arriba
animsManosArriba5 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
bloquearSalirVehiculotrueEl rehén no puede bajarse de un vehículo mientras está retenido

Seguir y subir al coche

ClavePor defectoPara qué sirve
Config.Seguir.velocidad1.61.0 camina, 2.0 corre
Config.Seguir.distancia1.6Distancia a la que te sigue
Config.Vehiculo.radioBusqueda12.0Radio 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.tiempoMaximoMs9000Tiempo máximo para subir
Config.Vehiculo.teletransporteSiFallatrueSi no sube a tiempo, se le sienta directamente

Robo (botín, enfriamientos y topes)

ClavePor defectoPara qué sirve
Config.Robo.requiereEstadodetenido, arrodilladoEstados en los que se puede robar
Config.Robo.duracionMs2500Duración de la animación de robo
Config.Robo.dineromin = 40, max = 350Efectivo obtenido
Config.Robo.objetosphone (10 %), lockpick (6 %), sandwich x1-2 (12 %)Objetos posibles con probabilidad prob (0 a 1)
Config.Robo.cooldownJugadorSeg45Espera entre robos, por jugador
Config.Robo.maxPorHora12Tope de robos por jugador y hora
Config.Robo.cooldownNpcSeg900Tiempo antes de poder robar al mismo NPC otra vez
Config.Robo.probAlertaPolicia0.35Probabilidad de aviso a la policía
Config.Robo.distanciaMaxServidor8.0Distancia 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

ClavePor defectoPara qué sirve
Config.Voz.activatrueActiva las frases
Config.Voz.burbujatrueTexto sobre la cabeza del NPC
Config.Voz.duracionMs3800Duración de la burbuja
Config.Voz.cantidadVoces6«Personalidades» de voz para elegir audios
Config.Voz.audio.activofalseReproduce 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.volumen0.7Volumen
Config.Voz.audio.distancia20.0Distancia de escucha

El recurso no incluye archivos de audio: debes alojar los tuyos con esa estructura de nombres.

Interfaz, registro y nombres

Comandos y permisos

ComandoQué hace
/npcAbre el panel del NPC controlable más cercano (nombre configurable en Config.Comando)
/soltarSuelta 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

AddEventHandler('ov_npc_control:alertaPolicia', function(src, coords)
    -- llama a tu sistema de despacho con coords
end)

Exports de cliente

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

  1. Acércate a un NPC (menos de Config.TargetDistancia metros) y usa el ojito, o escribe /npc.
  2. 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.
  3. Los botones apagados indican el motivo (por ejemplo «Necesitas un arma en la mano» o «Primero somete al NPC»).
  4. 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

  1. Lleva un arma con balas en la mano (los cuchillos y armas cuerpo a cuerpo no cuentan).
  2. 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.
  3. El servidor comprueba que ninguno de los dos esté ya en una retención y que estén a menos de distanciaServidor. Si requiereManosArriba está activo, le pregunta a la propia víctima si tiene las manos arriba; tiene confirmacionSeg segundos para responder. Si no confirma o ya no está cerca, no pasa nada (y el captor recibe el aviso de manos arriba).
  4. Cuando se confirma, el captor ve los botones Soltar (E, o Retroceso, o /soltar) y Ejecutar (Z, si permitirEjecutar está 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, si bloquearSalirVehiculo está activo, bajarse de un vehículo.
  5. Soltar libera al rehén con un empujón y el aviso «¡Te soltaron!». Ejecutar mata al rehén.
  6. 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.
  7. 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

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].