Objetivo: cualquier juego o mod puede enviar eventos a Hovermate, que los convierte en marcadores y momentos destacados automáticos como las fichas integradas. Tres transportes cubren entornos con red, solo archivos o solo registro.
1. Detección de conexión
Engine escribe %LOCALAPPDATA%\Hovermate\Sdk\connection.json cuando el SDK está activo (Ajustes › Clips › SDK de eventos de juego, activo por defecto):
{
"version": 1,
"url": "http://local.hovermate.gg/hovermate/v1/events",
"token": "<random, base64url, 32 bytes>",
"inbox": "C:\\Users\\<user>\\AppData\\Local\\Hovermate\\Sdk\\Inbox"
}urles adonde se envían los eventos. Léelo de este archivo y úsalo exactamente como está escrito; nunca fijes en el código ni cambies el host, el puerto o la ruta. Hovermate escribe actualmentehttp://local.hovermate.gg/hovermate/v1/events; el servidor de prueba del SDK escribe su propia dirección de prueba.- Los clientes leen el archivo al iniciar y después de cada respuesta
401. El token puede cambiar. HOVERMATE_SDK_CONNECTION=<path>sustituye la ubicación para pruebas, herramientas y carpetas aisladas. Los clientes toman siempre la carpeta de entrada del campoinbox, sin deducirla por su cuenta.- Si el archivo no existe, Hovermate no está instalado o el SDK está desactivado. Los clientes permanecen en silencio y no propagan excepciones al juego.
2. Transportes
2.1 HTTP (mods con red: C#, C++, Java, Python, JS)
POST {url}; cabecerasAuthorization: Bearer <token>,Content-Type: application/json.- Las solicitudes con cabecera
Originse rechazan con403, impidiendo el envío desde navegadores. - Cuerpo: un objeto de evento o
{ "events": [ ... ] }con hasta 100 eventos. Tamaño máximo: 64 KB. - Un lote se acepta o rechaza entero. Hovermate valida todos los eventos primero. Si uno falla, no se acepta ninguno y el cuerpo
400indica su posición:{ "error": "<code>", "detail": "...", "index": 3 }. Para un juego nuevo en la sesión,game.namedebe aparecer en el primer evento del lote que lo mencione. -
Respuestas:
202aceptado;400no válido, con cuerpo{ "error": "<code>", "detail": "...", "index": <n, batches only> };401token incorrecto o ausente;403la solicitud contiene una cabeceraOrigin;413cuerpo demasiado grande. Primero se lee y descarta hasta 1 MB para que el cliente vea el estado; los cuerpos mayores pueden rechazarse antes de leerlos y se cierra la conexión;429más de 20 eventos/s por juego;405,411,415método incorrecto, longitud ausente o tipo de contenido incorrecto.
- Los clientes envían en segundo plano sin esperar en el hilo del juego. Usan un tiempo máximo de 250 ms, una cola limitada que descarta el más antiguo y como máximo un reintento.
2.2 Entrada JSONL (mods con escritura de archivos pero sin red)
- Añade líneas UTF-8 a
{inbox}\<game.id>.jsonl, un objeto de evento por línea, sin BOM. - No hace falta token: la carpeta pertenece al usuario.
- Al iniciar, Engine sigue cada archivo
*.jsonlde la carpeta de entrada desde su final. El mod puede truncar su archivo al empezar una sesión.
2.3 Convención de líneas de registro (scripts limitados al registro del juego)
- Una línea con el marcador
[HOVERMATE]seguido de un objeto de evento JSON. Se ignora todo lo anterior, incluidas marcas de tiempo y nombres de canales. - La ficha SDK tiene la lista «Leer eventos de un archivo», donde el usuario añade la ruta del registro. Un evento
hello(§4) recibido por otro transporte también puede proponerla. Engine lee el archivo con el adaptador de seguimiento de registros existente. - Hovermate sigue automáticamente los registros de scripts conocidos mientras el juego está abierto. La lista está en el catálogo de juegos (
sdkLogs), comoDocuments\The Witcher 3\scriptslog.txty los registros Papyrus de Skyrim/Fallout. En esos mods solo hay que activar el registro de scripts del juego.
2.4 Archivo de eventos en la carpeta del mod (sandboxes limitadas a su propia carpeta)
- Algunos entornos, como los mods Lua de Cyber Engine Tweaks, solo permiten escribir en la carpeta del mod. La mod añade allí líneas JSONL (§2.2) a
hovermate-events.jsonl. - El usuario añade el archivo a «Leer eventos de un archivo» en la ficha SDK. El README del mod debe indicar su ruta. Hovermate lo sigue como un archivo de entrada.
- El mod también puede imprimir una vez su ruta como línea de registro
[HOVERMATE], o enviarla enhello.files, un array de rutas, mediante otro transporte. Hovermate propone entonces añadirla.
3. Objeto de evento
{
"v": 1,
"game": { "id": "com.example.mygame", "name": "My Game", "exe": "MyGame.exe" },
"type": "kill",
"label": "Double kill",
"tags": ["headshot"],
"context": "Act 2 · The City",
"time": "2026-11-09T21:15:03.120Z"
}v— obligatorio,1.game.id— obligatorio,[a-z0-9._-]{3,64}. DNS inverso o identificador corto, estable entre versiones del mod.game.name— obligatorio en el primer evento ohellode la sesión; máximo 64 caracteres.game.exe— opcional, solo un nombre de archivo. Vincula los eventos a la carpeta detectada y permite al ejecutable iniciar el búfer de repetición.type— obligatorio. Un tipo estándar del vocabulario compartido enDocs/CLIPS.md: kill, death, assist, multikill, roundWon, roundLost, matchWon, matchLost, mvp, objective, lap, bestLap, position, crash, incident, levelUp, bossKill, zone, achievement, goal, save, mission, fightWon, penalty, pit, finish, raceWon, landing, takeoff; o"custom". La lista deDocs/CLIPS.mdes la referencia y solo crece. Un tipo desconocido se rechaza con400.customType/customLabel— obligatorios cuandotypees"custom".customTypecoincide con[a-z0-9_.-]{1,32};customLabeles el nombre del interruptor de la ficha, de hasta 40 caracteres.label— texto opcional de este evento para la ayuda del marcador y el título del clip; máximo 80 caracteres.tags— opcional, hasta 8 etiquetas, cada una conforme a[a-z0-9_-]{1,24}.context— mapa, nivel o zona opcional para los títulos de momentos destacados; máximo 64 caracteres.time— opcional, ISO-8601 UTC. Engine registra la llegada;timedentro de ±5 s la precisa; el resto se ignora.- Los campos desconocidos se ignoran; las versiones futuras solo añaden campos.
- Los límites cuentan unidades UTF-16, como
lengthde JavaScript ystring.Lengthde .NET. Los patrones deben coincidir con todo el valor: un salto de línea final no es válido. Las cadenas vacías o solo con espacios se consideran ausentes. - No envíes datos personales. Las etiquetas y el contexto pueden aparecer en títulos de clips y nombres de archivos.
4. hello (opcional, recomendado)
{ "v": 1, "game": { "id": "com.example.mygame", "name": "My Game", "exe": "MyGame.exe" },
"type": "hello",
"offers": ["kill", "death", "bossKill", { "customType": "parry", "customLabel": "Parry" }],
"log": "%LOCALAPPDATA%\\MyGame\\Saved\\Logs\\MyGame.log" }- Permite a Hovermate crear la ficha del juego y sus interruptores antes del primer evento real.
offersenumera tipos estándar y/u objetos de tipos personalizados.logpropone opcionalmente un registro;filespropone archivos del mod (§2.4). Hovermate pide permiso al usuario antes de leer cualquier ruta propuesta.hellose acepta por cualquier transporte, incluida una línea de registro[HOVERMATE].
5. Comportamiento de Hovermate
- El primer evento válido o
hellode un nuevogame.idcrea una ficha «SDK». Usa nombre, exe, carpeta y portada si coincide con un juego instalado, un interruptor por tipo anunciado o visto y ajustes antes/después. Los momentos destacados quedan desactivados hasta que el usuario activa tipos; los marcadores siempre se escriben. - Los eventos siguen el mismo flujo que las fichas integradas: diario, marcadores de clips y sesiones, ventana de momentos destacados y notificaciones.
- Los eventos se atribuyen al juego detectado en primer plano cuando
game.execoincide. En caso contrario solo se aceptan mientras una grabación o el búfer están activos y se etiquetan con el juego SDK. -
Límites:
- 20 eventos/s por juego;
- 200 tipos personalizados por juego;
- las líneas de entrada de más de 4 KB se descartan;
- las líneas incorrectas se cuentan en el estado de la ficha («N eventos no válidos»), sin registrar nunca su contenido original.