1
0
forked from noxious/server
noxious_server/src/services/zoneEventTileService.ts
2025-01-01 04:48:30 +01:00

50 lines
1.7 KiB
TypeScript

import { Server } from 'socket.io'
import { BaseService } from '#application/base/baseService'
import { ExtendedCharacter, TSocket } from '#application/types'
import { ZoneEventTileTeleport } from '#entities/zoneEventTileTeleport'
import ZoneManager from '#managers/zoneManager'
class ZoneEventTileService extends BaseService {
public async handleTeleport(io: Server, socket: TSocket, character: ExtendedCharacter, teleport: ZoneEventTileTeleport): Promise<void> {
if (teleport.toZone.id === character.zone.id) return
const loadedZone = ZoneManager.getZoneById(teleport.toZone.id)
if (!loadedZone) {
this.logger.error('zone:character:join error: Loaded zone not found')
return
}
const zone = loadedZone.getZone()
const oldZoneId = character.zone.id
const newZoneId = teleport.toZone.id
character.isMoving = false
// Update local character object
character.setZone(teleport.toZone).setRotation(teleport.toRotation).setPositionX(teleport.toPositionX).setPositionY(teleport.toPositionY)
await character.save()
// Remove and add character to new zone
await loadedZone.removeCharacter(character.id)
loadedZone.addCharacter(character)
// Emit events
io.to(oldZoneId.toString()).emit('zone:character:leave', character.id)
io.to(newZoneId.toString()).emit('zone:character:join', character)
// Update socket rooms
socket.leave(oldZoneId.toString())
socket.join(newZoneId.toString())
// Send teleport information to the client
socket.emit('zone:character:teleport', {
zone,
characters: loadedZone.getCharactersInZone()
})
}
}
export default new ZoneEventTileService()