1
0
forked from noxious/server

More cache stuff

This commit is contained in:
2025-01-07 22:20:27 +01:00
parent 010454914b
commit 39ec4daa06
12 changed files with 222 additions and 166 deletions

View File

@ -2,57 +2,10 @@ import { Request, Response } from 'express'
import { BaseController } from '#application/base/baseController'
import { AssetData, UUID } from '#application/types'
import MapRepository from '#repositories/mapRepository'
import SpriteRepository from '#repositories/spriteRepository'
import TileRepository from '#repositories/tileRepository'
export class AssetsController extends BaseController {
private readonly mapRepository = new MapRepository()
private readonly spriteRepository = new SpriteRepository()
private readonly tileRepository = new TileRepository()
/**
* List tiles
* @param req
* @param res
*/
public async listTiles(req: Request, res: Response) {
const assets: AssetData[] = []
const tiles = await this.tileRepository.getAll()
for (const tile of tiles) {
assets.push({ key: tile.getId(), data: '/textures/tiles/' + tile.getId() + '.png', group: 'tiles', updatedAt: tile.getUpdatedAt() } as AssetData)
}
return this.sendSuccess(res, assets)
}
/**
* List tiles by map
* @param req
* @param res
*/
public async listTilesByMap(req: Request, res: Response) {
const mapId = req.params.mapId as UUID
if (!mapId) {
return this.sendError(res, 'Invalid map ID', 400)
}
const map = await this.mapRepository.getById(mapId)
if (!map) {
return this.sendError(res, 'Map not found', 404)
}
const assets: AssetData[] = []
const tiles = await this.tileRepository.getByMapId(mapId)
for (const tile of tiles) {
assets.push({ key: tile.getId(), data: '/textures/tiles/' + tile.getId() + '.png', group: 'tiles', updatedAt: tile.getUpdatedAt() } as AssetData)
}
return this.sendSuccess(res, assets)
}
/**
* List sprite actions

View File

@ -5,8 +5,28 @@ import MapObjectRepository from '#repositories/mapObjectRepository'
import MapRepository from '#repositories/mapRepository'
import SpriteRepository from '#repositories/spriteRepository'
import TileRepository from '#repositories/tileRepository'
import CharacterHairRepository from '#repositories/characterHairRepository'
import CharacterTypeRepository from '#repositories/characterTypeRepository'
export class CacheController extends BaseController {
/**
* Serve a list of tiles and send as JSON
* @param req
* @param res
*/
public async tiles(req: Request, res: Response) {
const items: any[] = []
const tileRepository = new TileRepository()
const tiles = await tileRepository.getAll()
for (const tile of tiles) {
items.push(await tile.cache())
}
return this.sendSuccess(res, items)
}
/**
* Serve a list of maps and send as JSON
* @param req
@ -42,4 +62,58 @@ export class CacheController extends BaseController {
return this.sendSuccess(res, items)
}
/**
* Serve a list of character hairs and send as JSON
* @param req
* @param res
*/
public async characterHair(req: Request, res: Response) {
const items: any[] = []
const characterHairRepository = new CharacterHairRepository()
const characterHairs = await characterHairRepository.getAll()
for (const characterHair of characterHairs) {
items.push(await characterHair.cache())
}
return this.sendSuccess(res, items)
}
/**
* Serve a list of character types and send as JSON
* @param req
* @param res
*/
public async characterTypes(req: Request, res: Response) {
const items: any[] = []
const characterTypeRepository = new CharacterTypeRepository()
const characterTypes = await characterTypeRepository.getAll()
for (const characterType of characterTypes) {
items.push(await characterType.cache())
}
return this.sendSuccess(res, items)
}
/**
* Serve a list of sprites and send as JSON
* @param req
* @param res
*/
public async sprites(req: Request, res: Response) {
const items: any[] = []
const spriteRepository = new SpriteRepository()
const sprites = await spriteRepository.getAll()
for (const sprite of sprites) {
items.push(await sprite.cache())
}
return this.sendSuccess(res, items)
}
}

View File

@ -3,4 +3,13 @@ import { Entity } from '@mikro-orm/core'
import { BaseCharacterHair } from '#entities/base/characterHair'
@Entity()
export class CharacterHair extends BaseCharacterHair {}
export class CharacterHair extends BaseCharacterHair {
public async cache() {
try {
return this
} catch (error) {
console.error(error)
return {}
}
}
}

View File

@ -3,4 +3,13 @@ import { Entity } from '@mikro-orm/core'
import { BaseCharacterType } from '#entities/base/characterType'
@Entity()
export class CharacterType extends BaseCharacterType {}
export class CharacterType extends BaseCharacterType {
public async cache() {
try {
return this
} catch (error) {
console.error(error)
return {}
}
}
}

