Docs

Evidencias, CCTV, vídeo y voz

Capturas y vídeo automáticos al detectar

Guardian reúne pruebas sin que nadie lo pida: cada detección cuya acción llega a Evidence.CollectFrom (por defecto warn), y cualquier detección de un jugador vigilado, guarda en el caso una instantánea, el recorrido, una captura de pantalla, la caja negra y un vídeo de 12 s de la pantalla del jugador. Expulsiones y baneos de esa detección esperan a que el vídeo esté guardado (como mucho Evidence.Video.MaxWaitSeconds, 30 s): mientras tanto el jugador sigue en el servidor.

El vídeo usa la misma captura que el CCTV y viaja por la conexión del juego del jugador; no hay que instalar nada. Se ve en Evidencias (tipo "Vídeo") o desde el caso de la detección, y en el panel web se puede descargar como .webm. Ocupa unos 2,3 MB por vídeo en la base de datos (tabla guardian_evidence_parts) y se borra con el resto de evidencias según Privacy.Retention.Evidence.

Opción de Evidence.Video Qué hace
Enabled Graba vídeo en cada detección que reúne pruebas
Seconds Duración (12 s)
Width, Height, Fps, BitrateKbps Calidad (1280x720, 30 fps, 1500 kbps)
DelayActions true: la expulsión o el baneo esperan al vídeo. false: se aplican tras ActionDelayMs y el vídeo puede quedar cortado
MaxWaitSeconds Tiempo máximo de grabación y subida; pasado ese tiempo se guarda lo que haya llegado
CooldownSeconds Como mucho un vídeo por jugador en este tiempo (60 s)
MaxConcurrent Vídeos grabándose a la vez en todo el servidor (2)
MaxBytes Tamaño máximo de un vídeo; la grabación se corta al llegar

Si quieres pruebas también de todas las detecciones en modo sombra, pon Evidence.CollectFrom = 'log' (más espacio en la base de datos). No se usa nunca la webcam del jugador.

CCTV con capturas

  • El CCTV pide capturas periódicas al jugador observado (necesita el screenshot-basic oficial) cuando el vídeo no está disponible. Necesita el permiso cctv.view y queda auditado.
  • Privacy.NotifyPlayerWhenWatched = true avisa al jugador cuando alguien le observa, mira su pantalla o su vídeo.
  • Avisa en tus normas de que el servidor usa un anticheat con capturas, vídeo y vigilancia del staff (Privacy.NoticeOnJoin lo muestra al entrar).

Vídeo en directo por tu servidor (por defecto, sin configurar nada)

Las capturas no pasan de unos pocos fotogramas por segundo: cada una es una imagen JPG completa. El vídeo en directo no manda imágenes sueltas: el juego del jugador observado codifica su pantalla como vídeo (WebM, 1280x720 a 60 fps por defecto), que solo envía lo que cambia entre fotogramas, y lo manda en trozos de medio segundo por su propia conexión del juego (eventos latentes, que no frenan el resto del tráfico). Tu servidor ordena los trozos y se los pasa al staff que mira.

  • No hay que instalar otro recurso, abrir puertos ni contratar nada. Viene activado (CCTV.Relay.Enabled = true). No necesita screenshot-basic.
  • Nadie ve la IP de nadie: todo pasa por tu servidor.
  • El visor guarda un pequeño margen (empieza en 0,4 s) y lo amplía solo, hasta 3 s, si los trozos llegan a ráfagas; el retraso actual se ve en la barra de cada recuadro, junto con resolución, fps y ancho de banda.
  • Si una conexión no da abasto, Guardian descarta lo que no llegaría a tiempo, reinicia el vídeo con menos calidad y sigue. Si llegan trozos desordenados o se pierde uno, el visor pide un vídeo nuevo en lugar de romperse.
  • Si el vídeo no arranca (juego sin soporte, sin imagen del juego, tiempo agotado), el recuadro pasa solo a capturas y un aviso explica el motivo.

Coste por cada vídeo abierto: unos BitrateKbps de subida para el jugador observado y lo mismo de entrada y de salida para tu servidor (2500 kbps, unos 0,3 MB/s, para 720p60).

Opcional, con un proxy inverso HTTPS propio (nginx, Caddy...) delante del puerto del servidor: pon su dirección en CCTV.Relay.PublicUrl y el vídeo irá por HTTP, con la conexión del juego como respaldo automático. Tiene que ser https://: el navegador del juego bloquea cualquier petición a http://ip:puerto (contenido mixto).

