From 117216acd3a5a3083cb2ee33c8f6ab87fe2df6ab Mon Sep 17 00:00:00 2001
From: Dennis Postma <dennis@directonline.io>
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<void> {
+    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 <zoneId>' })
+        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