From 117216acd3a5a3083cb2ee33c8f6ab87fe2df6ab Mon Sep 17 00:00:00 2001 From: Dennis Postma Date: Wed, 18 Sep 2024 16:25:57 +0200 Subject: [PATCH] Added hacked together TP command for testing purposes (:teleport (zoneId)) --- package-lock.json | 12 +-- src/events/chat/gameMaster/teleportCommand.ts | 92 +++++++++++++++++++ 2 files changed, 98 insertions(+), 6 deletions(-) create mode 100644 src/events/chat/gameMaster/teleportCommand.ts diff --git a/package-lock.json b/package-lock.json index d324d38..4779227 100644 --- a/package-lock.json +++ b/package-lock.json @@ -606,9 +606,9 @@ "license": "MIT" }, "node_modules/@types/jsonwebtoken": { - "version": "9.0.6", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.6.tgz", - "integrity": "sha512-/5hndP5dCjloafCXns6SZyESp3Ldq7YjH3zwzwczYnjxIT0Fqzk5ROSYVGfFyczIue7IUEj8hkvLbPoLQ18vQw==", + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.7.tgz", + "integrity": "sha512-ugo316mmTYBl2g81zDFnZ7cfxlut3o+/EQdaP7J8QN2kY6lJ22hmQYCK5EHcJHbrW+dkCGSCPgbG8JtYj6qSrg==", "dev": true, "license": "MIT", "dependencies": { @@ -1789,9 +1789,9 @@ } }, "node_modules/nodemon": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.4.tgz", - "integrity": "sha512-wjPBbFhtpJwmIeY2yP7QF+UKzPfltVGtfce1g/bB15/8vCGZj8uxD62b/b9M9/WVgme0NZudpownKN+c0plXlQ==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.5.tgz", + "integrity": "sha512-V5UtfYc7hjFD4SI3EzD5TR8ChAHEZ+Ns7Z5fBk8fAbTVAj+q3G+w7sHJrHxXBkVn6ApLVTljau8wfHwqmGUjMw==", "dev": true, "license": "MIT", "dependencies": { diff --git a/src/events/chat/gameMaster/teleportCommand.ts b/src/events/chat/gameMaster/teleportCommand.ts new file mode 100644 index 0000000..23b67d8 --- /dev/null +++ b/src/events/chat/gameMaster/teleportCommand.ts @@ -0,0 +1,92 @@ +import { Server } from 'socket.io' +import { ExtendedCharacter, TSocket } from '../../../utilities/types' +import { getArgs, isCommand } from '../../../utilities/chat' +import CharacterRepository from '../../../repositories/characterRepository' +import ZoneRepository from '../../../repositories/zoneRepository' +import CharacterManager from '../../../managers/characterManager' +import logger from '../../../utilities/logger' +import prisma from '../../../utilities/prisma' + +type TypePayload = { + message: string +} + +export default class TeleportCommandEvent { + constructor( + private readonly io: Server, + private readonly socket: TSocket + ) {} + + public listen(): void { + this.socket.on('chat:send_message', this.handleTeleportCommand.bind(this)) + } + + private async handleTeleportCommand(data: TypePayload, callback: (response: boolean) => void): Promise { + try { + if (!isCommand(data.message, 'teleport')) return + + const args = getArgs('teleport', data.message) + + if (!args || args.length !== 1) { + this.socket.emit('notification', { title: 'Teleport Error', message: 'Usage: /teleport ' }) + return + } + + const zoneId = parseInt(args[0], 10) + if (isNaN(zoneId)) { + this.socket.emit('notification', { title: 'Teleport Error', message: 'Invalid zone ID' }) + return + } + + const character = await CharacterRepository.getByUserAndId(this.socket.user?.id as number, this.socket.character?.id as number) + if (!character) { + this.socket.emit('notification', { title: 'Teleport Error', message: 'Character not found' }) + return + } + + const zone = await ZoneRepository.getById(zoneId) + if (!zone) { + this.socket.emit('notification', { title: 'Teleport Error', message: 'Zone not found' }) + return + } + + this.io.to(character.zoneId.toString()).emit('zone:character:leave', character.id) + this.io.to(zone.id.toString()).emit('zone:character:join', character) + await CharacterManager.removeCharacter(character as ExtendedCharacter) + + this.socket.leave(character.zoneId.toString()) + this.socket.join(zone.id.toString()) + + // Add character to new zone + character.zoneId = zone.id + character.positionX = 0 + character.positionY = 0 + + // Update character in database + await prisma.character.update({ + where: { id: character.id }, + data: { + zoneId: character.zoneId, + positionX: 0, + positionY: 0 + } + }) + + // Update character in CharacterManager + CharacterManager.initCharacter(character as ExtendedCharacter) + + this.socket.emit('zone:teleport', { + zone, + characters: CharacterManager.getCharactersInZone(zone) + }) + + this.socket.emit('notification', { title: 'Server message', message: `You have been teleported to ${zone.name}` }) + logger.info('teleport', `Character ${character.id} teleported to zone ${zone.id}`) + + callback(true) + } catch (error: any) { + logger.error(`Error in teleport command: ${error.message}`) + this.socket.emit('notification', { title: 'Teleport Error', message: 'An error occurred while teleporting' }) + } + } +} \ No newline at end of file