diff --git a/src/events/zone/characterMoveEvent.ts b/src/events/zone/characterMoveEvent.ts index dabc9db..04072b9 100644 --- a/src/events/zone/characterMoveEvent.ts +++ b/src/events/zone/characterMoveEvent.ts @@ -65,6 +65,7 @@ export default class CharacterMoveEvent { if (zoneEventTile) { await this.handleZoneEventTile(zoneEventTile) + break } await this.characterMoveService.updatePosition(character, position) @@ -85,8 +86,7 @@ export default class CharacterMoveEvent { const teleport = zoneEventTile.teleport if (teleport) { - await this.characterMoveService.updatePosition(character, { x: teleport.toPositionX, y: teleport.toPositionY }, teleport.toZoneId) - await this.zoneEventTileService.handleTeleport(this.socket, character, teleport) + await this.zoneEventTileService.handleTeleport(this.io, this.socket, character, teleport) return } } diff --git a/src/services/zoneEventTileService.ts b/src/services/zoneEventTileService.ts index 3a9447f..aa4d6fb 100644 --- a/src/services/zoneEventTileService.ts +++ b/src/services/zoneEventTileService.ts @@ -2,15 +2,19 @@ import { ExtendedCharacter, TSocket } from '../utilities/types' import prisma from '../utilities/prisma' import ZoneRepository from '../repositories/zoneRepository' import ZoneManager from '../managers/zoneManager' -import { ZoneEventTile, ZoneEventTileTeleport } from '@prisma/client' +import { Character, ZoneEventTile, ZoneEventTileTeleport } from '@prisma/client' +import { Server } from 'socket.io' export class ZoneEventTileService { - public async handleTeleport(socket: TSocket, character: ExtendedCharacter, teleport: ZoneEventTileTeleport): Promise { + public async handleTeleport(io: Server, socket: TSocket, character: ExtendedCharacter, teleport: ZoneEventTileTeleport): Promise { if (teleport.toZoneId === character.zoneId) return const zone = await ZoneRepository.getById(teleport.toZoneId) if (!zone) return + const oldZoneId = character.zoneId + const newZoneId = teleport.toZoneId + character.zoneId = teleport.toZoneId character.positionX = teleport.toPositionX character.positionY = teleport.toPositionY @@ -18,6 +22,11 @@ export class ZoneEventTileService { socket.leave(character.zoneId.toString()) socket.join(teleport.toZoneId.toString()) + io.to(oldZoneId.toString()).emit('zone:character:leave', character); + io.to(newZoneId.toString()).emit('zone:character:join', character); + ZoneManager.removeCharacterFromZone(oldZoneId, character as Character); + ZoneManager.addCharacterToZone(newZoneId, character as Character); + socket.emit('zone:teleport', { zone, characters: ZoneManager.getCharactersInZone(zone.id)