1
0
forked from noxious/server

Continues asset loading

This commit is contained in:
Zaxiure 2024-09-19 01:33:54 +02:00
parent 29dad4914a
commit 6e07fa6a75
No known key found for this signature in database
4 changed files with 53 additions and 8 deletions

View File

@ -10,7 +10,7 @@ import CharacterManager from '../../managers/characterManager'
import zoneManager from '../../managers/zoneManager' import zoneManager from '../../managers/zoneManager'
import ZoneManager from '../../managers/zoneManager' import ZoneManager from '../../managers/zoneManager'
type ZoneEventTileWithTeleport = ZoneEventTile & { export type ZoneEventTileWithTeleport = ZoneEventTile & {
teleport: ZoneEventTileTeleport teleport: ZoneEventTileTeleport
} }

View File

@ -1,9 +1,11 @@
import { Zone } from '@prisma/client' import { Zone, ZoneEventTileTeleport, ZoneEventTileType } from '@prisma/client'
import ZoneRepository from '../repositories/zoneRepository' import ZoneRepository from '../repositories/zoneRepository'
import ZoneService from '../services/zoneService' import ZoneService from '../services/zoneService'
import logger from '../utilities/logger' import logger from '../utilities/logger'
import LoadedZone from '../models/loadedZone' import LoadedZone from '../models/loadedZone'
import zoneRepository from '../repositories/zoneRepository' import zoneRepository from '../repositories/zoneRepository'
import { beforeEach } from 'node:test'
import prisma from '../utilities/prisma'
class ZoneManager { class ZoneManager {
private loadedZones: LoadedZone[] = [] private loadedZones: LoadedZone[] = []
@ -25,15 +27,36 @@ class ZoneManager {
} }
// For now only current zone. // For now only current zone.
public async getNeededAssets(zone: Zone) { public async getNeededAssets(zone: Zone, getMore = true): Promise<ZoneAssets> {
const tiles = this.getUnique((JSON.parse(JSON.stringify(zone.tiles)) as string[][]).reduce((acc, val) => [...acc, ...val])); const tiles: string[] = this.getUnique((JSON.parse(JSON.stringify(zone.tiles)) as string[][]).reduce((acc, val) => [...acc, ...val]));
const objects = await zoneRepository.getObjects(zone.id); const objects = await zoneRepository.getObjects(zone.id);
const eventTeleportTiles = await zoneRepository.getEventTeleportTiles(zone.id);
let toZoneAssets = null;
if(getMore) {
for (const eventTeleportTile of eventTeleportTiles) {
console.log(eventTeleportTile);
console.log(eventTeleportTile.teleport.toZoneId);
const toZone = await zoneRepository.getById(eventTeleportTile.teleport.toZoneId);
console.log(toZone);
if(toZone) {
if(!toZoneAssets) {
toZoneAssets = await this.getNeededAssets(toZone, false);
} else {
const newToZoneAssets = await this.getNeededAssets(toZone, false);
toZoneAssets = {
tiles: this.getUnique([...toZoneAssets.tiles, ...(newToZoneAssets ? newToZoneAssets.tiles : [])]),
objects: this.getUnique([...toZoneAssets.objects, ...(newToZoneAssets ? newToZoneAssets.objects : [])]),
} as ZoneAssets
}
}
}
}
let mappedObjects = this.getUnique(objects.map(x => x.objectId)); let mappedObjects = this.getUnique(objects.map(x => x.objectId));
return { return {
tiles, tiles: this.getUnique([...tiles, ...(toZoneAssets ? toZoneAssets.tiles : [])]),
objects: mappedObjects objects: this.getUnique([...mappedObjects, ...(toZoneAssets ? toZoneAssets.objects : [])]),
}; } as ZoneAssets;
} }
private getUnique<T>(array: T[]) { private getUnique<T>(array: T[]) {
@ -65,4 +88,9 @@ class ZoneManager {
} }
} }
export interface ZoneAssets {
tiles: string[]
objects: string[]
}
export default new ZoneManager() export default new ZoneManager()

View File

@ -1,6 +1,7 @@
import { Zone, ZoneEventTile, ZoneObject } from '@prisma/client' import { Zone, ZoneEventTile, ZoneEventTileTeleport, ZoneEventTileType, ZoneObject } from '@prisma/client'
import prisma from '../utilities/prisma' import prisma from '../utilities/prisma'
import logger from '../utilities/logger' import logger from '../utilities/logger'
import { ZoneEventTileWithTeleport } from '../events/zone/characterMove'
class ZoneRepository { class ZoneRepository {
async getFirst(): Promise<Zone | null> { async getFirst(): Promise<Zone | null> {
@ -60,6 +61,21 @@ class ZoneRepository {
} }
} }
async getEventTeleportTiles(id: number): Promise<ZoneEventTileWithTeleport[]> {
try {
return await prisma.zoneEventTile.findMany({
where: {
zoneId: id,
type: ZoneEventTileType.TELEPORT
},
include: { teleport: true }
}) as unknown as ZoneEventTileWithTeleport[]
} catch (error: any) {
logger.error(`Failed to get zone event tiles: ${error.message}`)
return []
}
}
async getObjects(id: number): Promise<ZoneObject[]> { async getObjects(id: number): Promise<ZoneObject[]> {
try { try {
return await prisma.zoneObject.findMany({ return await prisma.zoneObject.findMany({

View File

@ -36,6 +36,7 @@ export class ZoneEventTileService {
// Emit events // Emit events
io.to(oldZoneId.toString()).emit('zone:character:leave', character.id) io.to(oldZoneId.toString()).emit('zone:character:leave', character.id)
io.to(newZoneId.toString()).emit('zone:character:join', character) io.to(newZoneId.toString()).emit('zone:character:join', character)
io.to(socket.id).emit('zone:character:load_assets', newZoneId);
// Update socket rooms // Update socket rooms
socket.leave(oldZoneId.toString()) socket.leave(oldZoneId.toString())