Мета: будь-яка гра чи мод можуть передавати події в Hovermate. Вони перетворюються на маркери й автоматично збережені яскраві моменти, як у вбудованих картках. Три канали охоплюють середовища з мережею, лише файлами та лише журналом.
1. Пошук підключення
Поки SDK увімкнено, Engine записує %LOCALAPPDATA%\Hovermate\Sdk\connection.json (Налаштування › Кліпи › SDK ігрових подій; типово ввімкнено):
{
"version": 1,
"url": "http://local.hovermate.gg/hovermate/v1/events",
"token": "<random, base64url, 32 bytes>",
"inbox": "C:\\Users\\<user>\\AppData\\Local\\Hovermate\\Sdk\\Inbox"
}url— адреса, на яку надсилаються події. Читайте її з цього файлу й використовуйте саме так, як її записано; ніколи не прописуйте в коді й не змінюйте хост, порт або шлях. Зараз Hovermate записуєhttp://local.hovermate.gg/hovermate/v1/events; тестовий сервер SDK записує власну тестову адресу.- Клієнти читають файл під час запуску та після кожної відповіді
401: токен може змінюватись. HOVERMATE_SDK_CONNECTION=<path>перевизначає шлях для тестів, інструментів та ізольованих папок даних. Клієнти завжди беруть вхідну папку з поляinbox, а не обчислюють її самі.- Якщо файла немає, Hovermate не встановлено або SDK вимкнено. Клієнти мовчать і не передають винятки у гру.
2. Способи передавання
2.1 HTTP (моди з мережею: C#, C++, Java, Python, JS)
POST {url}; заголовкиAuthorization: Bearer <token>,Content-Type: application/json.- Запити із заголовком
Originвідхиляються відповіддю403, тому браузери не можуть надсилати події. - Тіло: один об’єкт події або
{ "events": [ ... ] }із максимум 100 подіями. Розмір тіла — до 64 КБ. - Пакет приймається повністю або відхиляється. Hovermate спершу перевіряє всі події. За помилки жодна не приймається, а тіло
400вказує позицію:{ "error": "<code>", "detail": "...", "index": 3 }. Для нової в сесії гри полеgame.nameобов’язкове в першій події пакета, яка її згадує. -
Відповіді:
202прийнято;400некоректні дані, тіло{ "error": "<code>", "detail": "...", "index": <n, batches only> };401токен неправильний або відсутній;403запит містить заголовокOrigin;413тіло завелике. До 1 МБ спершу зчитується й відкидається, щоб клієнт отримав статус; більші тіла можуть відхилятись до читання із закриттям з’єднання;429понад 20 подій/с для гри;405,411,415неправильний метод, відсутня довжина або неправильний тип вмісту.
- Клієнти надсилають події у фоні, не очікуючи відповіді в ігровому потоці. Тайм-аут — до 250 мс, обмежена черга видаляє найстаріше, повтор — щонайбільше один.
2.2 Вхідна папка JSONL (моди із записом файлів без мережі)
- Додавайте рядки UTF-8 до
{inbox}\<game.id>.jsonl: по одному об’єкту події, без BOM. - Токен не потрібен: папка належить користувачу.
- Під час запуску Engine починає стежити за кожним файлом
*.jsonlу вхідній папці з кінця. Мод може очистити свій файл на початку сесії.
2.3 Рядки журналу (скрипти із записом лише в журнал гри)
- Рядок має містити маркер
[HOVERMATE], а далі один об’єкт події JSON. Усе перед маркером, зокрема час та назва каналу, ігнорується. - Картка SDK має список «Читати події з файла», куди гравець додає шлях до журналу. Його також може запропонувати подія
hello(§4), отримана іншим каналом. Engine читає файл наявним адаптером стеження за журналом. - Hovermate автоматично стежить за відомими журналами скриптів, доки гра працює. Шляхи містяться в каталозі ігор (
sdkLogs), наприкладDocuments\The Witcher 3\scriptslog.txtта журналах Papyrus Skyrim/Fallout. Достатньо ввімкнути журналювання скриптів гри.
2.4 Файл подій у папці мода (середовища із записом лише у свою папку)
- Деякі середовища, наприклад Lua-моди Cyber Engine Tweaks, дозволяють запис лише в папку мода. Такий мод додає рядки JSONL (§2.2) до свого файла
hovermate-events.jsonl. - Гравець додає файл до списку «Читати події з файла» картки SDK. README мода має вказувати шлях. Hovermate читає додані рядки як у вхідному файлі.
- Мод також може один раз вивести власний шлях рядком журналу
[HOVERMATE]або передати його вhello.files, масиві шляхів, іншим доступним каналом. Hovermate запропонує додати файл.
3. Об’єкт події
{
"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— обов’язково,1.game.id— обов’язково,[a-z0-9._-]{3,64}. Зворотне DNS-ім’я або короткий ідентифікатор, незмінний між версіями мода.game.name— обов’язково в першій події чиhelloсесії; до 64 символів.game.exe— необов’язково, лише назва файла. Пов’язує події зі знайденою папкою гри й дозволяє цій програмі запускати буфер повтору.type— обов’язково. Стандартний тип зі спільного списку вDocs/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 — або"custom". Список уDocs/CLIPS.mdє основним і лише розширюється. Невідомий тип відхиляється з400.customType/customLabel— обов’язкові, якщоtypeдорівнює"custom".customTypeвідповідає[a-z0-9_.-]{1,32};customLabel— назва перемикача в картці довжиною до 40 символів.label— необов’язковий підпис події для підказки маркера й назви кліпу; до 80 символів.tags— необов’язково, до 8 тегів, кожен відповідає[a-z0-9_-]{1,24}.context— необов’язкова карта, рівень або область для назв яскравих моментів; до 64 символів.time— необов’язковий час ISO-8601 UTC. Engine ставить час отримання;timeу межах ±5 с уточнює позначку, решта ігнорується.- Невідомі поля ігноруються; нові версії лише додають поля.
- Межі довжини рахуються в кодових одиницях UTF-16, як
lengthу JavaScript іstring.Lengthу .NET. Шаблон має збігатися з усім значенням: новий рядок наприкінці недопустимий. Порожні рядки й рядки з пробілів вважаються відсутніми. - Не передавайте персональні дані: підписи й контекст можуть з’явитись у назвах кліпів і файлів.
4. hello (необов’язково, рекомендовано)
{ "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" }- Дає змогу Hovermate створити картку гри з перемикачами до першої події.
offersперелічує стандартні типи та/або об’єкти власних типів.logнеобов’язково пропонує журнал для построкового передавання;files— файли подій у папці мода (§2.4). Hovermate запитує користувача перед читанням будь-якого запропонованого шляху.helloприймається будь-яким каналом, зокрема рядком журналу[HOVERMATE].
5. Поведінка Hovermate
- Перша правильна подія або
helloновогоgame.idстворює картку гри «SDK». У ній використовуються назва, exe, папка й обкладинка при збігу зі встановленою грою, перемикачі оголошених чи отриманих типів і час до та після події. Яскраві моменти вимкнено до вибору типів гравцем; маркери записуються завжди. - Події проходять той самий конвеєр, що й вбудовані картки: журнал, маркери в кліпах і сесіях, вікно яскравих моментів, сповіщення.
- За збігу
game.exeз виявленою активною грою події належать їй. Інакше приймаються лише під час запису чи роботи буфера й позначаються SDK-грою. -
Обмеження:
- 20 подій/с на гру;
- 200 власних типів на гру;
- рядки вхідних файлів понад 4 КБ відкидаються;
- некоректні рядки рахуються в статусі картки («N помилкових подій»), їхній початковий текст не журналюється.