From 45b4817ac41987c8dd012a1fb106288929cb3471 Mon Sep 17 00:00:00 2001 From: Dennis Postma Date: Wed, 10 Jul 2024 17:31:07 +0200 Subject: [PATCH] Zone updating stuff --- .../migration.sql | 4 +- prisma/schema.prisma | 26 +++++------ .../events/gm/zone/GmZoneEditorZoneUpdate.ts | 46 +++++++++++-------- src/app/repositories/ZoneRepository.ts | 30 +++++++++--- 4 files changed, 64 insertions(+), 42 deletions(-) rename prisma/migrations/{20240709223858_init => 20240710141932_init}/migration.sql (98%) diff --git a/prisma/migrations/20240709223858_init/migration.sql b/prisma/migrations/20240710141932_init/migration.sql similarity index 98% rename from prisma/migrations/20240709223858_init/migration.sql rename to prisma/migrations/20240710141932_init/migration.sql index bc0692c..19bb2d6 100644 --- a/prisma/migrations/20240709223858_init/migration.sql +++ b/prisma/migrations/20240710141932_init/migration.sql @@ -84,7 +84,7 @@ CREATE TABLE `Zone` ( -- CreateTable CREATE TABLE `ZoneObject` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, + `id` VARCHAR(191) NOT NULL, `zoneId` INTEGER NOT NULL, `objectId` VARCHAR(191) NOT NULL, `depth` INTEGER NOT NULL, @@ -96,7 +96,7 @@ CREATE TABLE `ZoneObject` ( -- CreateTable CREATE TABLE `ZoneEventTile` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, + `id` VARCHAR(191) NOT NULL, `zoneId` INTEGER NOT NULL, `type` ENUM('BLOCK', 'WARP', 'NPC', 'ITEM') NOT NULL, `position_x` INTEGER NOT NULL, diff --git a/prisma/schema.prisma b/prisma/schema.prisma index cfa0898..731836c 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -80,21 +80,21 @@ model TileTag { } model Zone { - id Int @id @default(autoincrement()) - name String - width Int - height Int - tiles Json + id Int @id @default(autoincrement()) + name String + width Int + height Int + tiles Json zoneEventTiles ZoneEventTile[] - zoneObjects ZoneObject[] - characters Character[] - chats Chat[] - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt + zoneObjects ZoneObject[] + characters Character[] + chats Chat[] + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt } model ZoneObject { - id Int @id @default(autoincrement()) + id String @id @default(uuid()) zoneId Int zone Zone @relation(fields: [zoneId], references: [id], onDelete: Cascade) objectId String @@ -112,9 +112,9 @@ enum ZoneEventTileType { } model ZoneEventTile { - id Int @id @default(autoincrement()) + id String @id @default(uuid()) zoneId Int - zone Zone @relation(fields: [zoneId], references: [id], onDelete: Cascade) + zone Zone @relation(fields: [zoneId], references: [id], onDelete: Cascade) type ZoneEventTileType position_x Int position_y Int diff --git a/src/app/events/gm/zone/GmZoneEditorZoneUpdate.ts b/src/app/events/gm/zone/GmZoneEditorZoneUpdate.ts index 0c9de96..22d91e1 100644 --- a/src/app/events/gm/zone/GmZoneEditorZoneUpdate.ts +++ b/src/app/events/gm/zone/GmZoneEditorZoneUpdate.ts @@ -2,7 +2,7 @@ import { Server } from "socket.io"; import {TSocket} from "../../../utilities/Types"; import ZoneRepository from "../../../repositories/ZoneRepository"; import ZoneManager from "../../../ZoneManager"; -import { Character, Zone, ZoneObject } from '@prisma/client' +import { Character, Zone, ZoneEventTile, ZoneObject } from '@prisma/client' interface IPayload { zoneId: number; @@ -10,7 +10,8 @@ interface IPayload { width: number; height: number; tiles: string[][]; - objects: ZoneObject[]; + zoneEventTiles: ZoneEventTile[]; + zoneObjects: ZoneObject[]; } /** @@ -33,25 +34,30 @@ export default function (socket: TSocket, io: Server) { return; } - let zone = await ZoneRepository.getById(data.zoneId); + try { + let zone = await ZoneRepository.getById(data.zoneId); - if (!zone) { - console.log(`---Zone not found.`); - return; + if (!zone) { + console.log(`---Zone not found.`); + return; + } + + await ZoneRepository.update( + data.zoneId, + data.name, + data.width, + data.height, + data.tiles, + data.zoneEventTiles, + data.zoneObjects + ); + + zone = await ZoneRepository.getById(data.zoneId); + + // send over zone and characters to socket + socket.emit('gm:zone_editor:zone:load', zone); + } catch (error: any) { + console.log(`---Error updating zone: ${error.message}`); } - - await ZoneRepository.update( - data.zoneId, - zone.name, - zone.width, - zone.height, - data.tiles, - data.objects - ); - - zone = await ZoneRepository.getById(data.zoneId); - - // send over zone and characters to socket - socket.emit('gm:zone_editor:zone:load', zone); }); } \ No newline at end of file diff --git a/src/app/repositories/ZoneRepository.ts b/src/app/repositories/ZoneRepository.ts index 333fe56..2bde86c 100644 --- a/src/app/repositories/ZoneRepository.ts +++ b/src/app/repositories/ZoneRepository.ts @@ -1,4 +1,4 @@ -import { Zone, ZoneObject } from '@prisma/client' +import { Zone, ZoneEventTile, ZoneObject } from '@prisma/client' import prisma from '../utilities/Prisma'; // Import the global Prisma instance class ZoneRepository { @@ -27,6 +27,11 @@ class ZoneRepository { id: id }, include: { + zoneEventTiles: { + include: { + zone: true + } + }, zoneObjects: { include: { object: true @@ -56,7 +61,7 @@ class ZoneRepository { } } - async update(id: number, name: string, width: number, height: number, tiles: string[][], objects: ZoneObject[]): Promise { + async update(id: number, name: string, width: number, height: number, tiles: string[][], zoneEventTiles: ZoneEventTile[], zoneObjects: ZoneObject[]): Promise { try { return await prisma.zone.update({ where: { @@ -67,16 +72,27 @@ class ZoneRepository { width, height, tiles, + zoneEventTiles: { + deleteMany: { + zoneId: id // Ensure only event tiles related to the zone are deleted + }, + // Save new zone event tiles + create: zoneEventTiles.map(zoneEventTile => ({ + type: zoneEventTile.type, + position_x: zoneEventTile.position_x, + position_y: zoneEventTile.position_y + })) + }, zoneObjects: { deleteMany: { zoneId: id // Ensure only objects related to the zone are deleted }, // Save new zone objects - create: objects.map(obj => ({ - objectId: obj.objectId, - depth: obj.depth, - position_x: obj.position_x, - position_y: obj.position_y + create: zoneObjects.map(zoneObject => ({ + objectId: zoneObject.objectId, + depth: zoneObject.depth, + position_x: zoneObject.position_x, + position_y: zoneObject.position_y })) } }