forked from noxious/server
Fixes and improvements for dynamic zone asset loading
This commit is contained in:
parent
5d631797ff
commit
5a40fb4734
@ -65,8 +65,6 @@ export default class TeleportCommandEvent {
|
|||||||
// Update character in CharacterManager
|
// Update character in CharacterManager
|
||||||
CharacterManager.initCharacter(this.socket.character)
|
CharacterManager.initCharacter(this.socket.character)
|
||||||
|
|
||||||
this.socket.emit('zone:character:load_assets', zone.id);
|
|
||||||
|
|
||||||
this.socket.emit('zone:teleport', {
|
this.socket.emit('zone:teleport', {
|
||||||
zone,
|
zone,
|
||||||
characters: CharacterManager.getCharactersInZone(zone)
|
characters: CharacterManager.getCharactersInZone(zone)
|
||||||
|
@ -26,36 +26,16 @@ class ZoneManager {
|
|||||||
logger.info('Zone manager loaded')
|
logger.info('Zone manager loaded')
|
||||||
}
|
}
|
||||||
|
|
||||||
// For now only current zone.
|
public async getZoneAssets(zone: Zone): Promise<ZoneAssets> {
|
||||||
public async getNeededAssets(zone: Zone, getMore = true): Promise<ZoneAssets> {
|
const tiles: string[] = this.getUnique(
|
||||||
const tiles: string[] = this.getUnique((JSON.parse(JSON.stringify(zone.tiles)) as string[][]).reduce((acc, val) => [...acc, ...val]));
|
(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);
|
const mappedObjects = this.getUnique(objects.map(x => x.objectId));
|
||||||
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 {
|
return {
|
||||||
tiles: this.getUnique([...tiles, ...(toZoneAssets ? toZoneAssets.tiles : [])]),
|
tiles: tiles,
|
||||||
objects: this.getUnique([...mappedObjects, ...(toZoneAssets ? toZoneAssets.objects : [])]),
|
objects: mappedObjects,
|
||||||
} as ZoneAssets;
|
} as ZoneAssets;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -67,7 +47,7 @@ class ZoneManager {
|
|||||||
public async loadZone(zone: Zone) {
|
public async loadZone(zone: Zone) {
|
||||||
const loadedZone = new LoadedZone(zone)
|
const loadedZone = new LoadedZone(zone)
|
||||||
this.loadedZones.push(loadedZone)
|
this.loadedZones.push(loadedZone)
|
||||||
await this.getNeededAssets(zone);
|
await this.getZoneAssets(zone);
|
||||||
logger.info(`Zone ID ${zone.id} loaded`)
|
logger.info(`Zone ID ${zone.id} loaded`)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -35,7 +35,6 @@ 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)
|
||||||
socket.emit('zone:character:load_assets', newZoneId);
|
|
||||||
|
|
||||||
// Update socket rooms
|
// Update socket rooms
|
||||||
socket.leave(oldZoneId.toString())
|
socket.leave(oldZoneId.toString())
|
||||||
|
@ -52,42 +52,45 @@ async function addHttpRoutes(app: Application) {
|
|||||||
})
|
})
|
||||||
|
|
||||||
app.get('/assets/:zoneId', async (req: Request, res: Response) => {
|
app.get('/assets/:zoneId', async (req: Request, res: Response) => {
|
||||||
const zoneId = req.params.zoneId
|
const zoneId = parseInt(req.params.zoneId);
|
||||||
if(zoneId && parseInt(zoneId)) {
|
|
||||||
const zone = await zoneRepository.getById(parseInt(zoneId))
|
|
||||||
if(zone) {
|
|
||||||
const assets = await zoneManager.getNeededAssets(zone);
|
|
||||||
const sprites = await spriteRepository.getAll()
|
|
||||||
const spritesArray: TAsset[] = [];
|
|
||||||
sprites.forEach((sprite) => {
|
|
||||||
sprite.spriteActions.forEach((spriteAction) => {
|
|
||||||
spritesArray.push({
|
|
||||||
key: sprite.id + '-' + spriteAction.action,
|
|
||||||
url: '/assets/sprites/' + sprite.id + '/' + spriteAction.action + '.png',
|
|
||||||
group: spriteAction.isAnimated ? 'sprite_animations' : 'sprites',
|
|
||||||
frameWidth: spriteAction.frameWidth,
|
|
||||||
frameHeight: spriteAction.frameHeight
|
|
||||||
})
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
res.json([
|
if (isNaN(zoneId) || zoneId === 0) {
|
||||||
...spritesArray,
|
return res.status(400).json({ message: 'Invalid zone ID' });
|
||||||
...assets.tiles.map(x => { return {
|
|
||||||
key: x,
|
|
||||||
url: '/assets/tiles/' + x + '.png',
|
|
||||||
group: 'tiles'
|
|
||||||
}}),
|
|
||||||
...assets.objects.map(x => { return {
|
|
||||||
key: x,
|
|
||||||
url: '/assets/objects/' + x + '.png',
|
|
||||||
group: 'objects'
|
|
||||||
}})
|
|
||||||
]);
|
|
||||||
// res.json( );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
})
|
|
||||||
|
const zone = await zoneRepository.getById(zoneId);
|
||||||
|
|
||||||
|
if (!zone) {
|
||||||
|
return res.status(404).json({ message: 'Zone not found' });
|
||||||
|
}
|
||||||
|
|
||||||
|
const assets = await zoneManager.getZoneAssets(zone);
|
||||||
|
const sprites = await spriteRepository.getAll();
|
||||||
|
|
||||||
|
const spritesAssets = sprites.flatMap(sprite =>
|
||||||
|
sprite.spriteActions.map(action => ({
|
||||||
|
key: `${sprite.id}-${action.action}`,
|
||||||
|
url: `/assets/sprites/${sprite.id}/${action.action}.png`,
|
||||||
|
group: action.isAnimated ? 'sprite_animations' : 'sprites',
|
||||||
|
frameWidth: action.frameWidth,
|
||||||
|
frameHeight: action.frameHeight
|
||||||
|
}))
|
||||||
|
);
|
||||||
|
|
||||||
|
const tilesAssets = assets.tiles.map(tile => ({
|
||||||
|
key: tile,
|
||||||
|
url: `/assets/tiles/${tile}.png`,
|
||||||
|
group: 'tiles'
|
||||||
|
}));
|
||||||
|
|
||||||
|
const objectsAssets = assets.objects.map(object => ({
|
||||||
|
key: object,
|
||||||
|
url: `/assets/objects/${object}.png`,
|
||||||
|
group: 'objects'
|
||||||
|
}));
|
||||||
|
|
||||||
|
res.json([...spritesAssets, ...tilesAssets, ...objectsAssets]);
|
||||||
|
});
|
||||||
|
|
||||||
app.get('/assets/:type/:spriteId?/:file', (req: Request, res: Response) => {
|
app.get('/assets/:type/:spriteId?/:file', (req: Request, res: Response) => {
|
||||||
const assetType = req.params.type
|
const assetType = req.params.type
|
||||||
|
Loading…
x
Reference in New Issue
Block a user