diff --git a/src/events/character/connect.ts b/src/events/character/connect.ts index f8744b3..8fd3bdb 100644 --- a/src/events/character/connect.ts +++ b/src/events/character/connect.ts @@ -56,7 +56,24 @@ export default class CharacterConnectEvent extends BaseEvent { // Emit character connect event callback({ character }) - // @TODO: Teleport character into zone + // wait 300 ms, @TODO: Find a better way to do this + await new Promise(resolve => setTimeout(resolve, 100)) + + const zone = ZoneManager.getZoneById(character.zone!.id) + if (!zone) { + this.logger.error('zone:character:join error: Zone not found') + return + } + + zone.addCharacter(character) + + const zoneCharacter = ZoneManager.getCharacterById(character.id) + if (!zoneCharacter) { + this.logger.error('zone:character:join error: Zone character not found') + return + } + + await zoneCharacter.teleport(character.zone!.id, character.positionX, character.positionY) } catch (error) { this.handleError('Failed to connect character', error) } diff --git a/src/events/character/create.ts b/src/events/character/create.ts index 83793dc..b955d14 100644 --- a/src/events/character/create.ts +++ b/src/events/character/create.ts @@ -5,6 +5,7 @@ import { ZCharacterCreate } from '#application/zodTypes' import { Character } from '#entities/character' import CharacterRepository from '#repositories/characterRepository' import UserRepository from '#repositories/userRepository' +import ZoneRepository from '#repositories/zoneRepository' export default class CharacterCreateEvent extends BaseEvent { public listen(): void { @@ -35,10 +36,19 @@ export default class CharacterCreateEvent extends BaseEvent { return this.socket.emit('notification', { message: 'You can only have 4 characters' }) } - const newCharacter = new Character() - await newCharacter.setName(data.name).setUser(user).save() + // @TODO: Change to default location + const zone = await ZoneRepository.getFirst() - if (!newCharacter) return this.socket.emit('notification', { message: 'Failed to create character. Please try again (later).' }) + const newCharacter = new Character() + await newCharacter + .setName(data.name) + .setUser(user) + .setZone(zone!) + .save() + + if (!newCharacter) { + return this.socket.emit('notification', { message: 'Failed to create character. Please try again (later).' }) + } characters = [...characters, newCharacter] diff --git a/src/models/zoneCharacter.ts b/src/models/zoneCharacter.ts index 7a4c05c..8bfde71 100644 --- a/src/models/zoneCharacter.ts +++ b/src/models/zoneCharacter.ts @@ -1,4 +1,7 @@ import { Character } from '#entities/character' +import ZoneManager from '#managers/zoneManager' +import Logger, { LoggerType } from '#application/logger' +import SocketManager from '#managers/socketManager' class ZoneCharacter { public readonly character: Character @@ -12,6 +15,42 @@ class ZoneCharacter { public async savePosition() { await this.character.setPositionX(this.character.positionX).setPositionY(this.character.positionY).setRotation(this.character.rotation).setZone(this.character.zone).update() } + + public async teleport(zoneId: number, targetX: number, targetY: number): Promise { + const io = SocketManager.getIO() + const socket = SocketManager.getSocketByCharacterId(this.character.id) + const zone = ZoneManager.getZoneById(zoneId)?.getZone() + const logger = Logger.type(LoggerType.APP) + console.log('teleporting') + + if (!socket) { + logger.error('zone:character:move error: Socket not found') + return + } + + if (!zone) { + logger.error('zone:character:move error: Zone not found') + return + } + + // Let other clients know of new character + io.to(zone.id.toString()).emit('zone:character:join', 'ewaewa') + + // Update zoneCharacter properties + this.currentPath = null + this.isMoving = false + + // Update local character object + await this.character.setPositionX(targetX).setPositionY(targetY).setRotation(this.character.rotation).setZone(zone).update() + + // Emit teleport event + socket.emit('zone:character:teleport', { + zone, + characters: ZoneManager.getZoneById(zone.id)?.getCharactersInZone() + }) + + console.log('teleported') + } } export default ZoneCharacter diff --git a/src/services/characterService.ts b/src/services/characterService.ts index dc48af9..e4d2633 100644 --- a/src/services/characterService.ts +++ b/src/services/characterService.ts @@ -5,6 +5,7 @@ import { Zone } from '#entities/zone' import ZoneManager from '#managers/zoneManager' import CharacterRepository from '#repositories/characterRepository' import ZoneRepository from '#repositories/zoneRepository' +import SocketManager from '#managers/socketManager' type Position = { x: number; y: number } export type Node = Position & { parent?: Node; g: number; h: number; f: number }