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
JavaScript
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);
}
}
}
}