1
0
forked from noxious/server

Improved entities, ran formatting, utilise getters and setters

This commit is contained in:
Dennis Postma 2024-12-26 16:45:00 +01:00
parent 691abb7c4f
commit 4a963b4359
18 changed files with 68 additions and 97 deletions

View File

@ -1,6 +1,6 @@
import { Migration } from '@mikro-orm/migrations'; import { Migration } from '@mikro-orm/migrations';
export class Migration20241226031358 extends Migration { export class Migration20241226153149 extends Migration {
override async up(): Promise<void> { override async up(): Promise<void> {
this.addSql(`create table \`map_object\` (\`id\` varchar(255) not null, \`name\` varchar(255) not null, \`tags\` json null, \`origin_x\` int not null default 0, \`origin_y\` int not null default 0, \`is_animated\` tinyint(1) not null default false, \`frame_rate\` int not null default 0, \`frame_width\` int not null default 0, \`frame_height\` int not null default 0, \`created_at\` datetime not null, \`updated_at\` datetime not null, primary key (\`id\`)) default character set utf8mb4 engine = InnoDB;`); this.addSql(`create table \`map_object\` (\`id\` varchar(255) not null, \`name\` varchar(255) not null, \`tags\` json null, \`origin_x\` int not null default 0, \`origin_y\` int not null default 0, \`is_animated\` tinyint(1) not null default false, \`frame_rate\` int not null default 0, \`frame_width\` int not null default 0, \`frame_height\` int not null default 0, \`created_at\` datetime not null, \`updated_at\` datetime not null, primary key (\`id\`)) default character set utf8mb4 engine = InnoDB;`);

View File

@ -42,17 +42,17 @@ export class Character extends BaseEntity {
rotation = 0 rotation = 0
// Customization // Customization
@ManyToOne(() => CharacterType, { nullable: true }) @ManyToOne()
characterType?: CharacterType characterType?: CharacterType
@ManyToOne(() => CharacterHair, { nullable: true }) @ManyToOne()
characterHair?: CharacterHair characterHair?: CharacterHair
// Inventory // Inventory
@OneToMany(() => CharacterItem, (item) => item.character) @OneToMany({ mappedBy: 'character' })
items = new Collection<CharacterItem>(this) items = new Collection<CharacterItem>(this)
@OneToMany(() => CharacterEquipment, (equipment) => equipment.character) @OneToMany({ mappedBy: 'character' })
equipment = new Collection<CharacterEquipment>(this) equipment = new Collection<CharacterEquipment>(this)
// Stats // Stats

View File

@ -2,9 +2,6 @@ import { randomUUID } from 'node:crypto'
import { Collection, Entity, OneToMany, PrimaryKey, Property } from '@mikro-orm/core' import { Collection, Entity, OneToMany, PrimaryKey, Property } from '@mikro-orm/core'
import { BaseEntity } from '#application/bases/baseEntity' import { BaseEntity } from '#application/bases/baseEntity'
import { SpriteAction } from './spriteAction' import { SpriteAction } from './spriteAction'
import { CharacterType } from './characterType'
import { CharacterHair } from './characterHair'
import { Item } from './item'
import { UUID } from '#application/types' import { UUID } from '#application/types'
@Entity() @Entity()
@ -15,24 +12,15 @@ export class Sprite extends BaseEntity {
@Property() @Property()
name!: string name!: string
@OneToMany(() => SpriteAction, (action) => action.sprite)
spriteActions = new Collection<SpriteAction>(this)
@Property() @Property()
createdAt = new Date() createdAt = new Date()
@Property() @Property()
updatedAt = new Date() updatedAt = new Date()
@OneToMany(() => SpriteAction, (action) => action.sprite)
spriteActions = new Collection<SpriteAction>(this)
@OneToMany(() => CharacterType, (type) => type.sprite)
characterTypes = new Collection<CharacterType>(this)
@OneToMany(() => CharacterHair, (hair) => hair.sprite)
characterHairs = new Collection<CharacterHair>(this)
@OneToMany(() => Item, (item) => item.sprite)
items = new Collection<Item>(this)
setId(id: UUID) { setId(id: UUID) {
this.id = id this.id = id
return this return this
@ -51,6 +39,15 @@ export class Sprite extends BaseEntity {
return this.name return this.name
} }
setSpriteActions(spriteActions: Collection<SpriteAction>) {
this.spriteActions = spriteActions
return this
}
getSpriteActions() {
return this.spriteActions
}
setCreatedAt(createdAt: Date) { setCreatedAt(createdAt: Date) {
this.createdAt = createdAt this.createdAt = createdAt
return this return this

View File

@ -20,7 +20,7 @@ router.post('/login', async (req: Request, res: Response) => {
const user = await userService.login(username, password) const user = await userService.login(username, password)
if (user && typeof user !== 'boolean') { if (user && typeof user !== 'boolean') {
const token = jwt.sign({ id: user.id }, config.JWT_SECRET, { expiresIn: '4h' }) const token = jwt.sign({ id: user.getId() }, config.JWT_SECRET, { expiresIn: '4h' })
return res.status(200).json({ token }) return res.status(200).json({ token })
} }

View File

@ -6,7 +6,7 @@ class CharacterHairRepository extends BaseRepository {
async getFirst() { async getFirst() {
try { try {
const repository = this.em.getRepository(CharacterHair) const repository = this.em.getRepository(CharacterHair)
return await repository.findOne({ id: { $exists: true } }) return await repository.findOne({ id: { $exists: true } }, { populate: ['*'] })
} catch (error: any) { } catch (error: any) {
appLogger.error(`Failed to get first character hair: ${error instanceof Error ? error.message : String(error)}`) appLogger.error(`Failed to get first character hair: ${error instanceof Error ? error.message : String(error)}`)
return null return null
@ -16,7 +16,7 @@ class CharacterHairRepository extends BaseRepository {
async getAll() { async getAll() {
try { try {
const repository = this.em.getRepository(CharacterHair) const repository = this.em.getRepository(CharacterHair)
return await repository.findAll() return await repository.findAll({ populate: ['*'] })
} catch (error: any) { } catch (error: any) {
appLogger.error(`Failed to get all character hair: ${error instanceof Error ? error.message : String(error)}`) appLogger.error(`Failed to get all character hair: ${error instanceof Error ? error.message : String(error)}`)
return null return null
@ -26,9 +26,7 @@ class CharacterHairRepository extends BaseRepository {
async getAllSelectable() { async getAllSelectable() {
try { try {
const repository = this.em.getRepository(CharacterHair) const repository = this.em.getRepository(CharacterHair)
return await repository.find({ return await repository.find({ isSelectable: true }, { populate: ['*'] })
isSelectable: true
})
} catch (error: any) { } catch (error: any) {
appLogger.error(`Failed to get selectable character hair: ${error instanceof Error ? error.message : String(error)}`) appLogger.error(`Failed to get selectable character hair: ${error instanceof Error ? error.message : String(error)}`)
return null return null
@ -38,12 +36,7 @@ class CharacterHairRepository extends BaseRepository {
async getById(id: number) { async getById(id: number) {
try { try {
const repository = this.em.getRepository(CharacterHair) const repository = this.em.getRepository(CharacterHair)
return await repository.findOne( return await repository.findOne({ id }, { populate: ['*'] })
{ id },
{
populate: ['sprite.spriteActions']
}
)
} catch (error: any) { } catch (error: any) {
appLogger.error(`Failed to get character hair by ID: ${error instanceof Error ? error.message : String(error)}`) appLogger.error(`Failed to get character hair by ID: ${error instanceof Error ? error.message : String(error)}`)
return null return null

View File

@ -6,9 +6,7 @@ class CharacterRepository extends BaseRepository {
async getByUserId(userId: number): Promise<Character[]> { async getByUserId(userId: number): Promise<Character[]> {
try { try {
const repository = this.em.getRepository(Character) const repository = this.em.getRepository(Character)
return await repository.find({ return await repository.find({ user: userId }, { populate: ['*'] })
user: userId
})
} catch (error: any) { } catch (error: any) {
appLogger.error(`Failed to get character by user ID: ${error instanceof Error ? error.message : String(error)}`) appLogger.error(`Failed to get character by user ID: ${error instanceof Error ? error.message : String(error)}`)
return [] return []
@ -18,10 +16,7 @@ class CharacterRepository extends BaseRepository {
async getByUserAndId(userId: number, characterId: number): Promise<Character | null> { async getByUserAndId(userId: number, characterId: number): Promise<Character | null> {
try { try {
const repository = this.em.getRepository(Character) const repository = this.em.getRepository(Character)
return await repository.findOne({ return await repository.findOne({ user: userId, id: characterId }, { populate: ['*'] })
user: userId,
id: characterId
})
} catch (error: any) { } catch (error: any) {
appLogger.error(`Failed to get character by user ID and character ID: ${error instanceof Error ? error.message : String(error)}`) appLogger.error(`Failed to get character by user ID and character ID: ${error instanceof Error ? error.message : String(error)}`)
return null return null
@ -31,7 +26,7 @@ class CharacterRepository extends BaseRepository {
async getById(id: number): Promise<Character | null> { async getById(id: number): Promise<Character | null> {
try { try {
const repository = this.em.getRepository(Character) const repository = this.em.getRepository(Character)
return await repository.findOne({ id }) return await repository.findOne({ id }, { populate: ['*'] })
} catch (error: any) { } catch (error: any) {
appLogger.error(`Failed to get character by ID: ${error instanceof Error ? error.message : String(error)}`) appLogger.error(`Failed to get character by ID: ${error instanceof Error ? error.message : String(error)}`)
return null return null
@ -41,7 +36,7 @@ class CharacterRepository extends BaseRepository {
async getByName(name: string): Promise<Character | null> { async getByName(name: string): Promise<Character | null> {
try { try {
const repository = this.em.getRepository(Character) const repository = this.em.getRepository(Character)
return await repository.findOne({ name }) return await repository.findOne({ name }, { populate: ['*'] })
} catch (error: any) { } catch (error: any) {
appLogger.error(`Failed to get character by name: ${error instanceof Error ? error.message : String(error)}`) appLogger.error(`Failed to get character by name: ${error instanceof Error ? error.message : String(error)}`)
return null return null

View File

@ -6,7 +6,7 @@ class CharacterTypeRepository extends BaseRepository {
async getFirst() { async getFirst() {
try { try {
const repository = this.em.getRepository(CharacterType) const repository = this.em.getRepository(CharacterType)
return await repository.findOne({ id: { $exists: true } }) return await repository.findOne({ id: { $exists: true } }, { populate: ['*'] })
} catch (error: any) { } catch (error: any) {
appLogger.error(`Failed to get first character type: ${error instanceof Error ? error.message : String(error)}`) appLogger.error(`Failed to get first character type: ${error instanceof Error ? error.message : String(error)}`)
return null return null
@ -16,7 +16,7 @@ class CharacterTypeRepository extends BaseRepository {
async getAll() { async getAll() {
try { try {
const repository = this.em.getRepository(CharacterType) const repository = this.em.getRepository(CharacterType)
return await repository.findAll() return await repository.findAll({ populate: ['*'] })
} catch (error: any) { } catch (error: any) {
appLogger.error(`Failed to get all character types: ${error instanceof Error ? error.message : String(error)}`) appLogger.error(`Failed to get all character types: ${error instanceof Error ? error.message : String(error)}`)
return null return null
@ -26,7 +26,7 @@ class CharacterTypeRepository extends BaseRepository {
async getById(id: number) { async getById(id: number) {
try { try {
const repository = this.em.getRepository(CharacterType) const repository = this.em.getRepository(CharacterType)
return await repository.findOne({ id }) return await repository.findOne({ id }, { populate: ['*'] })
} catch (error: any) { } catch (error: any) {
appLogger.error(`Failed to get character type by ID: ${error instanceof Error ? error.message : String(error)}`) appLogger.error(`Failed to get character type by ID: ${error instanceof Error ? error.message : String(error)}`)
return null return null

View File

@ -6,9 +6,12 @@ class ChatRepository extends BaseRepository {
async getById(id: number): Promise<Chat[]> { async getById(id: number): Promise<Chat[]> {
try { try {
const repository = this.em.getRepository(Chat) const repository = this.em.getRepository(Chat)
return await repository.find({ return await repository.find(
{
id id
}) },
{ populate: ['*'] }
)
} catch (error: any) { } catch (error: any) {
appLogger.error(`Failed to get chat by ID: ${error instanceof Error ? error.message : String(error)}`) appLogger.error(`Failed to get chat by ID: ${error instanceof Error ? error.message : String(error)}`)
return [] return []
@ -18,7 +21,7 @@ class ChatRepository extends BaseRepository {
async getAll(): Promise<Chat[]> { async getAll(): Promise<Chat[]> {
try { try {
const repository = this.em.getRepository(Chat) const repository = this.em.getRepository(Chat)
return await repository.findAll() return await repository.findAll({ populate: ['*'] })
} catch (error: any) { } catch (error: any) {
appLogger.error(`Failed to get all chats: ${error instanceof Error ? error.message : String(error)}`) appLogger.error(`Failed to get all chats: ${error instanceof Error ? error.message : String(error)}`)
return [] return []
@ -28,9 +31,7 @@ class ChatRepository extends BaseRepository {
async getByCharacterId(characterId: number): Promise<Chat[]> { async getByCharacterId(characterId: number): Promise<Chat[]> {
try { try {
const repository = this.em.getRepository(Chat) const repository = this.em.getRepository(Chat)
return await repository.find({ return await repository.find({ character: characterId }, { populate: ['*'] })
character: characterId
})
} catch (error: any) { } catch (error: any) {
appLogger.error(`Failed to get chats by character ID: ${error instanceof Error ? error.message : String(error)}`) appLogger.error(`Failed to get chats by character ID: ${error instanceof Error ? error.message : String(error)}`)
return [] return []
@ -40,9 +41,7 @@ class ChatRepository extends BaseRepository {
async getByZoneId(zoneId: number): Promise<Chat[]> { async getByZoneId(zoneId: number): Promise<Chat[]> {
try { try {
const repository = this.em.getRepository(Chat) const repository = this.em.getRepository(Chat)
return await repository.find({ return await repository.find({ zone: zoneId }, { populate: ['*'] })
zone: zoneId
})
} catch (error: any) { } catch (error: any) {
appLogger.error(`Failed to get chats by zone ID: ${error instanceof Error ? error.message : String(error)}`) appLogger.error(`Failed to get chats by zone ID: ${error instanceof Error ? error.message : String(error)}`)
return [] return []

View File

@ -6,7 +6,7 @@ class SpriteRepository extends BaseRepository {
async getById(id: FilterValue<`${string}-${string}-${string}-${string}-${string}`>) { async getById(id: FilterValue<`${string}-${string}-${string}-${string}-${string}`>) {
try { try {
const repository = this.em.getRepository(Sprite) const repository = this.em.getRepository(Sprite)
return await repository.findOne({ id }) return await repository.findOne({ id }, { populate: ['*'] })
} catch (error: any) { } catch (error: any) {
return null return null
} }
@ -15,7 +15,7 @@ class SpriteRepository extends BaseRepository {
async getAll(): Promise<any> { async getAll(): Promise<any> {
try { try {
const repository = this.em.getRepository(Sprite) const repository = this.em.getRepository(Sprite)
return await repository.findAll() return await repository.findAll({ populate: ['*'] })
} catch (error: any) { } catch (error: any) {
return null return null
} }

View File

@ -6,7 +6,7 @@ class UserRepository extends BaseRepository {
async getById(id: number) { async getById(id: number) {
try { try {
const repository = this.em.getRepository(User) const repository = this.em.getRepository(User)
return await repository.findOne({ id }) return await repository.findOne({ id }, { populate: ['*'] })
} catch (error: any) { } catch (error: any) {
appLogger.error(`Failed to get user by ID: ${error instanceof Error ? error.message : String(error)}`) appLogger.error(`Failed to get user by ID: ${error instanceof Error ? error.message : String(error)}`)
return null return null
@ -16,7 +16,7 @@ class UserRepository extends BaseRepository {
async getByUsername(username: string) { async getByUsername(username: string) {
try { try {
const repository = this.em.getRepository(User) const repository = this.em.getRepository(User)
return await repository.findOne({ username }) return await repository.findOne({ username }, { populate: ['*'] })
} catch (error: any) { } catch (error: any) {
appLogger.error(`Failed to get user by username: ${error instanceof Error ? error.message : String(error)}`) appLogger.error(`Failed to get user by username: ${error instanceof Error ? error.message : String(error)}`)
return null return null
@ -26,7 +26,7 @@ class UserRepository extends BaseRepository {
async getByEmail(email: string) { async getByEmail(email: string) {
try { try {
const repository = this.em.getRepository(User) const repository = this.em.getRepository(User)
return await repository.findOne({ email }) return await repository.findOne({ email }, { populate: ['*'] })
} catch (error: any) { } catch (error: any) {
appLogger.error(`Failed to get user by email: ${error instanceof Error ? error.message : String(error)}`) appLogger.error(`Failed to get user by email: ${error instanceof Error ? error.message : String(error)}`)
return null return null

View File

@ -8,7 +8,7 @@ class ZoneRepository extends BaseRepository {
async getFirst(): Promise<Zone | null> { async getFirst(): Promise<Zone | null> {
try { try {
const repository = this.em.getRepository(Zone) const repository = this.em.getRepository(Zone)
return await repository.findOne({ id: { $exists: true } }) return await repository.findOne({ id: { $exists: true } }, { populate: ['*'] })
} catch (error: any) { } catch (error: any) {
appLogger.error(`Failed to get first zone: ${error instanceof Error ? error.message : String(error)}`) appLogger.error(`Failed to get first zone: ${error instanceof Error ? error.message : String(error)}`)
return null return null
@ -18,7 +18,7 @@ class ZoneRepository extends BaseRepository {
async getAll(): Promise<Zone[]> { async getAll(): Promise<Zone[]> {
try { try {
const repository = this.em.getRepository(Zone) const repository = this.em.getRepository(Zone)
return await repository.findAll() return await repository.findAll({ populate: ['*'] })
} catch (error: any) { } catch (error: any) {
appLogger.error(`Failed to get all zone: ${error.message}`) appLogger.error(`Failed to get all zone: ${error.message}`)
return [] return []
@ -28,7 +28,7 @@ class ZoneRepository extends BaseRepository {
async getById(id: number) { async getById(id: number) {
try { try {
const repository = this.em.getRepository(Zone) const repository = this.em.getRepository(Zone)
return await repository.findOne({ id }) return await repository.findOne({ id }, { populate: ['*'] })
} catch (error: any) { } catch (error: any) {
appLogger.error(`Failed to get zone by id: ${error.message}`) appLogger.error(`Failed to get zone by id: ${error.message}`)
return null return null
@ -38,9 +38,7 @@ class ZoneRepository extends BaseRepository {
async getEventTiles(id: number): Promise<ZoneEventTile[]> { async getEventTiles(id: number): Promise<ZoneEventTile[]> {
try { try {
const repository = this.em.getRepository(ZoneEventTile) const repository = this.em.getRepository(ZoneEventTile)
return await repository.find({ return await repository.find({ zone: id }, { populate: ['*'] })
zone: id
})
} catch (error: any) { } catch (error: any) {
appLogger.error(`Failed to get zone event tiles: ${error.message}`) appLogger.error(`Failed to get zone event tiles: ${error.message}`)
return [] return []
@ -50,11 +48,14 @@ class ZoneRepository extends BaseRepository {
async getFirstEventTile(zoneId: number, positionX: number, positionY: number): Promise<ZoneEventTile | null> { async getFirstEventTile(zoneId: number, positionX: number, positionY: number): Promise<ZoneEventTile | null> {
try { try {
const repository = this.em.getRepository(ZoneEventTile) const repository = this.em.getRepository(ZoneEventTile)
return await repository.findOne({ return await repository.findOne(
{
zone: zoneId, zone: zoneId,
positionX: positionX, positionX: positionX,
positionY: positionY positionY: positionY
}) },
{ populate: ['*'] }
)
} catch (error: any) { } catch (error: any) {
appLogger.error(`Failed to get zone event tile: ${error.message}`) appLogger.error(`Failed to get zone event tile: ${error.message}`)
return null return null
@ -64,9 +65,7 @@ class ZoneRepository extends BaseRepository {
async getZoneObjects(id: number): Promise<ZoneObject[]> { async getZoneObjects(id: number): Promise<ZoneObject[]> {
try { try {
const repository = this.em.getRepository(ZoneObject) const repository = this.em.getRepository(ZoneObject)
return await repository.find({ return await repository.find({ zone: id }, { populate: ['*'] })
zone: id
})
} catch (error: any) { } catch (error: any) {
appLogger.error(`Failed to get zone objects: ${error.message}`) appLogger.error(`Failed to get zone objects: ${error.message}`)
return [] return []

View File

@ -74,7 +74,7 @@ export class Server {
await UserManager.boot() await UserManager.boot()
// Load date manager // Load date manager
await DateManager.boot(this.io) // await DateManager.boot(this.io)
// Load weather manager // Load weather manager
await WeatherManager.boot(this.io) await WeatherManager.boot(this.io)

View File

@ -17,10 +17,7 @@ class ChatService {
const newChat = new Chat() const newChat = new Chat()
newChat newChat.setCharacter(character).setZone(zone).setMessage(message)
.setCharacter(character)
.setZone(zone)
.setMessage(message)
await newChat.save() await newChat.save()

View File

@ -48,10 +48,7 @@ class UserService {
const hashedPassword = await bcrypt.hash(password, 10) const hashedPassword = await bcrypt.hash(password, 10)
const newUser = new User() const newUser = new User()
newUser newUser.setUsername(username).setEmail(email).setPassword(hashedPassword)
.setUsername(username)
.setEmail(email)
.setPassword(hashedPassword)
await newUser.save() await newUser.save()
return newUser return newUser
@ -82,9 +79,7 @@ class UserService {
// Create new token using MikroORM // Create new token using MikroORM
const passwordResetToken = new PasswordResetToken() const passwordResetToken = new PasswordResetToken()
passwordResetToken passwordResetToken.setUser(user).setToken(token)
.setUser(user)
.setToken(token)
await passwordResetToken.save() await passwordResetToken.save()
const transporter = NodeMailer.createTransport({ const transporter = NodeMailer.createTransport({

View File

@ -21,11 +21,7 @@ export class ZoneEventTileService {
character.isMoving = false character.isMoving = false
// Update local character object // Update local character object
character character.setZone(teleport.toZone).setRotation(teleport.toRotation).setPositionX(teleport.toPositionX).setPositionY(teleport.toPositionY)
.setZone(teleport.toZone)
.setRotation(teleport.toRotation)
.setPositionX(teleport.toPositionX)
.setPositionY(teleport.toPositionY)
await character.save() await character.save()

View File

@ -16,7 +16,7 @@ export default class CharacterListEvent {
private async handleCharacterList(data: any): Promise<void> { private async handleCharacterList(data: any): Promise<void> {
try { try {
const characters: Character[] = (await CharacterRepository.getByUserId(this.socket.userId!)) as Character[] const characters: Character[] = await CharacterRepository.getByUserId(this.socket.userId!)
this.socket.emit('character:list', characters) this.socket.emit('character:list', characters)
} catch (error: any) { } catch (error: any) {
gameLogger.error('character:list error', error.message) gameLogger.error('character:list error', error.message)

View File

@ -1,12 +1,12 @@
import { Server } from 'socket.io' import { Server } from 'socket.io'
import { TSocket } from '#application/types' import { TSocket } from '#application/types'
import ZoneRepository from '#repositories/zoneRepository' import ZoneRepository from '#repositories/zoneRepository'
import { Zone } from '@prisma/client'
import { gameLogger } from '#application/logger' import { gameLogger } from '#application/logger'
import CharacterRepository from '#repositories/characterRepository' import CharacterRepository from '#repositories/characterRepository'
import ZoneManager from '#managers/zoneManager' import ZoneManager from '#managers/zoneManager'
import zoneCharacter from '#models/zoneCharacter' import zoneCharacter from '#models/zoneCharacter'
import zoneManager from '#managers/zoneManager' import zoneManager from '#managers/zoneManager'
import { Zone } from '#entities/zone'
interface IResponse { interface IResponse {
zone: Zone zone: Zone
@ -39,7 +39,7 @@ export default class CharacterJoinEvent {
/** /**
* @TODO: If zone is not found, spawn back to the start * @TODO: If zone is not found, spawn back to the start
*/ */
const zone = await ZoneRepository.getById(character.zoneId) const zone = await ZoneRepository.getById(character.zone!.id)
if (!zone) { if (!zone) {
gameLogger.error('zone:character:join error', 'Zone not found') gameLogger.error('zone:character:join error', 'Zone not found')
return return

View File

@ -36,7 +36,7 @@ export default class CharacterMove {
const path = await this.characterService.calculatePath(zoneCharacter.character, positionX, positionY) const path = await this.characterService.calculatePath(zoneCharacter.character, positionX, positionY)
if (!path) { if (!path) {
this.io.in(zoneCharacter.character.zoneId.toString()).emit('character:moveError', 'No valid path found') this.io.in(zoneCharacter.character.zone!.id.toString()).emit('character:moveError', 'No valid path found')
return return
} }
@ -58,7 +58,7 @@ export default class CharacterMove {
const [start, end] = [path[i], path[i + 1]] const [start, end] = [path[i], path[i + 1]]
character.rotation = Rotation.calculate(start.x, start.y, end.x, end.y) character.rotation = Rotation.calculate(start.x, start.y, end.x, end.y)
const zoneEventTile = await zoneEventTileRepository.getEventTileByZoneIdAndPosition(character.zoneId, Math.floor(end.x), Math.floor(end.y)) const zoneEventTile = await zoneEventTileRepository.getEventTileByZoneIdAndPosition(character.zone!.id, Math.floor(end.x), Math.floor(end.y))
if (zoneEventTile?.type === 'BLOCK') break if (zoneEventTile?.type === 'BLOCK') break
if (zoneEventTile?.type === 'TELEPORT' && zoneEventTile.teleport) { if (zoneEventTile?.type === 'TELEPORT' && zoneEventTile.teleport) {
@ -67,7 +67,7 @@ export default class CharacterMove {
} }
this.characterService.updatePosition(character, end) this.characterService.updatePosition(character, end)
this.io.in(character.zoneId.toString()).emit('character:move', zoneCharacter) this.io.in(character.zone!.id.toString()).emit('character:move', zoneCharacter)
await this.characterService.applyMovementDelay() await this.characterService.applyMovementDelay()
} }
@ -91,6 +91,6 @@ export default class CharacterMove {
private finalizeMovement(zoneCharacter: ZoneCharacter): void { private finalizeMovement(zoneCharacter: ZoneCharacter): void {
zoneCharacter.isMoving = false zoneCharacter.isMoving = false
this.io.in(zoneCharacter.character.zoneId.toString()).emit('character:move', zoneCharacter) this.io.in(zoneCharacter.character.zone!.id.toString()).emit('character:move', zoneCharacter)
} }
} }