forked from noxious/server
50 lines
1.6 KiB
TypeScript
50 lines
1.6 KiB
TypeScript
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<void> {
|
|
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()
|