@duydang2311/ragemp-utils-server
Version:
A collection of utilities for RAGE Multiplayer JavaScript module.
1 lines • 15.1 kB
Source Map (JSON)
{"version":3,"sources":["../src/index.ts","../src/streamed-meta.ts"],"sourcesContent":["export * from './streamed-meta';\r\n","import type { StreamedMetaSchema } from '@duydang2311/ragemp-utils-meta';\r\nimport type { EntityType } from '@duydang2311/ragemp-utils-shared';\r\n\r\nexport type StreamedMetaOnChangeFn = <\r\n K extends keyof StreamedMetaSchema,\r\n V extends StreamedMetaSchema[K]\r\n>(\r\n entity: EntityMp,\r\n name: K,\r\n currentValue: V | undefined,\r\n previousValue: V | undefined\r\n) => void;\r\n\r\nexport interface StreamedMetaStore {\r\n init(): void;\r\n set<K extends keyof StreamedMetaSchema>(\r\n entity: EntityMp,\r\n name: K,\r\n value: StreamedMetaSchema[K]\r\n ): void;\r\n delete<K extends keyof StreamedMetaSchema>(\r\n entity: EntityMp,\r\n name: K\r\n ): boolean;\r\n has<K extends keyof StreamedMetaSchema>(entity: EntityMp, name: K): boolean;\r\n}\r\n\r\nexport interface CreateRageMpStreamedMetaStoreOptions {\r\n entityTypes?: Exclude<EntityType, 'blip' | 'dummy' | 'pickup'>[];\r\n changeEventName?: string;\r\n streamedInEventName?: string;\r\n streamedOutEventName?: string;\r\n debug?: boolean;\r\n}\r\n\r\nexport class RageMpStreamedMetaStore implements StreamedMetaStore {\r\n static #poolByType = new Map<EntityType, EntityMpPool<EntityMp>>([\r\n // ['blip', mp.blips],\r\n ['checkpoint', mp.checkpoints],\r\n ['colshape', mp.colshapes],\r\n // ['dummy', mp.dummies],\r\n ['marker', mp.markers],\r\n ['object', mp.objects],\r\n ['player', mp.players],\r\n ['vehicle', mp.vehicles],\r\n ['ped', mp.peds],\r\n ['textlabel', mp.labels],\r\n ]);\r\n #entityTypes: Set<string>;\r\n #metas: Map<\r\n string,\r\n Map<\r\n keyof StreamedMetaSchema,\r\n StreamedMetaSchema[keyof StreamedMetaSchema]\r\n >\r\n > = new Map();\r\n #streamedEntitiesByPlayer: Map<PlayerMp, Set<EntityMp>> = new Map();\r\n #streamingPlayersByEntity: Map<EntityMp, Set<PlayerMp>> = new Map();\r\n #changeEventName: string;\r\n #streamedInEventName: string;\r\n #streamedOutEventName: string;\r\n #debug: boolean;\r\n\r\n constructor(options?: CreateRageMpStreamedMetaStoreOptions) {\r\n this.#entityTypes = new Set(options?.entityTypes ?? []);\r\n this.#changeEventName =\r\n options?.changeEventName ?? 'streamedMeta.change';\r\n this.#streamedInEventName =\r\n options?.streamedInEventName ?? 'streamedMeta.streamedIn';\r\n this.#streamedOutEventName =\r\n options?.streamedOutEventName ?? 'streamedMeta.streamedOut';\r\n this.#debug = options?.debug ?? false;\r\n }\r\n\r\n init(): void {\r\n mp.events.add(\r\n this.#streamedInEventName,\r\n (player: PlayerMp, entityType: EntityType, remoteId: number) => {\r\n if (!this.#entityTypes.has(entityType)) {\r\n return;\r\n }\r\n\r\n if (this.#debug) {\r\n console.log(\r\n `[StreamedMetaStore] ${this.#streamedInEventName}, ${\r\n player.name\r\n }, ${entityType}, ${remoteId}`\r\n );\r\n }\r\n\r\n const entity = RageMpStreamedMetaStore.#poolByType\r\n .get(entityType)\r\n ?.at(remoteId);\r\n if (!entity) {\r\n return;\r\n }\r\n\r\n const streamedEntities =\r\n this.#streamedEntitiesByPlayer.get(player);\r\n if (streamedEntities) {\r\n streamedEntities.add(entity);\r\n } else {\r\n this.#streamedEntitiesByPlayer.set(\r\n player,\r\n new Set([entity])\r\n );\r\n }\r\n\r\n const players = this.#streamingPlayersByEntity.get(entity);\r\n if (players) {\r\n players.add(player);\r\n } else {\r\n this.#streamingPlayersByEntity.set(\r\n entity,\r\n new Set([player])\r\n );\r\n }\r\n\r\n const metas = this.#metas.get(\r\n this.#createMetaKey(entityType, remoteId)\r\n );\r\n if (metas) {\r\n // TODO: bulk update in one single call instead\r\n for (const [name, value] of metas.entries()) {\r\n player.call(this.#changeEventName, [\r\n entityType,\r\n remoteId,\r\n name,\r\n value,\r\n undefined,\r\n ]);\r\n }\r\n }\r\n }\r\n );\r\n mp.events.add(\r\n this.#streamedOutEventName,\r\n (player: PlayerMp, entityType: EntityType, remoteId: number) => {\r\n if (this.#debug) {\r\n console.log(\r\n `[StreamedMetaStore] ${this.#streamedOutEventName}, ${\r\n player.name\r\n }, ${entityType}, ${remoteId}`\r\n );\r\n }\r\n if (!this.#entityTypes.has(entityType)) {\r\n return;\r\n }\r\n\r\n const entity = RageMpStreamedMetaStore.#poolByType\r\n .get(entityType)\r\n ?.at(remoteId);\r\n if (!entity) {\r\n return;\r\n }\r\n\r\n const streamedEntities =\r\n this.#streamedEntitiesByPlayer.get(player);\r\n if (streamedEntities) {\r\n streamedEntities.delete(entity);\r\n if (streamedEntities.size === 0) {\r\n this.#streamedEntitiesByPlayer.delete(player);\r\n }\r\n }\r\n\r\n const players = this.#streamingPlayersByEntity.get(entity);\r\n if (players) {\r\n players.delete(player);\r\n if (players.size === 0) {\r\n this.#streamingPlayersByEntity.delete(entity);\r\n }\r\n }\r\n }\r\n );\r\n mp.events.add('entityDestroyed', (entity) => {\r\n if (!this.#entityTypes.has(entity.type)) {\r\n return;\r\n }\r\n\r\n if (this.#debug) {\r\n console.log(\r\n `[StreamedMetaStore] entityDestroyed, ${entity.type}, ${entity.id}`\r\n );\r\n }\r\n\r\n this.#metas.delete(this.#createMetaKey(entity.type, entity.id));\r\n const players = this.#streamingPlayersByEntity.get(entity);\r\n if (players) {\r\n for (const player of players) {\r\n const entities = this.#streamedEntitiesByPlayer.get(player);\r\n if (!entities) {\r\n continue;\r\n }\r\n entities.delete(entity);\r\n if (entities.size === 0) {\r\n this.#streamedEntitiesByPlayer.delete(player);\r\n }\r\n }\r\n this.#streamingPlayersByEntity.delete(entity);\r\n }\r\n });\r\n }\r\n\r\n set<K extends keyof StreamedMetaSchema>(\r\n entity: EntityMp,\r\n name: K,\r\n value: StreamedMetaSchema[K]\r\n ): void {\r\n this.#assertEntityType(entity.type);\r\n\r\n const key = this.#createMetaKey(entity.type, entity.id);\r\n const store = this.#metas.get(key);\r\n let previousValue: StreamedMetaSchema[K] | undefined;\r\n if (!store) {\r\n this.#metas.set(key, new Map([[name, value]]));\r\n } else {\r\n previousValue = store.get(name);\r\n store.set(name, value);\r\n }\r\n\r\n if (value !== previousValue) {\r\n mp.players.call(\r\n this.#getPlayersStreamingEntity(entity),\r\n this.#changeEventName,\r\n [entity.type, entity.id, name, value, previousValue]\r\n );\r\n }\r\n }\r\n\r\n delete<K extends keyof StreamedMetaSchema>(\r\n entity: EntityMp,\r\n name: K\r\n ): boolean {\r\n this.#assertEntityType(entity.type);\r\n\r\n const key = this.#createMetaKey(entity.type, entity.id);\r\n const store = this.#metas.get(key);\r\n if (!store) {\r\n return false;\r\n }\r\n const previousValue = store.get(name);\r\n if (!store.delete(name)) {\r\n return false;\r\n }\r\n\r\n if (store.size === 0) {\r\n this.#metas.delete(key);\r\n }\r\n\r\n mp.players.call(\r\n this.#getPlayersStreamingEntity(entity),\r\n this.#changeEventName,\r\n [entity.type, entity.id, name, undefined, previousValue]\r\n );\r\n return true;\r\n }\r\n\r\n has<K extends keyof StreamedMetaSchema>(\r\n entity: EntityMp,\r\n name: K\r\n ): boolean {\r\n this.#assertEntityType(entity.type);\r\n return (\r\n this.#metas\r\n .get(this.#createMetaKey(entity.type, entity.id))\r\n ?.has(name) ?? false\r\n );\r\n }\r\n\r\n #createMetaKey(entityType: EntityType, remoteId: number): string {\r\n return `${entityType}:${remoteId}`;\r\n }\r\n\r\n #assertEntityType(type: EntityType): void {\r\n if (!this.#entityTypes.has(type)) {\r\n throw new Error(\r\n `Entity type ${type} is not supported by this store.`\r\n );\r\n }\r\n }\r\n\r\n #getPlayersStreamingEntity(entity: EntityMp) {\r\n const players = this.#streamingPlayersByEntity.get(entity);\r\n const arr = players ? Array.from(players) : [];\r\n if (entity.type === 'player') {\r\n players?.add(entity as PlayerMp);\r\n }\r\n if (entity.type === 'player') {\r\n arr.push(entity as PlayerMp);\r\n }\r\n return arr;\r\n }\r\n}\r\n"],"mappings":"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","names":[]}