import { Server } from 'socket.io' import { BaseService } from '#application/base/baseService' import { ExtendedCharacter, TSocket } from '#application/types' import { MapEventTileTeleport } from '#entities/mapEventTileTeleport' import MapManager from '#managers/mapManager' class MapEventTileService extends BaseService { public async handleTeleport(io: Server, socket: TSocket, character: ExtendedCharacter, teleport: MapEventTileTeleport): Promise { if (teleport.toMap.id === character.map.id) return const loadedMap = MapManager.getMapById(teleport.toMap.id) if (!loadedMap) { this.logger.error('map:character:join error: Loaded map not found') return } const map = loadedMap.getMap() const oldMapId = character.map.id const newMapId = teleport.toMap.id character.isMoving = false // Update local character object character.setMap(teleport.toMap).setRotation(teleport.toRotation).setPositionX(teleport.toPositionX).setPositionY(teleport.toPositionY) await character.save() // Remove and add character to new map await loadedMap.removeCharacter(character.id) loadedMap.addCharacter(character) // Emit events io.to(oldMapId).emit('map:character:leave', character.id) io.to(newMapId).emit('map:character:join', character) // Update socket rooms socket.leave(oldMapId) socket.join(newMapId) // Send teleport information to the client socket.emit('map:character:teleport', { map, characters: loadedMap.getCharactersInMap() }) } } export default new MapEventTileService()