diff --git a/src/events/chat/gameMaster/teleportCommand.ts b/src/events/chat/gameMaster/teleportCommand.ts index 68468da..3caea9e 100644 --- a/src/events/chat/gameMaster/teleportCommand.ts +++ b/src/events/chat/gameMaster/teleportCommand.ts @@ -65,8 +65,6 @@ export default class TeleportCommandEvent { // Update character in CharacterManager CharacterManager.initCharacter(this.socket.character) - this.socket.emit('zone:character:load_assets', zone.id); - this.socket.emit('zone:teleport', { zone, characters: CharacterManager.getCharactersInZone(zone) diff --git a/src/managers/zoneManager.ts b/src/managers/zoneManager.ts index 40f7dfe..7d2a808 100644 --- a/src/managers/zoneManager.ts +++ b/src/managers/zoneManager.ts @@ -26,36 +26,16 @@ class ZoneManager { logger.info('Zone manager loaded') } - // For now only current zone. - 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])); + public async getZoneAssets(zone: Zone): 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)); + const mappedObjects = this.getUnique(objects.map(x => x.objectId)); return { - tiles: this.getUnique([...tiles, ...(toZoneAssets ? toZoneAssets.tiles : [])]), - objects: this.getUnique([...mappedObjects, ...(toZoneAssets ? toZoneAssets.objects : [])]), + tiles: tiles, + objects: mappedObjects, } as ZoneAssets; } @@ -67,7 +47,7 @@ class ZoneManager { public async loadZone(zone: Zone) { const loadedZone = new LoadedZone(zone) this.loadedZones.push(loadedZone) - await this.getNeededAssets(zone); + await this.getZoneAssets(zone); logger.info(`Zone ID ${zone.id} loaded`) } diff --git a/src/services/zoneEventTileService.ts b/src/services/zoneEventTileService.ts index 8bd4c9b..d60c325 100644 --- a/src/services/zoneEventTileService.ts +++ b/src/services/zoneEventTileService.ts @@ -35,7 +35,6 @@ export class ZoneEventTileService { // Emit events io.to(oldZoneId.toString()).emit('zone:character:leave', character.id) io.to(newZoneId.toString()).emit('zone:character:join', character) - socket.emit('zone:character:load_assets', newZoneId); // Update socket rooms socket.leave(oldZoneId.toString()) diff --git a/src/utilities/http.ts b/src/utilities/http.ts index 2121dea..809fd68 100644 --- a/src/utilities/http.ts +++ b/src/utilities/http.ts @@ -52,42 +52,45 @@ async function addHttpRoutes(app: Application) { }) app.get('/assets/:zoneId', async (req: Request, res: Response) => { - const zoneId = req.params.zoneId - if(zoneId && parseInt(zoneId)) { - const zone = await zoneRepository.getById(parseInt(zoneId)) - if(zone) { - const assets = await zoneManager.getNeededAssets(zone); - const sprites = await spriteRepository.getAll() - const spritesArray: TAsset[] = []; - sprites.forEach((sprite) => { - sprite.spriteActions.forEach((spriteAction) => { - spritesArray.push({ - key: sprite.id + '-' + spriteAction.action, - url: '/assets/sprites/' + sprite.id + '/' + spriteAction.action + '.png', - group: spriteAction.isAnimated ? 'sprite_animations' : 'sprites', - frameWidth: spriteAction.frameWidth, - frameHeight: spriteAction.frameHeight - }) - }) - }) + const zoneId = parseInt(req.params.zoneId); - res.json([ - ...spritesArray, - ...assets.tiles.map(x => { return { - key: x, - url: '/assets/tiles/' + x + '.png', - group: 'tiles' - }}), - ...assets.objects.map(x => { return { - key: x, - url: '/assets/objects/' + x + '.png', - group: 'objects' - }}) - ]); - // res.json( ); - } + if (isNaN(zoneId) || zoneId === 0) { + return res.status(400).json({ message: 'Invalid zone ID' }); } - }) + + const zone = await zoneRepository.getById(zoneId); + + if (!zone) { + return res.status(404).json({ message: 'Zone not found' }); + } + + const assets = await zoneManager.getZoneAssets(zone); + const sprites = await spriteRepository.getAll(); + + const spritesAssets = sprites.flatMap(sprite => + sprite.spriteActions.map(action => ({ + key: `${sprite.id}-${action.action}`, + url: `/assets/sprites/${sprite.id}/${action.action}.png`, + group: action.isAnimated ? 'sprite_animations' : 'sprites', + frameWidth: action.frameWidth, + frameHeight: action.frameHeight + })) + ); + + const tilesAssets = assets.tiles.map(tile => ({ + key: tile, + url: `/assets/tiles/${tile}.png`, + group: 'tiles' + })); + + const objectsAssets = assets.objects.map(object => ({ + key: object, + url: `/assets/objects/${object}.png`, + group: 'objects' + })); + + res.json([...spritesAssets, ...tilesAssets, ...objectsAssets]); + }); app.get('/assets/:type/:spriteId?/:file', (req: Request, res: Response) => { const assetType = req.params.type