UNPKG

@duydang2311/ragemp-utils-server

Version:

A collection of utilities for RAGE Multiplayer JavaScript module.

206 lines 6.36 kB
// src/streamed-meta.ts var RageMpStreamedMetaStore = class _RageMpStreamedMetaStore { static #poolByType = /* @__PURE__ */ new Map([ // ['blip', mp.blips], ["checkpoint", mp.checkpoints], ["colshape", mp.colshapes], // ['dummy', mp.dummies], ["marker", mp.markers], ["object", mp.objects], ["player", mp.players], ["vehicle", mp.vehicles], ["ped", mp.peds], ["textlabel", mp.labels] ]); #entityTypes; #metas = /* @__PURE__ */ new Map(); #streamedEntitiesByPlayer = /* @__PURE__ */ new Map(); #streamingPlayersByEntity = /* @__PURE__ */ new Map(); #changeEventName; #streamedInEventName; #streamedOutEventName; #debug; constructor(options) { this.#entityTypes = new Set(options?.entityTypes ?? []); this.#changeEventName = options?.changeEventName ?? "streamedMeta.change"; this.#streamedInEventName = options?.streamedInEventName ?? "streamedMeta.streamedIn"; this.#streamedOutEventName = options?.streamedOutEventName ?? "streamedMeta.streamedOut"; this.#debug = options?.debug ?? false; } init() { mp.events.add( this.#streamedInEventName, (player, entityType, remoteId) => { if (!this.#entityTypes.has(entityType)) { return; } if (this.#debug) { console.log( `[StreamedMetaStore] ${this.#streamedInEventName}, ${player.name}, ${entityType}, ${remoteId}` ); } const entity = _RageMpStreamedMetaStore.#poolByType.get(entityType)?.at(remoteId); if (!entity) { return; } const streamedEntities = this.#streamedEntitiesByPlayer.get(player); if (streamedEntities) { streamedEntities.add(entity); } else { this.#streamedEntitiesByPlayer.set( player, /* @__PURE__ */ new Set([entity]) ); } const players = this.#streamingPlayersByEntity.get(entity); if (players) { players.add(player); } else { this.#streamingPlayersByEntity.set( entity, /* @__PURE__ */ new Set([player]) ); } const metas = this.#metas.get( this.#createMetaKey(entityType, remoteId) ); if (metas) { for (const [name, value] of metas.entries()) { player.call(this.#changeEventName, [ entityType, remoteId, name, value, void 0 ]); } } } ); mp.events.add( this.#streamedOutEventName, (player, entityType, remoteId) => { if (this.#debug) { console.log( `[StreamedMetaStore] ${this.#streamedOutEventName}, ${player.name}, ${entityType}, ${remoteId}` ); } if (!this.#entityTypes.has(entityType)) { return; } const entity = _RageMpStreamedMetaStore.#poolByType.get(entityType)?.at(remoteId); if (!entity) { return; } const streamedEntities = this.#streamedEntitiesByPlayer.get(player); if (streamedEntities) { streamedEntities.delete(entity); if (streamedEntities.size === 0) { this.#streamedEntitiesByPlayer.delete(player); } } const players = this.#streamingPlayersByEntity.get(entity); if (players) { players.delete(player); if (players.size === 0) { this.#streamingPlayersByEntity.delete(entity); } } } ); mp.events.add("entityDestroyed", (entity) => { if (!this.#entityTypes.has(entity.type)) { return; } if (this.#debug) { console.log( `[StreamedMetaStore] entityDestroyed, ${entity.type}, ${entity.id}` ); } this.#metas.delete(this.#createMetaKey(entity.type, entity.id)); const players = this.#streamingPlayersByEntity.get(entity); if (players) { for (const player of players) { const entities = this.#streamedEntitiesByPlayer.get(player); if (!entities) { continue; } entities.delete(entity); if (entities.size === 0) { this.#streamedEntitiesByPlayer.delete(player); } } this.#streamingPlayersByEntity.delete(entity); } }); } set(entity, name, value) { this.#assertEntityType(entity.type); const key = this.#createMetaKey(entity.type, entity.id); const store = this.#metas.get(key); let previousValue; if (!store) { this.#metas.set(key, /* @__PURE__ */ new Map([[name, value]])); } else { previousValue = store.get(name); store.set(name, value); } if (value !== previousValue) { mp.players.call( this.#getPlayersStreamingEntity(entity), this.#changeEventName, [entity.type, entity.id, name, value, previousValue] ); } } delete(entity, name) { this.#assertEntityType(entity.type); const key = this.#createMetaKey(entity.type, entity.id); const store = this.#metas.get(key); if (!store) { return false; } const previousValue = store.get(name); if (!store.delete(name)) { return false; } if (store.size === 0) { this.#metas.delete(key); } mp.players.call( this.#getPlayersStreamingEntity(entity), this.#changeEventName, [entity.type, entity.id, name, void 0, previousValue] ); return true; } has(entity, name) { this.#assertEntityType(entity.type); return this.#metas.get(this.#createMetaKey(entity.type, entity.id))?.has(name) ?? false; } #createMetaKey(entityType, remoteId) { return `${entityType}:${remoteId}`; } #assertEntityType(type) { if (!this.#entityTypes.has(type)) { throw new Error( `Entity type ${type} is not supported by this store.` ); } } #getPlayersStreamingEntity(entity) { const players = this.#streamingPlayersByEntity.get(entity); const arr = players ? Array.from(players) : []; if (entity.type === "player") { players?.add(entity); } if (entity.type === "player") { arr.push(entity); } return arr; } }; export { RageMpStreamedMetaStore }; //# sourceMappingURL=index.js.map