View File

@ -3,4 +3,33 @@ import { Entity } from '@mikro-orm/core'
import { BaseSprite } from '#entities/base/sprite'
@Entity()
export class Sprite extends BaseSprite {}
export class Sprite extends BaseSprite {
public async cache() {
await this.getSpriteActions().load()
try {
return {
id: this.getId(),
name: this.getName(),
createdAt: this.getCreatedAt(),
updatedAt: this.getUpdatedAt(),
spriteActions: this.getSpriteActions().map((spriteAction) => ({
id: spriteAction.getId(),
sprite: spriteAction.getSprite().getId(),
action: spriteAction.getAction(),
// sprites: spriteAction.getSprites(), // We dont want to send this to the client
originX: spriteAction.getOriginX(),
originY: spriteAction.getOriginY(),
isAnimated: spriteAction.getIsAnimated(),
isLooping: spriteAction.getIsLooping(),
frameWidth: spriteAction.getFrameWidth(),
frameHeight: spriteAction.getFrameHeight(),
frameRate: spriteAction.getFrameRate()
}))
}
} catch (error) {
console.error(error)
return {}
}
}
}

View File

@ -3,4 +3,13 @@ import { Entity } from '@mikro-orm/core'
import { BaseTile } from '#entities/base/tile'
@Entity()
export class Tile extends BaseTile {}
export class Tile extends BaseTile {
public async cache() {
try {
return this
} catch (error) {
console.error(error)
return {}
}
}
}

View File

@ -1,23 +0,0 @@
import { BaseEvent } from '#application/base/baseEvent'
import { CharacterHair } from '#entities/characterHair'
import CharacterHairRepository from '#repositories/characterHairRepository'
interface IPayload {}
export default class characterHairListEvent extends BaseEvent {
public listen(): void {
this.socket.on('character:hair:list', this.handleEvent.bind(this))
}
private async handleEvent(data: IPayload, callback: (response: CharacterHair[]) => void): Promise<void> {
try {
const characterHairRepository = new CharacterHairRepository()
const items: CharacterHair[] = await characterHairRepository.getAllSelectable(['sprite'])
return callback(items)
} catch (error) {
this.logger.error('character:hair:list error', error)
return callback([])
}
}
}

View File

@ -32,9 +32,6 @@ export default class CharacterConnectEvent extends BaseEvent {
return
}
// Populate character with characterType and characterHair
await this.characterRepository.getEntityManager().populate(character, ['characterType', 'characterHair'])
// Set character id
this.socket.characterId = character.id

View File

@ -12,9 +12,6 @@ export default class CharacterListEvent extends BaseEvent {
const characterRepository = new CharacterRepository()
let characters: Character[] = await characterRepository.getByUserId(this.socket.userId!)
// Populate characters with characterType and characterHair
await characterRepository.getEntityManager().populate(characters, ['characterType', 'characterHair'])
this.socket.emit('character:list', characters)
} catch (error: any) {
this.logger.error('character:list error', error.message)

View File

@ -37,16 +37,18 @@ class HttpManager {
app.get('/avatar/s/:characterTypeId/:characterHairId?', (req, res) => this.avatarController.getByParams(req, res))
// Assets routes
app.get('/assets/list_tiles', (req, res) => this.assetsController.listTiles(req, res))
app.get('/assets/list_tiles/:mapId', (req, res) => this.assetsController.listTilesByMap(req, res))
app.get('/assets/list_sprite_actions/:spriteId', (req, res) => this.assetsController.listSpriteActions(req, res))
// Download texture file
app.get('/textures/:type/:spriteId?/:file', (req, res) => this.texturesController.download(req, res))
// Cache routes
app.get('/cache/tiles', (req, res) => this.cacheController.tiles(req, res))
app.get('/cache/maps', (req, res) => this.cacheController.maps(req, res))
app.get('/cache/map_objects', (req, res) => this.cacheController.mapObjects(req, res))
app.get('/cache/sprites', (req, res) => this.cacheController.sprites(req, res))
app.get('/cache/character_types', (req, res) => this.cacheController.characterTypes(req, res))
app.get('/cache/character_hair', (req, res) => this.cacheController.characterHair(req, res))
}
}

View File

@ -74,7 +74,7 @@ class TeleportService {
// Notify clients
io.in(options.targetMapId).emit('map:character:join', mapCharacter)
socket.emit('map:character:teleport', {
map: map,
mapId: options.targetMapId,
characters: targetMap.getCharactersInMap()
})