import { Server } from 'socket.io' import { TSocket } from '../../../utilities/Types' import ZoneRepository from '../../../repositories/ZoneRepository' import { ZoneEventTile, ZoneObject } from '@prisma/client' import prisma from '../../../utilities/Prisma' import zoneManager from '../../../managers/ZoneManager' interface IPayload { zoneId: number name: string width: number height: number tiles: string[][] pvp: boolean zoneEventTiles: ZoneEventTile[] zoneObjects: ZoneObject[] } /** * Handle game master zone update event * @param socket * @param io */ export default function (socket: TSocket, io: Server) { socket.on('gm:zone_editor:zone:update', async (data: IPayload) => { if (socket.character?.role !== 'gm') { console.log(`---Character #${socket.character?.id} is not a game master.`) return } console.log(`---GM ${socket.character?.id} has updated zone via zone editor.`) if (!data.zoneId) { console.log(`---Zone id not provided.`) return } try { let zone = await ZoneRepository.getById(data.zoneId) if (!zone) { console.log(`---Zone not found.`) return } console.log(data) await prisma.zone.update({ where: { id: data.zoneId }, data: { name: data.name, width: data.width, height: data.height, tiles: data.tiles, pvp: data.pvp, zoneEventTiles: { deleteMany: { zoneId: data.zoneId // Ensure only event tiles related to the zone are deleted }, // Save new zone event tiles create: data.zoneEventTiles.map((zoneEventTile) => ({ type: zoneEventTile.type, position_x: zoneEventTile.position_x, position_y: zoneEventTile.position_y })) }, zoneObjects: { deleteMany: { zoneId: data.zoneId // Ensure only objects related to the zone are deleted }, // Save new zone objects create: data.zoneObjects.map((zoneObject) => ({ objectId: zoneObject.objectId, depth: zoneObject.depth, position_x: zoneObject.position_x, position_y: zoneObject.position_y })) } } }) zone = await ZoneRepository.getById(data.zoneId) if (!zone) { console.log(`---Zone not found.`) return } // send over zone and characters to socket socket.emit('gm:zone_editor:zone:load', zone) zoneManager.unloadZone(data.zoneId) await zoneManager.loadZone(zone) } catch (error: any) { console.log(`---Error updating zone: ${error.message}`) } }) }