forked from noxious/server
Renamed zone > map
This commit is contained in:
50
src/managers/mapManager.ts
Normal file
50
src/managers/mapManager.ts
Normal file
@ -0,0 +1,50 @@
|
||||
import Logger, { LoggerType } from '#application/logger'
|
||||
import { UUID } from '#application/types'
|
||||
import { Map } from '#entities/map'
|
||||
import LoadedMap from '#models/loadedMap'
|
||||
import MapCharacter from '#models/mapCharacter'
|
||||
import MapRepository from '#repositories/mapRepository'
|
||||
|
||||
class MapManager {
|
||||
private readonly maps: Record<UUID, LoadedMap> = {}
|
||||
private logger = Logger.type(LoggerType.GAME)
|
||||
|
||||
public async boot(): Promise<void> {
|
||||
const maps = await MapRepository.getAll()
|
||||
await Promise.all(maps.map((map) => this.loadMap(map)))
|
||||
|
||||
this.logger.info(`Map manager loaded with ${Object.keys(this.maps).length} maps`)
|
||||
}
|
||||
|
||||
public async loadMap(map: Map): Promise<void> {
|
||||
this.maps[map.id] = new LoadedMap(map)
|
||||
this.logger.info(`Map ID ${map.id} loaded`)
|
||||
}
|
||||
|
||||
public unloadMap(mapId: UUID): void {
|
||||
delete this.maps[mapId]
|
||||
this.logger.info(`Map ID ${mapId} unloaded`)
|
||||
}
|
||||
|
||||
public getLoadedMaps(): LoadedMap[] {
|
||||
return Object.values(this.maps)
|
||||
}
|
||||
|
||||
public getMapById(mapId: UUID): LoadedMap | undefined {
|
||||
return this.maps[mapId]
|
||||
}
|
||||
|
||||
public getCharacterById(characterId: UUID): MapCharacter | undefined {
|
||||
for (const map of Object.values(this.maps)) {
|
||||
const character = map.getCharactersInMap().find((char) => char.character.id === characterId)
|
||||
if (character) return character
|
||||
}
|
||||
return undefined
|
||||
}
|
||||
|
||||
public removeCharacter(characterId: UUID): void {
|
||||
Object.values(this.maps).forEach((map) => map.removeCharacter(characterId))
|
||||
}
|
||||
}
|
||||
|
||||
export default new MapManager()
|
Reference in New Issue
Block a user