Fix for creating new characters, added teleport function to zone character model

This commit is contained in:
Dennis Postma 2025-01-01 03:00:03 +01:00
parent 9d6a8730a9
commit 30b2028bd8
4 changed files with 71 additions and 4 deletions

View File

@ -56,7 +56,24 @@ export default class CharacterConnectEvent extends BaseEvent {
// Emit character connect event // Emit character connect event
callback({ character }) 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) { } catch (error) {
this.handleError('Failed to connect character', error) this.handleError('Failed to connect character', error)
} }

View File

@ -5,6 +5,7 @@ import { ZCharacterCreate } from '#application/zodTypes'
import { Character } from '#entities/character' import { Character } from '#entities/character'
import CharacterRepository from '#repositories/characterRepository' import CharacterRepository from '#repositories/characterRepository'
import UserRepository from '#repositories/userRepository' import UserRepository from '#repositories/userRepository'
import ZoneRepository from '#repositories/zoneRepository'
export default class CharacterCreateEvent extends BaseEvent { export default class CharacterCreateEvent extends BaseEvent {
public listen(): void { 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' }) return this.socket.emit('notification', { message: 'You can only have 4 characters' })
} }
const newCharacter = new Character() // @TODO: Change to default location
await newCharacter.setName(data.name).setUser(user).save() 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] characters = [...characters, newCharacter]

View File

@ -1,4 +1,7 @@
import { Character } from '#entities/character' import { Character } from '#entities/character'
import ZoneManager from '#managers/zoneManager'
import Logger, { LoggerType } from '#application/logger'
import SocketManager from '#managers/socketManager'
class ZoneCharacter { class ZoneCharacter {
public readonly character: Character public readonly character: Character
@ -12,6 +15,42 @@ class ZoneCharacter {
public async savePosition() { public async savePosition() {
await this.character.setPositionX(this.character.positionX).setPositionY(this.character.positionY).setRotation(this.character.rotation).setZone(this.character.zone).update() 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<void> {
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 export default ZoneCharacter

View File

@ -5,6 +5,7 @@ import { Zone } from '#entities/zone'
import ZoneManager from '#managers/zoneManager' import ZoneManager from '#managers/zoneManager'
import CharacterRepository from '#repositories/characterRepository' import CharacterRepository from '#repositories/characterRepository'
import ZoneRepository from '#repositories/zoneRepository' import ZoneRepository from '#repositories/zoneRepository'
import SocketManager from '#managers/socketManager'
type Position = { x: number; y: number } type Position = { x: number; y: number }
export type Node = Position & { parent?: Node; g: number; h: number; f: number } export type Node = Position & { parent?: Node; g: number; h: number; f: number }