1
0
forked from noxious/server

npm update, removed player store and merged it with socket store, worked on character creation & selection (partially works)

This commit is contained in:
Dennis Postma 2024-05-31 01:15:54 +02:00
parent d3e1bf0047
commit b19625014a
7 changed files with 97 additions and 30 deletions

12
package-lock.json generated
View File

@ -213,9 +213,9 @@
} }
}, },
"node_modules/@types/express-serve-static-core": { "node_modules/@types/express-serve-static-core": {
"version": "4.19.1", "version": "4.19.3",
"resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.1.tgz", "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.3.tgz",
"integrity": "sha512-ej0phymbFLoCB26dbbq5PGScsf2JAJ4IJHjG10LalgUV36XKTmA4GdA+PVllKvRk0sEKt64X8975qFnkSi0hqA==", "integrity": "sha512-KOzM7MhcBFlmnlr/fzISFF5vGWVSvN6fTd4T+ExOt08bA/dA5kpSzY52nMsI1KDFmUREpJelPYyuslLRSjjgCg==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
@ -250,9 +250,9 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/@types/node": { "node_modules/@types/node": {
"version": "20.12.12", "version": "20.12.13",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.12.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.13.tgz",
"integrity": "sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==", "integrity": "sha512-gBGeanV41c1L171rR7wjbMiEpEI/l5XFQdLLfhr/REwpgDy/4U8y89+i8kRiLzDyZdOkXh+cRaTetUnCYutoXA==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"undici-types": "~5.26.4" "undici-types": "~5.26.4"

View File

@ -11,11 +11,16 @@ CREATE TABLE `User` (
-- CreateTable -- CreateTable
CREATE TABLE `Character` ( CREATE TABLE `Character` (
`id` INTEGER NOT NULL AUTO_INCREMENT, `id` INTEGER NOT NULL AUTO_INCREMENT,
`userId` INTEGER NOT NULL,
`name` VARCHAR(191) NOT NULL, `name` VARCHAR(191) NOT NULL,
`hitpoints` INTEGER NOT NULL DEFAULT 100,
`mana` INTEGER NOT NULL DEFAULT 100,
`level` INTEGER NOT NULL DEFAULT 1,
`experience` INTEGER NOT NULL DEFAULT 0,
`role` VARCHAR(191) NOT NULL DEFAULT 'player',
`position_x` INTEGER NOT NULL, `position_x` INTEGER NOT NULL,
`position_y` INTEGER NOT NULL, `position_y` INTEGER NOT NULL,
`rotation` INTEGER NOT NULL, `rotation` INTEGER NOT NULL,
`userId` INTEGER NOT NULL,
`zoneId` INTEGER NOT NULL, `zoneId` INTEGER NOT NULL,
PRIMARY KEY (`id`) PRIMARY KEY (`id`)
@ -32,8 +37,25 @@ CREATE TABLE `Zone` (
PRIMARY KEY (`id`) PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `Chat` (
`id` INTEGER NOT NULL AUTO_INCREMENT,
`characterId` INTEGER NOT NULL,
`zoneId` INTEGER NOT NULL,
`message` VARCHAR(191) NOT NULL,
`createdAt` DATETIME(3) NOT NULL,
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- AddForeignKey -- AddForeignKey
ALTER TABLE `Character` ADD CONSTRAINT `Character_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE; ALTER TABLE `Character` ADD CONSTRAINT `Character_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey -- AddForeignKey
ALTER TABLE `Character` ADD CONSTRAINT `Character_zoneId_fkey` FOREIGN KEY (`zoneId`) REFERENCES `Zone`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE; ALTER TABLE `Character` ADD CONSTRAINT `Character_zoneId_fkey` FOREIGN KEY (`zoneId`) REFERENCES `Zone`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `Chat` ADD CONSTRAINT `Chat_characterId_fkey` FOREIGN KEY (`characterId`) REFERENCES `Character`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `Chat` ADD CONSTRAINT `Chat_zoneId_fkey` FOREIGN KEY (`zoneId`) REFERENCES `Zone`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;

View File

@ -31,11 +31,17 @@ model Character {
userId Int userId Int
user User @relation(fields: [userId], references: [id]) user User @relation(fields: [userId], references: [id])
name String name String
hitpoints Int @default(100)
mana Int @default(100)
level Int @default(1)
experience Int @default(0)
role String @default("player")
position_x Int position_x Int
position_y Int position_y Int
rotation Int rotation Int
zoneId Int zoneId Int
zone Zone @relation(fields: [zoneId], references: [id]) zone Zone @relation(fields: [zoneId], references: [id])
chats Chat[]
} }
model Zone { model Zone {
@ -45,4 +51,15 @@ model Zone {
height Int height Int
tiles Json tiles Json
characters Character[] characters Character[]
chats Chat[]
}
model Chat {
id Int @id @default(autoincrement())
characterId Int
character Character @relation(fields: [characterId], references: [id])
zoneId Int
zone Zone @relation(fields: [zoneId], references: [id])
message String
createdAt DateTime
} }

View File

@ -1,8 +1,20 @@
import { Socket, Server } from "socket.io"; import { Socket, Server } from "socket.io";
import {TSocket} from "../types/TSocket"; import {TSocket} from "../types/TSocket";
import CharacterRepository from "../repositories/CharacterRepository";
import {Character} from "@prisma/client";
type SocketResponseT = {
character_id: number
}
export default function CharacterConnect(socket: TSocket, io: Server) { export default function CharacterConnect(socket: TSocket, io: Server) {
socket.on('character:connect', (data: any) => { socket.on('character:connect', async (data: SocketResponseT) => {
console.log(`---User ${socket.user?.id} has joined.`); try {
console.log('character:connect', data.character_id);
socket.character = await CharacterRepository.getById(data.character_id) as Character;
socket.emit('character:connect', socket.character)
} catch (error: any) {
console.log('character:connect error', error);
}
}); });
} }

View File

@ -1,7 +1,9 @@
import { Socket, Server } from "socket.io"; import { Socket, Server } from "socket.io";
import {TSocket} from "../types/TSocket";
export default function Login(socket: Socket, io: Server) { export default function Login(socket: TSocket, io: Server) {
socket.on('login', (data: any) => { socket.on('login', () => {
console.log(`---User ${socket.id} has logged in.`); // return user data
socket.emit('login', {user: socket.user});
}); });
} }

View File

@ -16,6 +16,19 @@ class CharacterRepository {
} }
} }
async getById(id: number): Promise<Character | null> {
try {
return await prisma.character.findUnique({
where: {
id,
},
});
} catch (error: any) {
// Handle error
throw new Error(`Failed to get character by ID: ${error.message}`);
}
}
async create(userId: number, name: string): Promise<Character | null> { async create(userId: number, name: string): Promise<Character | null> {
try { try {
return await prisma.character.create({ return await prisma.character.create({

View File

@ -1,8 +1,9 @@
import {Socket} from "socket.io"; import {Socket} from "socket.io";
import { User } from '@prisma/client'; import {Character, User} from '@prisma/client';
export type TSocket = Socket & { export type TSocket = Socket & {
user?: User user?: User
character?: Character
handshake?: { handshake?: {
query?: { query?: {
token?: any token?: any