forked from noxious/server
Continues asset loading
This commit is contained in:
parent
29dad4914a
commit
6e07fa6a75
@ -10,7 +10,7 @@ import CharacterManager from '../../managers/characterManager'
|
||||
import zoneManager from '../../managers/zoneManager'
|
||||
import ZoneManager from '../../managers/zoneManager'
|
||||
|
||||
type ZoneEventTileWithTeleport = ZoneEventTile & {
|
||||
export type ZoneEventTileWithTeleport = ZoneEventTile & {
|
||||
teleport: ZoneEventTileTeleport
|
||||
}
|
||||
|
||||
|
@ -1,9 +1,11 @@
|
||||
import { Zone } from '@prisma/client'
|
||||
import { Zone, ZoneEventTileTeleport, ZoneEventTileType } from '@prisma/client'
|
||||
import ZoneRepository from '../repositories/zoneRepository'
|
||||
import ZoneService from '../services/zoneService'
|
||||
import logger from '../utilities/logger'
|
||||
import LoadedZone from '../models/loadedZone'
|
||||
import zoneRepository from '../repositories/zoneRepository'
|
||||
import { beforeEach } from 'node:test'
|
||||
import prisma from '../utilities/prisma'
|
||||
|
||||
class ZoneManager {
|
||||
private loadedZones: LoadedZone[] = []
|
||||
@ -25,15 +27,36 @@ class ZoneManager {
|
||||
}
|
||||
|
||||
// For now only current zone.
|
||||
public async getNeededAssets(zone: Zone) {
|
||||
const tiles = this.getUnique((JSON.parse(JSON.stringify(zone.tiles)) as string[][]).reduce((acc, val) => [...acc, ...val]));
|
||||
public async getNeededAssets(zone: Zone, getMore = true): Promise<ZoneAssets> {
|
||||
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 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));
|
||||
|
||||
return {
|
||||
tiles,
|
||||
objects: mappedObjects
|
||||
};
|
||||
tiles: this.getUnique([...tiles, ...(toZoneAssets ? toZoneAssets.tiles : [])]),
|
||||
objects: this.getUnique([...mappedObjects, ...(toZoneAssets ? toZoneAssets.objects : [])]),
|
||||
} as ZoneAssets;
|
||||
}
|
||||
|
||||
private getUnique<T>(array: T[]) {
|
||||
@ -65,4 +88,9 @@ class ZoneManager {
|
||||
}
|
||||
}
|
||||
|
||||
export interface ZoneAssets {
|
||||
tiles: string[]
|
||||
objects: string[]
|
||||
}
|
||||
|
||||
export default new ZoneManager()
|
||||
|
@ -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 logger from '../utilities/logger'
|
||||
import { ZoneEventTileWithTeleport } from '../events/zone/characterMove'
|
||||
|
||||
class ZoneRepository {
|
||||
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[]> {
|
||||
try {
|
||||
return await prisma.zoneObject.findMany({
|
||||
|
@ -36,6 +36,7 @@ export class ZoneEventTileService {
|
||||
// Emit events
|
||||
io.to(oldZoneId.toString()).emit('zone:character:leave', character.id)
|
||||
io.to(newZoneId.toString()).emit('zone:character:join', character)
|
||||
io.to(socket.id).emit('zone:character:load_assets', newZoneId);
|
||||
|
||||
// Update socket rooms
|
||||
socket.leave(oldZoneId.toString())
|
||||
|
Loading…
x
Reference in New Issue
Block a user