import { BaseEvent } from '#application/base/baseEvent' import { Zone } from '#entities/zone' import ZoneManager from '#managers/zoneManager' import zoneManager from '#managers/zoneManager' import zoneCharacter from '#models/zoneCharacter' import CharacterRepository from '#repositories/characterRepository' interface IResponse { zone: Zone characters: zoneCharacter[] } export default class CharacterJoinEvent extends BaseEvent { public listen(): void { this.socket.on('zone:character:join', this.handleEvent.bind(this)) } private async handleEvent(callback: (response: IResponse) => void): Promise { try { if (!this.socket.characterId) { this.logger.error('zone:character:join error: Zone requested but no character id set') return } const character = await CharacterRepository.getById(this.socket.characterId) if (!character) { this.logger.error('zone:character:join error: Character not found') return } const zone = character.zone if (!zone) { // @TODO: If zone is not found, spawn back to the start this.logger.error('zone:character:join error: Zone not found') return } const loadedZone = ZoneManager.getZoneById(zone.id) if (!loadedZone) { this.logger.error('zone:character:join error: Loaded zone not found') return } loadedZone.addCharacter(character) this.socket.join(zone.id.toString()) // Let other clients know of new character this.io.to(zone.id.toString()).emit('zone:character:join', zoneManager.getCharacterById(character.id)) // Log this.logger.info(`User ${character.id} joined zone ${zone.id}`) // Send over zone and characters to socket callback({ zone, characters: loadedZone.getCharactersInZone() }) } catch (error: any) { this.logger.error('zone:character:join error: ' + error.message) this.socket.disconnect() } } }