diff --git a/src/events/zone/characterMove.ts b/src/events/zone/characterMove.ts index 704dc1a..4c2a4d1 100644 --- a/src/events/zone/characterMove.ts +++ b/src/events/zone/characterMove.ts @@ -10,7 +10,7 @@ import CharacterManager from '../../managers/characterManager' import zoneManager from '../../managers/zoneManager' import ZoneManager from '../../managers/zoneManager' -type ZoneEventTileWithTeleport = ZoneEventTile & { +export type ZoneEventTileWithTeleport = ZoneEventTile & { teleport: ZoneEventTileTeleport } diff --git a/src/managers/zoneManager.ts b/src/managers/zoneManager.ts index 9ce92fd..40f7dfe 100644 --- a/src/managers/zoneManager.ts +++ b/src/managers/zoneManager.ts @@ -1,9 +1,11 @@ -import { Zone } from '@prisma/client' +import { Zone, ZoneEventTileTeleport, ZoneEventTileType } from '@prisma/client' import ZoneRepository from '../repositories/zoneRepository' import ZoneService from '../services/zoneService' import logger from '../utilities/logger' import LoadedZone from '../models/loadedZone' import zoneRepository from '../repositories/zoneRepository' +import { beforeEach } from 'node:test' +import prisma from '../utilities/prisma' class ZoneManager { private loadedZones: LoadedZone[] = [] @@ -25,15 +27,36 @@ class ZoneManager { } // For now only current zone. - public async getNeededAssets(zone: Zone) { - const tiles = this.getUnique((JSON.parse(JSON.stringify(zone.tiles)) as string[][]).reduce((acc, val) => [...acc, ...val])); + public async getNeededAssets(zone: Zone, getMore = true): Promise { + const tiles: string[] = this.getUnique((JSON.parse(JSON.stringify(zone.tiles)) as string[][]).reduce((acc, val) => [...acc, ...val])); const objects = await zoneRepository.getObjects(zone.id); + const eventTeleportTiles = await zoneRepository.getEventTeleportTiles(zone.id); + let toZoneAssets = null; + if(getMore) { + for (const eventTeleportTile of eventTeleportTiles) { + console.log(eventTeleportTile); + console.log(eventTeleportTile.teleport.toZoneId); + const toZone = await zoneRepository.getById(eventTeleportTile.teleport.toZoneId); + console.log(toZone); + if(toZone) { + if(!toZoneAssets) { + toZoneAssets = await this.getNeededAssets(toZone, false); + } else { + const newToZoneAssets = await this.getNeededAssets(toZone, false); + toZoneAssets = { + tiles: this.getUnique([...toZoneAssets.tiles, ...(newToZoneAssets ? newToZoneAssets.tiles : [])]), + objects: this.getUnique([...toZoneAssets.objects, ...(newToZoneAssets ? newToZoneAssets.objects : [])]), + } as ZoneAssets + } + } + } + } let mappedObjects = this.getUnique(objects.map(x => x.objectId)); return { - tiles, - objects: mappedObjects - }; + tiles: this.getUnique([...tiles, ...(toZoneAssets ? toZoneAssets.tiles : [])]), + objects: this.getUnique([...mappedObjects, ...(toZoneAssets ? toZoneAssets.objects : [])]), + } as ZoneAssets; } private getUnique(array: T[]) { @@ -65,4 +88,9 @@ class ZoneManager { } } +export interface ZoneAssets { + tiles: string[] + objects: string[] +} + export default new ZoneManager() diff --git a/src/repositories/zoneRepository.ts b/src/repositories/zoneRepository.ts index 57fdd0d..73fda8f 100644 --- a/src/repositories/zoneRepository.ts +++ b/src/repositories/zoneRepository.ts @@ -1,6 +1,7 @@ -import { Zone, ZoneEventTile, ZoneObject } from '@prisma/client' +import { Zone, ZoneEventTile, ZoneEventTileTeleport, ZoneEventTileType, ZoneObject } from '@prisma/client' import prisma from '../utilities/prisma' import logger from '../utilities/logger' +import { ZoneEventTileWithTeleport } from '../events/zone/characterMove' class ZoneRepository { async getFirst(): Promise { @@ -60,6 +61,21 @@ class ZoneRepository { } } + async getEventTeleportTiles(id: number): Promise { + try { + return await prisma.zoneEventTile.findMany({ + where: { + zoneId: id, + type: ZoneEventTileType.TELEPORT + }, + include: { teleport: true } + }) as unknown as ZoneEventTileWithTeleport[] + } catch (error: any) { + logger.error(`Failed to get zone event tiles: ${error.message}`) + return [] + } + } + async getObjects(id: number): Promise { try { return await prisma.zoneObject.findMany({ diff --git a/src/services/zoneEventTileService.ts b/src/services/zoneEventTileService.ts index 683278b..38b3c59 100644 --- a/src/services/zoneEventTileService.ts +++ b/src/services/zoneEventTileService.ts @@ -36,6 +36,7 @@ export class ZoneEventTileService { // Emit events io.to(oldZoneId.toString()).emit('zone:character:leave', character.id) io.to(newZoneId.toString()).emit('zone:character:join', character) + io.to(socket.id).emit('zone:character:load_assets', newZoneId); // Update socket rooms socket.leave(oldZoneId.toString())