الهدف: تمكين الألعاب والتعديلات من إرسال أحداث إلى Hovermate، لتحويلها إلى علامات زمنية ولقطات بارزة تلقائية مثل البطاقات المدمجة. تغطي ثلاث وسائل نقل البيئات التي تدعم الشبكة أو الملفات فقط أو السجلات فقط.
1. اكتشاف الاتصال
يكتب Engine الملف %LOCALAPPDATA%\Hovermate\Sdk\connection.json عندما يكون SDK مفعّلًا (الإعدادات › المقاطع › 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 KB. - تقبل الدفعة كاملة أو ترفض. يتحقق Hovermate أولًا من جميع الأحداث؛ إذا فشل أحدها فلا يقبل شيء، ويذكر جسم
400موقعه:{ "error": "<code>", "detail": "...", "index": 3 }. للعبة الجديدة في الجلسة، يجب أن يظهرgame.nameفي أول حدث يذكرها في الدفعة. -
الاستجابات:
202مقبول؛400غير صالح، والجسم{ "error": "<code>", "detail": "...", "index": <n, batches only> }؛401رمز خاطئ أو مفقود؛403يحتوي الطلب على ترويسةOrigin؛413الجسم أكبر من المسموح. يقرأ حتى 1 MB ثم يتجاهل أولًا، ليصل رمز الحالة إلى العميل؛ وقد ترفض الأجسام الأكبر قبل قراءتها مع إغلاق الاتصال؛429أكثر من 20 حدثًا/ثانية لكل لعبة؛405و411و415تعني طريقة خاطئة أو طولًا مفقودًا أو نوع محتوى خاطئًا.
- يرسل العملاء في الخلفية دون انتظار في خيط اللعبة. يستخدمون مهلة 250 ms أو أقل، وطابورًا محدودًا يحذف الأقدم، ومحاولة إضافية واحدة فقط.
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 ومجلد اللعبة وغلافها إن طابق exe لعبة مثبتة، ومفتاحًا لكل نوع معلن أو مستلم وإعدادات الزمن قبل الحدث وبعده. تظل اللقطات البارزة متوقفة حتى يفعّل المستخدم الأنواع؛ وتكتب العلامات دائمًا. - تمر الأحداث بالمسار نفسه للبطاقات المدمجة: السجل، وعلامات المقاطع والجلسات، ونافذة اللقطات البارزة، والإشعارات.
- تنسب الأحداث للعبة المكتشفة في المقدمة عندما يطابقها
game.exe. وإلا فلا تقبل إلا عند عمل التسجيل أو المخزن المؤقت، وتنسب إلى لعبة SDK. -
الحدود:
- 20 حدثًا/ثانية لكل لعبة؛
- 200 نوع مخصص لكل لعبة؛
- تتجاهل أسطر الاستقبال الأكبر من 4 KB؛
- تحتسب الأسطر غير الصالحة وتعرض في حالة البطاقة («N أحداث غير صالحة»)، ولا يسجل محتواها الخام.