server/src/services/zoneEventTileService.ts

52 lines
1.7 KiB
TypeScript

import { ExtendedCharacter, TSocket } from '../utilities/types'
import prisma from '../utilities/prisma'
import ZoneRepository from '../repositories/zoneRepository'
import ZoneManager from '../managers/zoneManager'
import { Character, ZoneEventTile, ZoneEventTileTeleport } from '@prisma/client'
import { Server } from 'socket.io'
import CharacterManager from '../managers/characterManager'
export class ZoneEventTileService {
public async handleTeleport(io: Server, socket: TSocket, character: ExtendedCharacter, teleport: ZoneEventTileTeleport): Promise<void> {
if (teleport.toZoneId === character.zoneId) return
const zone = await ZoneRepository.getById(teleport.toZoneId)
if (!zone) return
// CharacterManager.moveCharacterBetweenZones(character, zone)
const oldZoneId = character.zoneId
const newZoneId = teleport.toZoneId
// Update character in database
await prisma.character.update({
where: { id: character.id },
data: {
zoneId: newZoneId,
positionX: teleport.toPositionX,
positionY: teleport.toPositionY
}
})
// Update local character object
character.zoneId = newZoneId
character.positionX = teleport.toPositionX
character.positionY = teleport.toPositionY
// 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())
socket.join(newZoneId.toString())
// Send teleport information to the client
socket.emit('zone:teleport', {
zone,
characters: CharacterManager.getCharactersInZone(zone)
})
}
}