server/src/app/ZoneManager.ts
2024-05-12 21:24:14 +02:00

71 lines
1.9 KiB
TypeScript

import {Character, Zone} from "@prisma/client";
import ZoneRepository from "./repositories/zone.repository";
import ZoneService from "./services/zone.service";
interface ILoadedZone {
zone: Zone;
characters: Character[];
}
class ZoneManager {
private loadedZones: ILoadedZone[] = [];
// Method to initialize zone loading
public async boot() {
if (!await ZoneRepository.getById(1)) {
const zoneService = new ZoneService();
await zoneService.createDemoZone();
}
const zones = await ZoneRepository.getAll();
for (const zone of zones) {
this.loadZone(zone);
}
console.log('[✅] Zone manager loaded');
}
// Method to handle individual zone loading
public loadZone(zone: Zone) {
this.loadedZones.push({
zone,
characters: []
});
console.log(`[✅] Zone ID ${zone.id} loaded`);
}
// Method to handle individual zone unloading
public unloadZone(zoneId: number) {
this.loadedZones = this.loadedZones.filter((loadedZone) => {
return loadedZone.zone.id !== zoneId;
});
console.log(`[❌] Zone ID ${zoneId} unloaded`);
}
// Getter for loaded zones
public getLoadedZones(): Zone[] {
return this.loadedZones.map((loadedZone) => {
return loadedZone.zone;
});
}
public addCharacterToZone(zoneId: number, character: Character) {
const loadedZone = this.loadedZones.find((loadedZone) => {
return loadedZone.zone.id === zoneId;
});
if (loadedZone) {
loadedZone.characters.push(character);
}
}
public getCharactersInZone(zoneId: number): Character[] {
const loadedZone = this.loadedZones.find((loadedZone) => {
return loadedZone.zone.id === zoneId;
});
return loadedZone ? loadedZone.characters : [];
}
}
export default new ZoneManager;