rock-mod
Version:
Rock-Mod is a powerful framework designed for creating and managing mods for Grand Theft Auto (GTA) games.
44 lines (43 loc) • 1.9 kB
JavaScript
import { ClientInternalEventName } from "../../common/events/types";
/**
* Реализация `IDataHandler` под CCMP поверх `rm::syncedMetaChange`.
*
* `CCMPSyncedMetaBridge` переводит нативное событие
* `ccmp.on('streamSyncedMetaChange')` в internal-bus
* `rm::syncedMetaChange(entity, key, value, oldValue)`. Этот класс
* держит per-key реестр колбэков и диспатчит на них пришедшие изменения.
*
* Снапшот всех ключей сущности (отправляется CCMP'ом сразу после
* `StreamIn`) тоже проходит через это событие — поэтому первое появление
* сущности у клиента триггерит колбэк на каждый уже выставленный сервером
* ключ (с `oldValue === undefined`).
*/
export class CCMPDataHandler {
constructor(events) {
this._handlers = new Map();
events.onInternal({
[ClientInternalEventName.SyncedMetaChange]: (object, key, value, oldValue) => {
const callbacks = this._handlers.get(key);
if (!callbacks || callbacks.length === 0) {
return;
}
for (const callback of [...callbacks]) {
try {
callback(object, value, oldValue);
}
catch (error) {
console.error(`[CCMPDataHandler] callback for key "${key}" failed:`, error);
}
}
},
});
}
addDataHandler(key, callback) {
let bucket = this._handlers.get(key);
if (!bucket) {
bucket = [];
this._handlers.set(key, bucket);
}
bucket.push(callback);
}
}