Opción de CCTV.Relay Qué hace
Enabled Activa el vídeo por tu servidor
Width, Height, Fps Resolución y fotogramas (1280x720 a 60 por defecto)
BitrateKbps Calidad. 2500 para 720p60; para 1920x1080 a 60, unos 5000
Codec vp8 (por defecto, más ligero para el PC del jugador) o vp9 (ocupa menos, cuesta más CPU)
ChunkMs Duración de cada trozo enviado (500 ms)
PublicUrl Vacío por defecto. Opcional: dirección https:// de tu proxy inverso. Una http:// se ignora
UploadBytesPerSecond Velocidad máxima de cada trozo por la conexión del juego (1.000.000 bytes por segundo)
MaxInFlightChunks Trozos sin confirmar (6, unos 3 s) antes de descartar el resto y reiniciar con menos calidad
MaxConcurrent Vídeos a la vez en todo el servidor
MaxBufferedChars Memoria máxima por visor web
PollMs Cada cuánto pide trozos el panel web
IdleTimeoutSeconds Se corta si el visor deja de pedir (pestaña cerrada)
ConnectTimeoutSeconds Si no llega vídeo en este tiempo, el CCTV pasa a capturas

CCTV.Stream.FlipVertical también vale para este modo: ponlo en true si el vídeo llega boca abajo.

Vídeo WebRTC con TURN (opcional, avanzado)

Solo si quieres menos retraso (unas décimas de segundo) o no quieres que el vídeo pase por tu servidor de juego. El juego del jugador envía el vídeo al navegador del staff con WebRTC a través de un servidor TURN tuyo. Si está configurado, el CCTV lo intenta primero; si no conecta, usa el vídeo por tu servidor y después las capturas.

  1. Un servidor TURN, por ejemplo coturn en un VPS. Configuración mínima de /etc/turnserver.conf:
    listening-port=3478
    tls-listening-port=5349
    fingerprint
    use-auth-secret
    static-auth-secret=UNA_CLAVE_LARGA_Y_ALEATORIA
    realm=turn.tudominio.com
    cert=/etc/letsencrypt/live/turn.tudominio.com/fullchain.pem
    pkey=/etc/letsencrypt/live/turn.tudominio.com/privkey.pem
    no-multicast-peers
    denied-peer-ip=10.0.0.0-10.255.255.255
    denied-peer-ip=172.16.0.0-172.31.255.255
    denied-peer-ip=192.168.0.0-192.168.255.255
    Abre 3478 (UDP y TCP), 5349 (TCP) y el rango de relay de coturn (49152-65535 UDP). También sirve un TURN de pago: pon sus datos en CCTV.Stream.IceServers.
  2. En config/server.lua: CCTV.Stream.Enabled = true y tus URLs en CCTV.Stream.Turn.Urls, por ejemplo { 'turn:turn.tudominio.com:3478?transport=udp', 'turns:turn.tudominio.com:5349?transport=tcp' }.
  3. La clave, mejor en server.cfg: set guardian_turn_secret "UNA_CLAVE_LARGA_Y_ALEATORIA". Guardian genera credenciales que caducan a los Turn.TtlSeconds; la clave nunca sale del servidor.
Opción de CCTV.Stream Qué hace
Width, Height, Fps Resolución y fotogramas (1280x720 a 60 por defecto)
MaxBitrateKbps Tope de ancho de banda por vídeo (4000 para 720p60; unos 8000 para 1080p60)
Prefer Qué se conserva si el PC o la conexión no llegan: resolution, framerate o balanced
MaxConcurrentStreams Vídeos a la vez en todo el servidor
IdleTimeoutSeconds, ConnectTimeoutSeconds Corte por inactividad y paso a capturas si no conecta
ForceRelay Solo conexión por el TURN: nadie ve la IP de nadie. Déjalo en true
FlipVertical true si el vídeo llega boca abajo
Turn.Urls, Turn.Secret, Turn.TtlSeconds TURN propio con use-auth-secret
IceServers Servidores ICE extra copiados tal cual

Límites del vídeo

  • El vídeo sale del PC del jugador: igual que una captura, un cheat puede falsearlo. Es una señal para investigar, no una prueba por sí sola.
  • Codificar vídeo consume CPU del jugador observado mientras alguien mira o se graba una evidencia.
  • No hay audio del juego: el navegador del juego no puede capturar el sonido de GTA. Para oír la voz, usa la escucha de voz.

Escucha de voz (solo en el juego)

Un miembro del staff con el permiso cctv.listen (propietario y administrador por defecto) puede escuchar el chat de voz alrededor de un jugador desde su ficha ("Escuchar voz").

  • El jugador siempre recibe un aviso al empezar y al terminar. No se puede desactivar desde la configuración.
  • No se graba nada. Se corta sola a los Voice.MaxMinutes minutos, cuando cualquiera de los dos se desconecta o al pulsar "Dejar de escuchar".
  • Se oye al jugador y a quienes estén a menos de Voice.NearbyRadius metros.
  • Por defecto funciona con pma-voice y mumble-voip. Para SaltyChat, TokoVOIP u otro sistema adapta StartVoiceListen, UpdateVoiceListen y StopVoiceListen en client/editable.lua.
  • Escuchar conversaciones privadas sin avisar puede ser delito en muchos países. Ponlo en tus normas y úsalo solo para investigar.