Цель: любая игра или мод могут передавать события в 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 ошибочных событий»), их исходный текст не журналируется.