Objectif : permettre à tout jeu ou mod d’envoyer des événements à Hovermate, qui les transforme en marqueurs et moments forts automatiques comme les fiches intégrées. Trois transports couvrent les environnements réseau, fichiers seuls et journal seul.
1. Découverte de la connexion
Quand le SDK est activé, Engine écrit %LOCALAPPDATA%\Hovermate\Sdk\connection.json (Paramètres › Clips › SDK d’événements de jeu, activé par défaut) :
{
"version": 1,
"url": "http://local.hovermate.gg/hovermate/v1/events",
"token": "<random, base64url, 32 bytes>",
"inbox": "C:\\Users\\<user>\\AppData\\Local\\Hovermate\\Sdk\\Inbox"
}urlest l’adresse où les événements sont envoyés. Lisez-la dans ce fichier et utilisez-la exactement telle qu’elle est écrite ; ne codez jamais en dur et ne modifiez jamais l’hôte, le port ou le chemin. Hovermate écrit actuellementhttp://local.hovermate.gg/hovermate/v1/events; le serveur de test du SDK écrit sa propre adresse de test.- Les clients lisent ce fichier au démarrage puis après chaque réponse
401. Le jeton peut changer. HOVERMATE_SDK_CONNECTION=<path>remplace l’emplacement du fichier pour les tests, outils et dossiers isolés. Les clients prennent toujours le dossier d’entrée dans le champinbox, sans le déduire eux-mêmes.- Si le fichier manque, Hovermate n’est pas installé ou le SDK est désactivé. Les clients restent silencieux et ne transmettent jamais d’exception au jeu.
2. Transports
2.1 HTTP (mods avec réseau : C#, C++, Java, Python, JS)
POST {url}; en-têtesAuthorization: Bearer <token>,Content-Type: application/json.- Les requêtes contenant un en-tête
Originsont refusées avec403, empêchant l’envoi par les navigateurs. - Corps : un objet événement ou
{ "events": [ ... ] }contenant au plus 100 événements. Taille maximale : 64 Ko. - Un lot est accepté ou refusé en entier. Hovermate valide d’abord tous les événements. Si l’un est invalide, aucun n’est accepté et le corps
400donne sa position :{ "error": "<code>", "detail": "...", "index": 3 }. Pour un nouveau jeu de la session,game.namedoit figurer dans le premier événement du lot qui le mentionne. -
Réponses :
202accepté ;400invalide, avec le corps{ "error": "<code>", "detail": "...", "index": <n, batches only> };401jeton incorrect ou manquant ;403la requête contient un en-têteOrigin;413corps trop grand. Jusqu’à 1 Mo est d’abord lu et ignoré pour que le client reçoive le statut ; un corps plus grand peut être refusé avant lecture, avec fermeture de la connexion ;429plus de 20 événements/s par jeu ;405,411,415méthode incorrecte, longueur absente ou type de contenu incorrect.
- Les clients envoient sans attendre depuis un traitement en arrière-plan. Ils ne bloquent jamais le fil du jeu, utilisent un délai maximal de 250 ms, une file bornée supprimant le plus ancien et au plus une nouvelle tentative.
2.2 Réception JSONL (mods pouvant écrire des fichiers, sans réseau)
- Ajoutez des lignes UTF-8 à
{inbox}\<game.id>.jsonl: un objet événement par ligne, sans BOM. - Aucun jeton nécessaire : le dossier appartient à l’utilisateur.
- Au démarrage, Engine suit chaque fichier
*.jsonldu dossier d’entrée à partir de sa fin. Le mod peut tronquer son fichier au début d’une session.
2.3 Convention de journal (scripts limités au journal du jeu)
- Toute ligne contenant le marqueur
[HOVERMATE], puis un objet événement JSON. Tout ce qui précède le marqueur, horodatages et noms de canaux compris, est ignoré. - La fiche SDK contient la liste « Lire les événements depuis un fichier », où l’utilisateur ajoute le chemin du journal. Un événement
hello(§4) reçu par un autre transport peut aussi le proposer. Engine utilise l’adaptateur de suivi des journaux existant. - Hovermate suit automatiquement les journaux de scripts connus pendant le jeu. La liste est dans le catalogue des jeux (
sdkLogs), par exempleDocuments\The Witcher 3\scriptslog.txtet les journaux Papyrus de Skyrim/Fallout. Ces mods demandent seulement d’activer les journaux de scripts du jeu.
2.4 Fichier d’événements du mod (sandboxes limitées au dossier du mod)
- Certains environnements, dont les mods Lua Cyber Engine Tweaks, n’autorisent l’écriture que dans le dossier du mod. Le mod y ajoute des lignes JSONL (§2.2) dans
hovermate-events.jsonl. - L’utilisateur ajoute ce fichier à « Lire les événements depuis un fichier » dans la fiche SDK. Le README du mod doit indiquer son emplacement. Hovermate le suit comme un fichier de réception.
- Le mod peut aussi afficher une fois son chemin dans une ligne de journal
[HOVERMATE], ou l’envoyer danshello.files, un tableau de chemins, via un autre transport. Hovermate propose alors de l’ajouter.
3. Objet événement
{
"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— obligatoire,1.game.id— obligatoire,[a-z0-9._-]{3,64}. Nom DNS inversé ou identifiant court, stable entre les versions du mod.game.name— obligatoire dans le premier événement ouhellode la session ; 64 caractères maximum.game.exe— facultatif, nom de fichier uniquement. Lie les événements au dossier du jeu détecté et permet à cet exécutable de démarrer le tampon de replay.type— obligatoire. Un type standard du vocabulaire partagé dansDocs/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 ; ou"custom". La liste deDocs/CLIPS.mdfait autorité et s’allonge seulement. Un type standard inconnu est refusé avec400.customType/customLabel— obligatoires quandtypevaut"custom".customTypecorrespond à[a-z0-9_.-]{1,32};customLabel, limité à 40 caractères, est le nom de l’option dans la fiche.label— texte facultatif de cet événement, pour l’infobulle du marqueur et le titre du clip ; 80 caractères maximum.tags— facultatif, jusqu’à 8 tags correspondant chacun à[a-z0-9_-]{1,24}.context— carte, niveau ou zone facultatifs pour les titres des moments forts ; 64 caractères maximum.time— facultatif, ISO-8601 UTC. Engine date la réception ;timeà ±5 s l’affine, toute autre valeur est ignorée.- Les champs inconnus sont ignorés : les versions suivantes ajoutent seulement des champs.
- Les limites comptent les unités UTF-16, comme
lengthen JavaScript etstring.Lengthen .NET. Les motifs doivent couvrir toute la valeur : un saut de ligne final est invalide. Une chaîne vide ou composée d’espaces est considérée absente. - N’envoyez pas de données personnelles : libellés et contextes peuvent apparaître dans les titres des clips et noms de fichiers.
4. hello (facultatif, recommandé)
{ "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" }- Permet à Hovermate de créer la fiche du jeu et ses options avant le premier événement réel.
offersénumère les types standard et/ou les objets de types personnalisés.log, facultatif, propose un journal ;files, facultatif, propose des fichiers d’événements du mod (§2.4). Hovermate demande l’accord de l’utilisateur avant de lire tout chemin proposé.helloest accepté par tous les transports, y compris une ligne de journal[HOVERMATE].
5. Comportement de Hovermate
- Le premier événement valide ou
hellod’un nouveaugame.idcrée une fiche de jeu « SDK ». Elle utilise le nom, l’exécutable, le dossier et la jaquette s’il correspond à un jeu installé, une option par type annoncé ou reçu et les durées avant/après. Les moments forts restent désactivés jusqu’au choix des types par le joueur ; les marqueurs sont toujours écrits. - Les événements suivent le même circuit que les fiches intégrées : journal, marqueurs des clips et sessions, fenêtre de moments forts, notifications.
- Les événements sont attribués au jeu au premier plan quand
game.execorrespond. Sinon, ils sont acceptés uniquement pendant un enregistrement ou l’exécution du tampon et associés au jeu SDK. -
Limites :
- 20 événements/s par jeu ;
- 200 types personnalisés par jeu ;
- les lignes de réception dépassant 4 Ko sont ignorées ;
- les lignes mal formées sont comptées dans l’état de la fiche (« N événements invalides »), sans jamais être journalisées brutes.