From a4df323d7bb6e64b84be63b1906779e7260235d9 Mon Sep 17 00:00:00 2001
From: Dennis Postma <dennis@directonline.io>
Date: Fri, 31 May 2024 01:10:21 +0200
Subject: [PATCH] npm update, removed player store and merged it with socket
 store, worked on character creation & selection (partially works)

---
 env.d.ts                              | 44 ++++++++++++++++++++++++
 package-lock.json                     | 48 +++++++++++++--------------
 src/components/screens/Characters.vue | 16 +++++++--
 src/stores/player.ts                  | 14 --------
 src/stores/socket.ts                  | 20 +++++++++--
 src/types/TCharacter.ts               |  9 -----
 src/types/TUser.ts                    |  9 -----
 7 files changed, 100 insertions(+), 60 deletions(-)
 delete mode 100644 src/stores/player.ts
 delete mode 100644 src/types/TCharacter.ts
 delete mode 100644 src/types/TUser.ts

diff --git a/env.d.ts b/env.d.ts
index 11f02fe..773d2bb 100644
--- a/env.d.ts
+++ b/env.d.ts
@@ -1 +1,45 @@
 /// <reference types="vite/client" />
+export type User = {
+  id: number;
+  username: string;
+  password: string;
+  characters: Character[];
+};
+
+export type Character = {
+  id: number;
+  userId: number;
+  user: User;
+  name: string;
+  hitpoints: number;
+  mana: number;
+  level: number;
+  experience: number;
+  role: string;
+  position_x: number;
+  position_y: number;
+  rotation: number;
+  zoneId: number;
+  zone: Zone;
+  chats: Chat[];
+};
+
+export type Zone = {
+  id: number;
+  name: string;
+  width: number;
+  height: number;
+  tiles: Record<string, any>;
+  characters: Character[];
+  chats: Chat[];
+};
+
+export type Chat = {
+  id: number;
+  characterId: number;
+  character: Character;
+  zoneId: number;
+  zone: Zone;
+  message: string;
+  createdAt: Date;
+};
diff --git a/package-lock.json b/package-lock.json
index a17990f..da8b4aa 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1746,9 +1746,9 @@
       "license": "MIT"
     },
     "node_modules/@types/jsdom": {
-      "version": "21.1.6",
-      "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-21.1.6.tgz",
-      "integrity": "sha512-/7kkMsC+/kMs7gAYmmBR9P0vGTnOoLhQhyhQJSlXGI5bzTHp6xdo0TtKWQAsz6pmSAeVqKSbqeyP6hytqr9FDw==",
+      "version": "21.1.7",
+      "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-21.1.7.tgz",
+      "integrity": "sha512-yOriVnggzrnQ3a9OKOCxaVuSug3w3/SbOj5i7VwXWZEyUNl3bLF9V3MfxGbZKuwqJOQyRfqXyROBB1CoZLFWzA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -1765,9 +1765,9 @@
       "license": "MIT"
     },
     "node_modules/@types/node": {
-      "version": "20.12.12",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.12.tgz",
-      "integrity": "sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==",
+      "version": "20.12.13",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.13.tgz",
+      "integrity": "sha512-gBGeanV41c1L171rR7wjbMiEpEI/l5XFQdLLfhr/REwpgDy/4U8y89+i8kRiLzDyZdOkXh+cRaTetUnCYutoXA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -2480,9 +2480,9 @@
       }
     },
     "node_modules/@vueuse/core/node_modules/vue-demi": {
-      "version": "0.14.7",
-      "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz",
-      "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==",
+      "version": "0.14.8",
+      "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.8.tgz",
+      "integrity": "sha512-Uuqnk9YE9SsWeReYqK2alDI5YzciATE0r2SkA6iMAtuXvNTMNACJLJEXNXaEy94ECuBe4Sk6RzRU80kjdbIo1Q==",
       "hasInstallScript": true,
       "license": "MIT",
       "bin": {
@@ -2572,9 +2572,9 @@
       }
     },
     "node_modules/@vueuse/integrations/node_modules/vue-demi": {
-      "version": "0.14.7",
-      "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz",
-      "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==",
+      "version": "0.14.8",
+      "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.8.tgz",
+      "integrity": "sha512-Uuqnk9YE9SsWeReYqK2alDI5YzciATE0r2SkA6iMAtuXvNTMNACJLJEXNXaEy94ECuBe4Sk6RzRU80kjdbIo1Q==",
       "hasInstallScript": true,
       "license": "MIT",
       "bin": {
@@ -2619,9 +2619,9 @@
       }
     },
     "node_modules/@vueuse/shared/node_modules/vue-demi": {
-      "version": "0.14.7",
-      "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz",
-      "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==",
+      "version": "0.14.8",
+      "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.8.tgz",
+      "integrity": "sha512-Uuqnk9YE9SsWeReYqK2alDI5YzciATE0r2SkA6iMAtuXvNTMNACJLJEXNXaEy94ECuBe4Sk6RzRU80kjdbIo1Q==",
       "hasInstallScript": true,
       "license": "MIT",
       "bin": {
@@ -3401,9 +3401,9 @@
       }
     },
     "node_modules/electron-to-chromium": {
-      "version": "1.4.783",
-      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.783.tgz",
-      "integrity": "sha512-bT0jEz/Xz1fahQpbZ1D7LgmPYZ3iHVY39NcWWro1+hA2IvjiPeaXtfSqrQ+nXjApMvQRE2ASt1itSLRrebHMRQ==",
+      "version": "1.4.787",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.787.tgz",
+      "integrity": "sha512-d0EFmtLPjctczO3LogReyM2pbBiiZbnsKnGF+cdZhsYzHm/A0GV7W94kqzLD8SN4O3f3iHlgLUChqghgyznvCQ==",
       "dev": true,
       "license": "ISC"
     },
