UNPKG

rock-mod

Version:

Rock-Mod is a powerful framework designed for creating and managing mods for Grand Theft Auto (GTA) games.

181 lines (180 loc) 6.57 kB
import { ClientInternalEventName } from "../../../net/common/events/types"; import { CCMPMarker } from "./CCMPMarker"; export class CCMPMarkersManager { constructor(_events) { this._events = _events; this._markers = new Map(); this._markersByRemoteId = new Map(); this._iterator = { all: () => this._filter(() => true), dimension: (value) => this._filter((marker) => marker.dimension === value), range2D: (center, range) => this._filter((marker) => { const position = marker.position; const squaredDistance = (position.x - center.x) ** 2 + (position.y - center.y) ** 2; return squaredDistance <= range * range; }), range3D: (center, range) => this._filter((marker) => marker.position.isInRange(center, range)), }; this._registerLifecycleEvents(); this.syncWithMpPool(); } create(options) { const { r, g, b, a } = options.color; const ccmpMarker = ccmp.markers.create(options.type, options.position, { dimension: options.dimension, rotation: options.rotation, scale: options.scale, color: { r, g, b, a: a !== null && a !== void 0 ? a : 255 }, }); if (!ccmpMarker) { throw new Error(`CCMPMarkersManager.create: ccmp.markers.create failed for marker type "${options.type}"`); } return this._register(ccmpMarker); } syncWithMpPool() { this._pruneDestroyed(); for (const ccmpMarker of ccmp.markers.all) { this._register(ccmpMarker); } } registerById(id) { const existingMarker = this.findByID(id); if (existingMarker) { return existingMarker; } const ccmpMarker = ccmp.markers.getById(id); if (!ccmpMarker) { throw new Error(`CCMPMarkersManager.registerById(${id}): marker not found.`); } return this._register(ccmpMarker); } unregisterById(id) { return this.deleteById(id); } findByID(id) { var _a; const marker = (_a = this._markers.get(id)) !== null && _a !== void 0 ? _a : null; if (marker && !marker.isExists) { this._unregister(marker); } else if (marker) { return marker; } const ccmpMarker = ccmp.markers.getById(id); if (!ccmpMarker) { return null; } return this._register(ccmpMarker); } getByID(id) { const marker = this.findByID(id); if (!marker) { throw new Error(`CCMPMarkersManager.getByID(${id}): marker not found.`); } return marker; } findByRemoteID(remoteId) { var _a; const marker = (_a = this._markersByRemoteId.get(remoteId)) !== null && _a !== void 0 ? _a : null; if (marker && !marker.isExists) { this._unregister(marker); } else if (marker) { return marker; } const ccmpMarker = ccmp.markers.getByRemoteId(remoteId); if (!ccmpMarker) { return null; } return this._register(ccmpMarker); } getByRemoteID(remoteId) { const marker = this.findByRemoteID(remoteId); if (!marker) { throw new Error(`CCMPMarkersManager.getByRemoteID(${remoteId}): marker not found.`); } return marker; } deleteById(id) { const marker = this.getByID(id); marker.destroy(); return marker; } get iterator() { return this._iterator; } _register(ccmpMarker) { const existingMarker = this._findRegistered(ccmpMarker); if (existingMarker && existingMarker.isExists) { return existingMarker; } if (existingMarker) { this._unregister(existingMarker); } const marker = new CCMPMarker(ccmpMarker, (destroyedMarker) => { this._unregister(destroyedMarker); }); this._markers.set(marker.id, marker); if (marker.remoteId !== null) { this._markersByRemoteId.set(marker.remoteId, marker); } return marker; } _unregister(marker) { this._markers.delete(marker.id); if (marker.remoteId !== null) { this._markersByRemoteId.delete(marker.remoteId); } } _findRegistered(ccmpMarker) { var _a, _b, _c; return ((_c = (_b = (ccmpMarker.remoteId === null ? null : ((_a = this._markersByRemoteId.get(ccmpMarker.remoteId)) !== null && _a !== void 0 ? _a : null))) !== null && _b !== void 0 ? _b : this._markers.get(ccmpMarker.id)) !== null && _c !== void 0 ? _c : null); } _registerLifecycleEvents() { ccmp.on("markerCreated", (ccmpMarker) => { if (!ccmpMarker) return; const marker = this._register(ccmpMarker); this._events.emitInternal(ClientInternalEventName.EntityCreated, marker); }); ccmp.on("markerDestroyed", (ccmpMarker) => { var _a; if (!ccmpMarker) return; const marker = (_a = this._findRegistered(ccmpMarker)) !== null && _a !== void 0 ? _a : this._register(ccmpMarker); this._events.emitInternal(ClientInternalEventName.EntityDestroyed, marker); this._unregister(marker); }); ccmp.on("markerStreamIn", (ccmpMarker) => { if (!ccmpMarker) return; const marker = this._register(ccmpMarker); this._events.emitInternal(ClientInternalEventName.EntityStreamIn, marker); }); ccmp.on("markerStreamOut", (ccmpMarker) => { var _a; if (!ccmpMarker) return; const marker = (_a = this._findRegistered(ccmpMarker)) !== null && _a !== void 0 ? _a : this._register(ccmpMarker); this._events.emitInternal(ClientInternalEventName.EntityStreamOut, marker); }); } *_filter(predicate) { for (const marker of this._markers.values()) { if (!marker.isExists) { this._unregister(marker); continue; } if (predicate(marker)) { yield marker; } } } _pruneDestroyed() { for (const marker of this._markers.values()) { if (!marker.isExists) { this._unregister(marker); } } } }