diff --git a/src/events/character/connect.ts b/src/events/character/connect.ts index 837444e..12203b1 100644 --- a/src/events/character/connect.ts +++ b/src/events/character/connect.ts @@ -58,10 +58,10 @@ export default class CharacterConnectEvent extends BaseEvent { callback({ character }) // wait 300 ms, @TODO: Find a better way to do this - await new Promise(resolve => setTimeout(resolve, 100)) + await new Promise((resolve) => setTimeout(resolve, 100)) await TeleportService.teleportCharacter(character.id, { - targetZoneId: character.zone!.id, + targetZoneId: character.zone.id, targetX: character.positionX, targetY: character.positionY, rotation: character.rotation, diff --git a/src/events/character/create.ts b/src/events/character/create.ts index b955d14..e613477 100644 --- a/src/events/character/create.ts +++ b/src/events/character/create.ts @@ -40,11 +40,7 @@ export default class CharacterCreateEvent extends BaseEvent { const zone = await ZoneRepository.getFirst() const newCharacter = new Character() - await newCharacter - .setName(data.name) - .setUser(user) - .setZone(zone!) - .save() + 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).' }) diff --git a/src/events/chat/gameMaster/teleportCommand.ts b/src/events/chat/gameMaster/teleportCommand.ts index 82039f8..ed055a5 100644 --- a/src/events/chat/gameMaster/teleportCommand.ts +++ b/src/events/chat/gameMaster/teleportCommand.ts @@ -96,4 +96,4 @@ export default class TeleportCommandEvent extends BaseEvent { }) } } -} \ No newline at end of file +} diff --git a/src/events/chat/message.ts b/src/events/chat/message.ts index 9ec407a..5f4f8b1 100644 --- a/src/events/chat/message.ts +++ b/src/events/chat/message.ts @@ -26,7 +26,7 @@ export default class ChatMessageEvent extends BaseEvent { const character = zoneCharacter.character - const zone = await ZoneRepository.getById(character.zone?.id!) + const zone = await ZoneRepository.getById(character.zone.id) if (!zone) { this.logger.error('chat:message error', 'Zone not found') return callback(false) diff --git a/src/events/disconnect.ts b/src/events/disconnect.ts index 694ca8f..8bb7e9c 100644 --- a/src/events/disconnect.ts +++ b/src/events/disconnect.ts @@ -27,4 +27,4 @@ export default class DisconnectEvent extends BaseEvent { this.logger.error('disconnect error: ' + error.message) } } -} \ No newline at end of file +} diff --git a/src/events/zone/characterMove.ts b/src/events/zone/characterMove.ts index acc4c02..7d23c89 100644 --- a/src/events/zone/characterMove.ts +++ b/src/events/zone/characterMove.ts @@ -29,7 +29,7 @@ export default class CharacterMove extends BaseEvent { const path = await this.characterService.calculatePath(zoneCharacter.character, positionX, positionY) if (!path) { - this.io.in(zoneCharacter.character.zone!.id.toString()).emit('zone:character:moveError', 'No valid path found') + this.io.in(zoneCharacter.character.zone.id.toString()).emit('zone:character:moveError', 'No valid path found') return } @@ -50,7 +50,7 @@ export default class CharacterMove extends BaseEvent { const [start, end] = [path[i], path[i + 1]] character.rotation = CharacterService.calculateRotation(start.x, start.y, end.x, end.y) - const zoneEventTile = await zoneEventTileRepository.getEventTileByZoneIdAndPosition(character.zone!.id, 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 === 'TELEPORT' && zoneEventTile.teleport) { @@ -63,7 +63,7 @@ export default class CharacterMove extends BaseEvent { character.positionY = end.y // Then emit with the same properties - this.io.in(character.zone!.id.toString()).emit('zone:character:move', { + this.io.in(character.zone.id.toString()).emit('zone:character:move', { id: character.id, positionX: character.positionX, positionY: character.positionY, @@ -93,7 +93,7 @@ export default class CharacterMove extends BaseEvent { private finalizeMovement(zoneCharacter: ZoneCharacter): void { zoneCharacter.isMoving = false - this.io.in(zoneCharacter.character.zone!.id.toString()).emit('zone:character:move', { + this.io.in(zoneCharacter.character.zone.id.toString()).emit('zone:character:move', { id: zoneCharacter.character.id, positionX: zoneCharacter.character.positionX, positionY: zoneCharacter.character.positionY, diff --git a/src/managers/socketManager.ts b/src/managers/socketManager.ts index dfbaa66..bb8842a 100644 --- a/src/managers/socketManager.ts +++ b/src/managers/socketManager.ts @@ -1,13 +1,14 @@ -import { Server as SocketServer } from 'socket.io' import fs from 'fs' -import { pathToFileURL } from 'url' import { Server as HTTPServer } from 'http' -import { Application } from 'express' +import { pathToFileURL } from 'url' +import { Application } from 'express' +import { Server as SocketServer } from 'socket.io' + +import config from '#application/config' import Logger, { LoggerType } from '#application/logger' import { getAppPath } from '#application/storage' import { TSocket } from '#application/types' -import config from '#application/config' import { Authentication } from '#middleware/authentication' class SocketManager { @@ -105,18 +106,20 @@ class SocketManager { * Emit event to specific room */ public emitToRoom(room: string, event: string, ...args: any[]): void { - this.getIO().to(room).emit(event, ...args) + this.getIO() + .to(room) + .emit(event, ...args) } public getSocketByUserId(userId: number): TSocket | undefined { - const sockets = Array.from(this.getIO().sockets.sockets.values()); - return sockets.find((socket: TSocket) => socket.userId === userId); + const sockets = Array.from(this.getIO().sockets.sockets.values()) + return sockets.find((socket: TSocket) => socket.userId === userId) } public getSocketByCharacterId(characterId: number): TSocket | undefined { - const sockets = Array.from(this.getIO().sockets.sockets.values()); - return sockets.find((socket: TSocket) => socket.characterId === characterId); + const sockets = Array.from(this.getIO().sockets.sockets.values()) + return sockets.find((socket: TSocket) => socket.characterId === characterId) } } -export default new SocketManager() \ No newline at end of file +export default new SocketManager() diff --git a/src/models/zoneCharacter.ts b/src/models/zoneCharacter.ts index bee68c2..417822a 100644 --- a/src/models/zoneCharacter.ts +++ b/src/models/zoneCharacter.ts @@ -1,7 +1,10 @@ +import { Server } from 'socket.io' + +import { TSocket } from '#application/types' import { Character } from '#entities/character' -import TeleportService from '#services/teleportService' -import ZoneManager from '#managers/zoneManager' import SocketManager from '#managers/socketManager' +import ZoneManager from '#managers/zoneManager' +import TeleportService from '#services/teleportService' class ZoneCharacter { public readonly character: Character @@ -13,12 +16,7 @@ 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() + 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 { @@ -29,7 +27,7 @@ class ZoneCharacter { }) } - public async disconnect(socket: Socket, io: Server): Promise { + public async disconnect(socket: TSocket, io: Server): Promise { try { // Stop any movement and save final position this.isMoving = false @@ -53,4 +51,4 @@ class ZoneCharacter { } } -export default ZoneCharacter \ No newline at end of file +export default ZoneCharacter diff --git a/src/server.ts b/src/server.ts index 6f3b4c4..2d62f0e 100644 --- a/src/server.ts +++ b/src/server.ts @@ -1,6 +1,7 @@ import { createServer as httpServer, Server as HTTPServer } from 'http' -import express, { Application } from 'express' + import cors from 'cors' +import express, { Application } from 'express' import config from '#application/config' import Database from '#application/database' @@ -47,7 +48,6 @@ export class Server { ZoneManager.boot(), ConsoleManager.boot() ]) - } catch (error: any) { this.logger.error(`Server failed to start: ${error.message}`) process.exit(1) @@ -57,4 +57,4 @@ export class Server { // Start the server const server = new Server() -server.start().catch(console.error) \ No newline at end of file +server.start().catch(console.error) diff --git a/src/services/characterService.ts b/src/services/characterService.ts index e4d2633..5ec478a 100644 --- a/src/services/characterService.ts +++ b/src/services/characterService.ts @@ -2,10 +2,10 @@ import { BaseService } from '#application/base/baseService' import config from '#application/config' import { Character } from '#entities/character' import { Zone } from '#entities/zone' +import SocketManager from '#managers/socketManager' 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 } @@ -24,7 +24,7 @@ class CharacterService extends BaseService { ] public async calculatePath(character: Character, targetX: number, targetY: number): Promise { - const zone = ZoneManager.getZoneById(character.zone!.id) + const zone = ZoneManager.getZoneById(character.zone.id) const grid = await zone?.getGrid() if (!grid?.length) { diff --git a/src/services/teleportService.ts b/src/services/teleportService.ts index 97d4bea..c4e3f1d 100644 --- a/src/services/teleportService.ts +++ b/src/services/teleportService.ts @@ -1,7 +1,7 @@ -import { Character } from '#entities/character' -import ZoneManager from '#managers/zoneManager' -import SocketManager from '#managers/socketManager' import Logger, { LoggerType } from '#application/logger' +import { Character } from '#entities/character' +import SocketManager from '#managers/socketManager' +import ZoneManager from '#managers/zoneManager' import ZoneCharacter from '#models/zoneCharacter' interface TeleportOptions { @@ -35,10 +35,11 @@ class TeleportService { const existingCharacter = !isInitialJoin && ZoneManager.getCharacterById(characterId) const zoneCharacter = isInitialJoin ? new ZoneCharacter(character!) - : existingCharacter || (() => { - this.logger.error(`Teleport failed - Character ${characterId} not found in ZoneManager`) - return null - })() + : existingCharacter || + (() => { + this.logger.error(`Teleport failed - Character ${characterId} not found in ZoneManager`) + return null + })() if (!zoneCharacter) return false @@ -54,12 +55,7 @@ class TeleportService { } // Update character position and zone - await zoneCharacter.character - .setPositionX(targetX) - .setPositionY(targetY) - .setRotation(rotation) - .setZone(targetZone.getZone()) - .update() + await zoneCharacter.character.setPositionX(targetX).setPositionY(targetY).setRotation(rotation).setZone(targetZone.getZone()).update() // Join new zone socket.join(targetZoneId.toString()) @@ -80,4 +76,4 @@ class TeleportService { } } -export default new TeleportService() \ No newline at end of file +export default new TeleportService() diff --git a/src/services/zoneEventTileService.ts b/src/services/zoneEventTileService.ts index fa548af..7edf399 100644 --- a/src/services/zoneEventTileService.ts +++ b/src/services/zoneEventTileService.ts @@ -7,7 +7,7 @@ import ZoneManager from '#managers/zoneManager' class ZoneEventTileService extends BaseService { public async handleTeleport(io: Server, socket: TSocket, character: ExtendedCharacter, teleport: ZoneEventTileTeleport): Promise { - if (teleport.toZone.id === character.zone!.id) return + if (teleport.toZone.id === character.zone.id) return const loadedZone = ZoneManager.getZoneById(teleport.toZone.id) if (!loadedZone) { @@ -17,7 +17,7 @@ class ZoneEventTileService extends BaseService { const zone = loadedZone.getZone() - const oldZoneId = character.zone!.id + const oldZoneId = character.zone.id const newZoneId = teleport.toZone.id character.isMoving = false