@@ -5525,9 +5525,9 @@
       }
     },
     "node_modules/pinia/node_modules/vue-demi": {
-      "version": "0.14.7",
-      "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz",
-      "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==",
+      "version": "0.14.8",
+      "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.8.tgz",
+      "integrity": "sha512-Uuqnk9YE9SsWeReYqK2alDI5YzciATE0r2SkA6iMAtuXvNTMNACJLJEXNXaEy94ECuBe4Sk6RzRU80kjdbIo1Q==",
       "hasInstallScript": true,
       "license": "MIT",
       "bin": {
@@ -5956,9 +5956,9 @@
       "license": "MIT"
     },
     "node_modules/sass": {
-      "version": "1.77.2",
-      "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.2.tgz",
-      "integrity": "sha512-eb4GZt1C3avsX3heBNlrc7I09nyT00IUuo4eFhAbeXWU2fvA7oXI53SxODVAA+zgZCk9aunAZgO+losjR3fAwA==",
+      "version": "1.77.3",
+      "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.3.tgz",
+      "integrity": "sha512-WJHo+jmFp0dwRuymPmIovuxHaBntcCyja5hCB0yYY9wWrViEp4kF5Cdai98P72v6FzroPuABqu+ddLMbQWmwzA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
diff --git a/src/components/screens/Characters.vue b/src/components/screens/Characters.vue
index ad882b3..23c3a62 100644
--- a/src/components/screens/Characters.vue
+++ b/src/components/screens/Characters.vue
@@ -5,7 +5,7 @@
      <h1>Select your character</h1>
      <div id="list">
        <div v-for="character in characters" :key="character.id">
-          <input type="radio" :id="character.id" name="character" :value="character.id">
+          <input type="radio" :id="character.id" name="character" :value="character.id" v-model="selected_character" />
           <label :for="character.id">
             {{ character.name }}
             <img src="/assets/avatar/default/base_right_down.png" />
@@ -13,7 +13,7 @@
        </div>
      </div>
 
-     <button>Play</button>
+     <button @click="select_character()">Play</button>
 
      <hr>
      <Create />
@@ -28,6 +28,7 @@
 import { useSocketStore } from '@/stores/socket'
 import { ref } from 'vue'
 import Create from '@/components/screens/partials/characters/Create.vue'
+import type { Character } from '../../../env'
 
 const socket = useSocketStore();
 const characters = ref([]);
@@ -37,6 +38,17 @@ socket.getConnection.on('character:list', (data: any) => {
   console.log(data);
   characters.value = data;
 });
+
+const selected_character = ref(null);
+function select_character() {
+  console.log(selected_character.value);
+  if (selected_character.value) {
+    socket.getConnection.emit('character:connect', {character_id: selected_character.value});
+    socket.getConnection.on('character:connect', (data: Character) => {
+      socket.setCharacter(data);
+    });
+  }
+}
 </script>
 
 <style lang="scss">
diff --git a/src/stores/player.ts b/src/stores/player.ts
deleted file mode 100644
index 3438e61..0000000
--- a/src/stores/player.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-import { defineStore } from 'pinia';
-import Player from '@/engine/Player/Player'
-
-export const usePlayerStore = defineStore('player', {
-  state: () => ({
-    player: null as Player | null,
-  }),
-
-  actions: {
-    setPlayer(player: Player) {
-      this.player = player;
-    },
-  }
-});
\ No newline at end of file
diff --git a/src/stores/socket.ts b/src/stores/socket.ts
index 781d20e..6d52f35 100644
--- a/src/stores/socket.ts
+++ b/src/stores/socket.ts
@@ -2,15 +2,18 @@ import { defineStore, type StoreDefinition } from 'pinia'
 import { io, Socket } from 'socket.io-client';
 import {useCookies} from '@vueuse/integrations/useCookies'
 import config from '@/config';
+import type { Character, User } from '../../env'
 
 export const useSocketStore: StoreDefinition<any> = defineStore('socket', {
   state: () => ({
     connection: null as Socket | null,
-    character: null as any,
+    user: null as User | null,
+    character: null as Character | null,
   }),
   getters: {
     getConnection: (state: any) => state.connection as Socket,
-    getCharacter: (state: any) => state.character,
+    getUser: (state: any) => state.user as User,
+    getCharacter: (state: any) => state.character as Character,
   },
   actions: {
     setupSocketConnection() {
@@ -23,6 +26,11 @@ export const useSocketStore: StoreDefinition<any> = defineStore('socket', {
       // Let the server know the user is logged in
       this.connection.emit('login');
 
+      // set user
+      this.connection.on('login', (user: User) => {
+        this.setUser(user);
+      });
+
       // When we can't reconnect, disconnect
       this.connection.on('reconnect_failed', () => {
         console.log("Reconnect failed")
@@ -40,10 +48,18 @@ export const useSocketStore: StoreDefinition<any> = defineStore('socket', {
 
       this.connection.disconnect();
       this.connection = null;
+
+      this.user = null;
       this.character = null;
 
       useCookies().remove('token');
     },
+    setUser(user: User|null) {
+      this.user = user;
+    },
+    setCharacter(character: Character|null) {
+      this.character = character;
+    }
   }
 });
 
diff --git a/src/types/TCharacter.ts b/src/types/TCharacter.ts
deleted file mode 100644
index 3cfb2ef..0000000
--- a/src/types/TCharacter.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-import { z } from "zod";
-
-const CharacterObject = z.object({
-  name: z.string(),
-});
-
-type TCharacter = z.infer<typeof CharacterObject>;
-
-export { CharacterObject, type TCharacter };
\ No newline at end of file
diff --git a/src/types/TUser.ts b/src/types/TUser.ts
deleted file mode 100644
index f95ed88..0000000
--- a/src/types/TUser.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-import { z } from "zod";
-
-const UserObject = z.object({
-  username: z.string(),
-});
-
-type TUser = z.infer<typeof UserObject>;
-
-export { UserObject, type TUser };
\ No newline at end of file