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.
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).
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.
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.
Un servidor TURN, por ejemplo coturn en un VPS. Configuración mínima de /etc/turnserver.conf:
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.
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' }.
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
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.