diff --git a/packages/api/src/nitro/session/ISessionDataManager.ts b/packages/api/src/nitro/session/ISessionDataManager.ts index 3c4ba6f..ed02885 100644 --- a/packages/api/src/nitro/session/ISessionDataManager.ts +++ b/packages/api/src/nitro/session/ISessionDataManager.ts @@ -9,6 +9,7 @@ export interface ISessionDataManager { init(): Promise; getAllFurnitureData(): IFurnitureData[]; + mergeFurnitureDataFromUrl(url: string): Promise; applyFurnitureDataOverrides(url: string): Promise; clearFurnitureDataOverrides(): void; getFloorItemData(id: number): IFurnitureData; diff --git a/packages/session/src/SessionDataManager.ts b/packages/session/src/SessionDataManager.ts index 64e62fa..f78c7bb 100644 --- a/packages/session/src/SessionDataManager.ts +++ b/packages/session/src/SessionDataManager.ts @@ -224,6 +224,21 @@ export class SessionDataManager implements ISessionDataManager ]; } + // Mergia a runtime un chunk furnidata (es. custom/imported.json5) nelle Map + // esistenti, SENZA reload del client. Ritorna gli entry aggiunti cosi il + // chiamante puo' aggiornare anche il RoomContentLoader. Fa comparire i furni + // appena importati nel catalogo in tempo reale. + public async mergeFurnitureDataFromUrl(url: string): Promise + { + if(!url || !url.length) return []; + + const added = await this._furnitureData.mergeFromUrl(url); + + if(added && added.length) GetEventDispatcher().dispatchEvent(new NitroEvent(NitroEventType.SESSION_DATA_UPDATED)); + + return added; + } + public async applyFurnitureDataOverrides(url: string): Promise { if(!url || !url.length) diff --git a/packages/session/src/furniture/FurnitureDataLoader.ts b/packages/session/src/furniture/FurnitureDataLoader.ts index 2ad8857..e4b5281 100644 --- a/packages/session/src/furniture/FurnitureDataLoader.ts +++ b/packages/session/src/furniture/FurnitureDataLoader.ts @@ -37,9 +37,38 @@ export class FurnitureDataLoader if(responseData.wallitemtypes) this.parseWallItems(responseData.wallitemtypes); } - private parseFloorItems(data: any): void + // Ri-carica un singolo chunk furnidata (es. custom/imported.json5) e + // mergia i suoi entry nelle Map esistenti. Ritorna gli entry aggiunti/aggiornati + // cosi il chiamante puo' aggiornare anche il RoomContentLoader senza reload. + public async mergeFromUrl(url: string): Promise { - if(!data || !data.furnitype) return; + if(!url || !url.length) return []; + + let responseData: any; + + try + { + responseData = await loadGamedata(url); + } + catch(err) + { + return []; + } + + const added: IFurnitureData[] = []; + + if(responseData.roomitemtypes) added.push(...this.parseFloorItems(responseData.roomitemtypes)); + + if(responseData.wallitemtypes) added.push(...this.parseWallItems(responseData.wallitemtypes)); + + return added; + } + + private parseFloorItems(data: any): IFurnitureData[] + { + const added: IFurnitureData[] = []; + + if(!data || !data.furnitype) return added; for(const furniture of data.furnitype) { @@ -76,13 +105,19 @@ export class FurnitureDataLoader this._floorItems.set(furnitureData.id, furnitureData); + added.push(furnitureData); + this.updateLocalizations(furnitureData); } + + return added; } - private parseWallItems(data: any): void + private parseWallItems(data: any): IFurnitureData[] { - if(!data || !data.furnitype) return; + const added: IFurnitureData[] = []; + + if(!data || !data.furnitype) return added; for(const furniture of data.furnitype) { @@ -93,8 +128,12 @@ export class FurnitureDataLoader this._wallItems.set(furnitureData.id, furnitureData); + added.push(furnitureData); + this.updateLocalizations(furnitureData); } + + return added; } private updateLocalizations(furniture: FurnitureData): void