Add sprite logics
This commit is contained in:
parent
86123c64a8
commit
23f06061c0
@ -3,7 +3,7 @@
|
|||||||
// npx prisma init
|
// npx prisma init
|
||||||
// 2. Create a new database schema
|
// 2. Create a new database schema
|
||||||
// npx prisma db push
|
// npx prisma db push
|
||||||
// 3. Generate Prisma Client
|
// 3. Generate Prisma Client and type-safe models based on schema
|
||||||
// npx prisma generate
|
// npx prisma generate
|
||||||
// 4. Create a new migration
|
// 4. Create a new migration
|
||||||
// npx prisma migrate dev --name init
|
// npx prisma migrate dev --name init
|
||||||
@ -24,6 +24,7 @@ model Sprite {
|
|||||||
name String
|
name String
|
||||||
origin_x Decimal @default(0)
|
origin_x Decimal @default(0)
|
||||||
origin_y Decimal @default(0)
|
origin_y Decimal @default(0)
|
||||||
|
type String
|
||||||
frameSpeed Int @default(0)
|
frameSpeed Int @default(0)
|
||||||
isAnimated Boolean @default(false)
|
isAnimated Boolean @default(false)
|
||||||
isLooping Boolean @default(false)
|
isLooping Boolean @default(false)
|
||||||
|
26
src/app/events/gm/sprite/List.ts
Normal file
26
src/app/events/gm/sprite/List.ts
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
import { Server } from "socket.io";
|
||||||
|
import {TSocket} from "../../../utilities/Types";
|
||||||
|
import { Sprite } from '@prisma/client'
|
||||||
|
import SpriteRepository from '../../../repositories/SpriteRepository'
|
||||||
|
|
||||||
|
interface IPayload {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle game master list sprite event
|
||||||
|
* @param socket
|
||||||
|
* @param io
|
||||||
|
*/
|
||||||
|
export default function (socket: TSocket, io: Server) {
|
||||||
|
socket.on('gm:sprite:list', async (data: any, callback: (response: Sprite[]) => void) => {
|
||||||
|
|
||||||
|
if (socket.character?.role !== 'gm') {
|
||||||
|
console.log(`---Character #${socket.character?.id} is not a game master.`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// get all sprites
|
||||||
|
const sprites = await SpriteRepository.getAll();
|
||||||
|
callback(sprites);
|
||||||
|
});
|
||||||
|
}
|
45
src/app/events/gm/sprite/Remove.ts
Normal file
45
src/app/events/gm/sprite/Remove.ts
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
import { Server } from "socket.io";
|
||||||
|
import {TSocket} from "../../../utilities/Types";
|
||||||
|
import path from "path";
|
||||||
|
import fs from "fs";
|
||||||
|
import SpriteRepository from '../../../repositories/SpriteRepository'
|
||||||
|
|
||||||
|
interface IPayload {
|
||||||
|
sprite: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle game master remove sprite event
|
||||||
|
* @param socket
|
||||||
|
* @param io
|
||||||
|
*/
|
||||||
|
export default function (socket: TSocket, io: Server) {
|
||||||
|
socket.on('gm:sprite:remove', async (data: IPayload, callback: (response: boolean) => void) => {
|
||||||
|
|
||||||
|
if (socket.character?.role !== 'gm') {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
await SpriteRepository.delete(data.sprite);
|
||||||
|
|
||||||
|
// get root path
|
||||||
|
const public_folder = path.join(process.cwd(), 'public', 'sprites');
|
||||||
|
|
||||||
|
// remove the tile from the disk
|
||||||
|
const finalFilePath = path.join(public_folder, data.sprite + '.png');
|
||||||
|
fs.unlink(finalFilePath, (err) => {
|
||||||
|
if (err) {
|
||||||
|
console.log(err);
|
||||||
|
callback(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
callback(true);
|
||||||
|
});
|
||||||
|
} catch (e) {
|
||||||
|
console.log(e);
|
||||||
|
callback(false);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
34
src/app/events/gm/sprite/Update.ts
Normal file
34
src/app/events/gm/sprite/Update.ts
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
import { Server } from "socket.io";
|
||||||
|
import {TSocket} from "../../../utilities/Types";
|
||||||
|
import SpriteRepository from '../../../repositories/SpriteRepository'
|
||||||
|
import { Sprite } from '@prisma/client'
|
||||||
|
|
||||||
|
interface IPayload {
|
||||||
|
id: string;
|
||||||
|
name: string;
|
||||||
|
origin_x: number;
|
||||||
|
origin_y: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle game master sprite update event
|
||||||
|
* @param socket
|
||||||
|
* @param io
|
||||||
|
*/
|
||||||
|
export default function (socket: TSocket, io: Server) {
|
||||||
|
socket.on('gm:sprite:update', async (data: IPayload, callback: (success: boolean) => void) => {
|
||||||
|
|
||||||
|
if (socket.character?.role !== 'gm') {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const sprite = await SpriteRepository.update(data.id, data.name, data.origin_x, data.origin_y);
|
||||||
|
|
||||||
|
callback(true);
|
||||||
|
} catch (error) {
|
||||||
|
console.error(error);
|
||||||
|
callback(false);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
46
src/app/events/gm/sprite/Upload.ts
Normal file
46
src/app/events/gm/sprite/Upload.ts
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
import { Server } from "socket.io";
|
||||||
|
import { TSocket } from "../../../utilities/Types";
|
||||||
|
import { writeFile } from "node:fs/promises";
|
||||||
|
import path from "path";
|
||||||
|
import fs from "fs/promises";
|
||||||
|
import spriteRepository from '../../../repositories/SpriteRepository'
|
||||||
|
|
||||||
|
interface ISpriteData {
|
||||||
|
[key: string]: Buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle game master upload sprite event
|
||||||
|
* @param socket
|
||||||
|
* @param io
|
||||||
|
*/
|
||||||
|
export default function (socket: TSocket, io: Server) {
|
||||||
|
socket.on('gm:sprite:upload', async (data: ISpriteData, callback: (response: boolean) => void) => {
|
||||||
|
try {
|
||||||
|
if (socket.character?.role !== 'gm') {
|
||||||
|
callback(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const public_folder = path.join(process.cwd(), 'public', 'sprites');
|
||||||
|
|
||||||
|
// Ensure the folder exists
|
||||||
|
await fs.mkdir(public_folder, { recursive: true });
|
||||||
|
|
||||||
|
const uploadPromises = Object.entries(data).map(async ([key, spriteData]) => {
|
||||||
|
const sprite = await spriteRepository.create('New sprite', 0, 0);
|
||||||
|
const uuid = sprite.id;
|
||||||
|
const filename = `${uuid}.png`;
|
||||||
|
const finalFilePath = path.join(public_folder, filename);
|
||||||
|
await writeFile(finalFilePath, spriteData);
|
||||||
|
});
|
||||||
|
|
||||||
|
await Promise.all(uploadPromises);
|
||||||
|
|
||||||
|
callback(true);
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error uploading tile:', error);
|
||||||
|
callback(false);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
@ -1,6 +1,5 @@
|
|||||||
import prisma from '../utilities/Prisma'; // Import the global Prisma instance
|
import prisma from '../utilities/Prisma'; // Import the global Prisma instance
|
||||||
import {Character} from '@prisma/client';
|
import {Character} from '@prisma/client';
|
||||||
import CharacterService from "../services/CharacterService";
|
|
||||||
|
|
||||||
class CharacterRepository {
|
class CharacterRepository {
|
||||||
async getByUserId(userId: number): Promise<Character[] | null> {
|
async getByUserId(userId: number): Promise<Character[] | null> {
|
||||||
|
43
src/app/repositories/SpriteRepository.ts
Normal file
43
src/app/repositories/SpriteRepository.ts
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
import prisma from '../utilities/Prisma'; // Import the global Prisma instance
|
||||||
|
import { Sprite } from '@prisma/client'
|
||||||
|
|
||||||
|
class SpriteRepository {
|
||||||
|
async getById(id: string): Promise<Sprite | null> {
|
||||||
|
return prisma.sprite.findUnique({
|
||||||
|
where: { id },
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async getAll(): Promise<Sprite[]> {
|
||||||
|
return prisma.sprite.findMany();
|
||||||
|
}
|
||||||
|
|
||||||
|
async create(name: string, origin_x: number, origin_y: number): Promise<Sprite> {
|
||||||
|
return prisma.sprite.create({
|
||||||
|
data: {
|
||||||
|
name,
|
||||||
|
origin_x,
|
||||||
|
origin_y
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async update(id: string, name: string, origin_x: number, origin_y: number): Promise<Sprite> {
|
||||||
|
return prisma.sprite.update({
|
||||||
|
where: { id },
|
||||||
|
data: {
|
||||||
|
name,
|
||||||
|
origin_x,
|
||||||
|
origin_y
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async delete(id: string): Promise<Sprite> {
|
||||||
|
return prisma.sprite.delete({
|
||||||
|
where: { id },
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default new SpriteRepository();
|
@ -9,9 +9,9 @@ import config from "./Config";
|
|||||||
import {loginAccountSchema, registerAccountSchema} from "./ZodTypes";
|
import {loginAccountSchema, registerAccountSchema} from "./ZodTypes";
|
||||||
import path from "path";
|
import path from "path";
|
||||||
import { TAsset } from './Types'
|
import { TAsset } from './Types'
|
||||||
import fs from 'fs'
|
|
||||||
import tileRepository from '../repositories/TileRepository'
|
import tileRepository from '../repositories/TileRepository'
|
||||||
import objectRepository from '../repositories/ObjectRepository'
|
import objectRepository from '../repositories/ObjectRepository'
|
||||||
|
import spriteRepository from '../repositories/SpriteRepository'
|
||||||
|
|
||||||
async function addHttpRoutes(app: Application) {
|
async function addHttpRoutes(app: Application) {
|
||||||
app.get('/assets', async (req: Request, res: Response) => {
|
app.get('/assets', async (req: Request, res: Response) => {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user