Sync renderer safety push

This commit is contained in:
Lorenzune
2026-04-21 08:57:35 +02:00
parent db3e8394ea
commit 7bf552824f
53 changed files with 1182 additions and 36 deletions
+77
View File
@@ -8,6 +8,13 @@ export class RoomUserData implements IRoomUserData
private _sex: string = '';
private _figure: string = '';
private _custom: string = '';
private _nickIcon: string = '';
private _prefixText: string = '';
private _prefixColor: string = '';
private _prefixIcon: string = '';
private _prefixEffect: string = '';
private _prefixFont: string = '';
private _displayOrder: string = 'icon-prefix-name';
private _activityPoints: number;
private _background: number;
private _stand: number;
@@ -286,6 +293,76 @@ export class RoomUserData implements IRoomUserData
return this._isModerator;
}
public get nickIcon(): string
{
return this._nickIcon;
}
public set nickIcon(k: string)
{
this._nickIcon = k;
}
public get prefixText(): string
{
return this._prefixText;
}
public set prefixText(k: string)
{
this._prefixText = k;
}
public get prefixColor(): string
{
return this._prefixColor;
}
public set prefixColor(k: string)
{
this._prefixColor = k;
}
public get prefixIcon(): string
{
return this._prefixIcon;
}
public set prefixIcon(k: string)
{
this._prefixIcon = k;
}
public get prefixEffect(): string
{
return this._prefixEffect;
}
public set prefixEffect(k: string)
{
this._prefixEffect = k;
}
public get prefixFont(): string
{
return this._prefixFont;
}
public set prefixFont(k: string)
{
this._prefixFont = k;
}
public get displayOrder(): string
{
return this._displayOrder;
}
public set displayOrder(k: string)
{
this._displayOrder = k;
}
public set isModerator(k: boolean)
{
this._isModerator = k;
+98 -6
View File
@@ -1,6 +1,7 @@
import { IFurnitureData, IGroupInformationManager, IMessageComposer, IMessageEvent, IProductData, ISessionDataManager, NoobnessLevelEnum, SecurityLevel } from '@nitrots/api';
import { AccountSafetyLockStatusChangeMessageEvent, AccountSafetyLockStatusChangeParser, AvailabilityStatusMessageEvent, ChangeUserNameResultMessageEvent, EmailStatusResultEvent, FigureUpdateEvent, GetCommunication, GetUserTagsComposer, InClientLinkEvent, MysteryBoxKeysEvent, NoobnessLevelMessageEvent, PetRespectComposer, PetScratchFailedMessageEvent, RoomReadyMessageEvent, RoomUnitChatComposer, UserInfoEvent, UserNameChangeMessageEvent, UserPermissionsEvent, UserRespectComposer, UserTagsMessageEvent } from '@nitrots/communication';
import { GetConfiguration } from '@nitrots/configuration';
import { GetLocalizationManager } from '@nitrots/localization';
import { GetEventDispatcher, MysteryBoxKeysUpdateEvent, NitroSettingsEvent, SessionDataPreferencesEvent, UserNameUpdateEvent } from '@nitrots/events';
import { CreateLinkEvent, HabboWebTools } from '@nitrots/utils';
import { Texture } from 'pixi.js';
@@ -42,6 +43,8 @@ export class SessionDataManager implements ISessionDataManager
private _floorItems: Map<number, IFurnitureData> = new Map();
private _wallItems: Map<number, IFurnitureData> = new Map();
private _floorItemOverrides: Map<string, Partial<IFurnitureData>> = new Map();
private _wallItemOverrides: Map<string, Partial<IFurnitureData>> = new Map();
private _products: Map<string, IProductData> = new Map();
private _furnitureData: FurnitureDataLoader = new FurnitureDataLoader(this._floorItems, this._wallItems);
private _productData: ProductDataLoader = new ProductDataLoader(this._products);
@@ -130,7 +133,38 @@ export class SessionDataManager implements ISessionDataManager
public getAllFurnitureData(): IFurnitureData[]
{
return [ ...Array.from(this._floorItems.values()), ...Array.from(this._wallItems.values()) ];
return [
...Array.from(this._floorItems.values()).map(item => this.applyFurnitureOverrides(item, this._floorItemOverrides)),
...Array.from(this._wallItems.values()).map(item => this.applyFurnitureOverrides(item, this._wallItemOverrides))
];
}
public async applyFurnitureDataOverrides(url: string): Promise<void>
{
if(!url || !url.length)
{
this.clearFurnitureDataOverrides();
return;
}
const response = await fetch(url);
if(response.status !== 200) throw new Error(`Unable to load ${ url }`);
const data = await response.json();
this._floorItemOverrides = this.parseFurnitureOverrides(data?.roomitemtypes?.furnitype || []);
this._wallItemOverrides = this.parseFurnitureOverrides(data?.wallitemtypes?.furnitype || []);
this.refreshFurnitureLocalizations();
}
public clearFurnitureDataOverrides(): void
{
this._floorItemOverrides.clear();
this._wallItemOverrides.clear();
this.refreshFurnitureLocalizations();
}
private onUserInfoEvent(event: UserInfoEvent): void
@@ -290,7 +324,7 @@ export class SessionDataManager implements ISessionDataManager
if(!existing) return null;
return existing;
return this.applyFurnitureOverrides(existing, this._floorItemOverrides);
}
public getFloorItemDataByName(name: string): IFurnitureData
@@ -301,7 +335,7 @@ export class SessionDataManager implements ISessionDataManager
{
if(!item || (item.className !== name)) continue;
return item;
return this.applyFurnitureOverrides(item, this._floorItemOverrides);
}
return null;
@@ -313,7 +347,7 @@ export class SessionDataManager implements ISessionDataManager
if(!existing) return null;
return existing;
return this.applyFurnitureOverrides(existing, this._wallItemOverrides);
}
public getWallItemDataByName(name: string): IFurnitureData
@@ -324,7 +358,7 @@ export class SessionDataManager implements ISessionDataManager
{
if(!item || (item.className !== name)) continue;
return item;
return this.applyFurnitureOverrides(item, this._wallItemOverrides);
}
return null;
@@ -335,6 +369,64 @@ export class SessionDataManager implements ISessionDataManager
return this._products.get(type);
}
private parseFurnitureOverrides(items: any[]): Map<string, Partial<IFurnitureData>>
{
const overrides = new Map<string, Partial<IFurnitureData>>();
for(const item of items)
{
if(!item?.classname) continue;
const className = ((item.classname as string).split('*')[0] || '').trim();
if(!className.length) continue;
overrides.set(className, {
name: item.name || '',
description: item.description || ''
});
}
return overrides;
}
private applyFurnitureOverrides(item: IFurnitureData, overrides: Map<string, Partial<IFurnitureData>>): IFurnitureData
{
if(!item) return null;
const override = overrides.get(item.className);
if(!override) return item;
const clonedItem = Object.assign(Object.create(Object.getPrototypeOf(item)), item) as any;
if(override.name !== undefined) clonedItem._localizedName = override.name;
if(override.description !== undefined) clonedItem._description = override.description;
return clonedItem as IFurnitureData;
}
private refreshFurnitureLocalizations(): void
{
const localizationManager = GetLocalizationManager();
for(const item of this._floorItems.values())
{
const resolvedItem = this.applyFurnitureOverrides(item, this._floorItemOverrides);
localizationManager.setValue(('roomItem.name.' + item.id), resolvedItem.name);
localizationManager.setValue(('roomItem.desc.' + item.id), resolvedItem.description);
}
for(const item of this._wallItems.values())
{
const resolvedItem = this.applyFurnitureOverrides(item, this._wallItemOverrides);
localizationManager.setValue(('wallItem.name.' + item.id), resolvedItem.name);
localizationManager.setValue(('wallItem.desc.' + item.id), resolvedItem.description);
}
}
public getBadgeUrl(name: string): string
{
return this._badgeImageManager.getBadgeUrl(name);
@@ -544,4 +636,4 @@ export class SessionDataManager implements ISessionDataManager
{
return this._tags;
}
}
}
+24
View File
@@ -144,6 +144,30 @@ export class UserDataManager implements IUserDataManager
userData.custom = custom;
}
public updateNickIcon(roomIndex: number, nickIcon: string): void
{
const userData = this.getUserDataByIndex(roomIndex);
if(!userData) return;
userData.nickIcon = nickIcon;
}
public updateCustomization(roomIndex: number, nickIcon: string, prefixText: string, prefixColor: string, prefixIcon: string, prefixEffect: string, prefixFont: string, displayOrder: string): void
{
const userData = this.getUserDataByIndex(roomIndex);
if(!userData) return;
userData.nickIcon = nickIcon;
userData.prefixText = prefixText;
userData.prefixColor = prefixColor;
userData.prefixIcon = prefixIcon;
userData.prefixEffect = prefixEffect;
userData.prefixFont = prefixFont;
userData.displayOrder = displayOrder;
}
public updateBackground(roomIndex: number, background: number, stand: number, overlay: number): void
{
@@ -37,7 +37,7 @@ export class RoomChatHandler extends BaseHandler
if(event instanceof RoomUnitChatShoutEvent) chatType = RoomSessionChatEvent.CHAT_TYPE_SHOUT;
else if(event instanceof RoomUnitChatWhisperEvent) chatType = RoomSessionChatEvent.CHAT_TYPE_WHISPER;
const chatEvent = new RoomSessionChatEvent(RoomSessionChatEvent.CHAT_EVENT, session, parser.roomIndex, parser.message, chatType, parser.bubble, parser.chatColours, null, -1, parser.prefixText, parser.prefixColor, parser.prefixIcon, parser.prefixEffect);
const chatEvent = new RoomSessionChatEvent(RoomSessionChatEvent.CHAT_EVENT, session, parser.roomIndex, parser.message, chatType, parser.bubble, parser.chatColours, null, -1, parser.prefixText, parser.prefixColor, parser.prefixIcon, parser.prefixEffect, parser.prefixFont, parser.nickIcon, parser.displayOrder);
GetEventDispatcher().dispatchEvent(chatEvent);
}
@@ -54,7 +54,7 @@ export class RoomChatHandler extends BaseHandler
if(!parser) return;
GetEventDispatcher().dispatchEvent(new RoomSessionChatEvent(RoomSessionChatEvent.CHAT_EVENT, session, parser.giverUserId, '', RoomSessionChatEvent.CHAT_TYPE_HAND_ITEM_RECEIVED, SystemChatStyleEnum.GENERIC, [], null, parser.handItemType));
GetEventDispatcher().dispatchEvent(new RoomSessionChatEvent(RoomSessionChatEvent.CHAT_EVENT, session, parser.giverUserId, '', RoomSessionChatEvent.CHAT_TYPE_HAND_ITEM_RECEIVED, SystemChatStyleEnum.GENERIC, '', null, parser.handItemType));
}
private onRespectReceivedEvent(event: RespectReceivedEvent): void
@@ -136,7 +136,7 @@ export class RoomChatHandler extends BaseHandler
break;
}
GetEventDispatcher().dispatchEvent(new RoomSessionChatEvent(RoomSessionChatEvent.CHAT_EVENT, session, petData.roomIndex, '', chatType, SystemChatStyleEnum.GENERIC, [], null, userRoomIndex));
GetEventDispatcher().dispatchEvent(new RoomSessionChatEvent(RoomSessionChatEvent.CHAT_EVENT, session, petData.roomIndex, '', chatType, SystemChatStyleEnum.GENERIC, '', null, userRoomIndex));
}
private onFloodControlEvent(event: FloodControlEvent): void
@@ -55,6 +55,13 @@ export class RoomUsersHandler extends BaseHandler
userData.name = user.name;
userData.custom = user.custom;
userData.nickIcon = user.nickIcon;
userData.prefixText = user.prefixText;
userData.prefixColor = user.prefixColor;
userData.prefixIcon = user.prefixIcon;
userData.prefixEffect = user.prefixEffect;
userData.prefixFont = user.prefixFont;
userData.displayOrder = user.displayOrder;
userData.background = user.background;
userData.stand = user.stand;
userData.overlay = user.overlay;
@@ -104,11 +111,12 @@ export class RoomUsersHandler extends BaseHandler
session.userDataManager.updateFigure(parser.unitId, parser.figure, parser.gender, false, false);
session.userDataManager.updateMotto(parser.unitId, parser.motto);
session.userDataManager.updateCustomization(parser.unitId, parser.nickIcon || '', parser.prefixText || '', parser.prefixColor || '', parser.prefixIcon || '', parser.prefixEffect || '', parser.prefixFont || '', parser.displayOrder || 'icon-prefix-name');
session.userDataManager.updateAchievementScore(parser.unitId, parser.achievementScore);
session.userDataManager.updateBackground(parser.unitId, parser.backgroundId, parser.standId, parser.overlayId);
GetEventDispatcher().dispatchEvent(new RoomSessionUserFigureUpdateEvent(session, parser.unitId, parser.figure, parser.gender, parser.motto, parser.achievementScore, parser.backgroundId, parser.standId, parser.overlayId));
GetEventDispatcher().dispatchEvent(new RoomSessionUserFigureUpdateEvent(session, parser.unitId, parser.figure, parser.gender, parser.motto, parser.achievementScore, parser.backgroundId, parser.standId, parser.overlayId, parser.nickIcon || '', parser.prefixText || '', parser.prefixColor || '', parser.prefixIcon || '', parser.prefixEffect || '', parser.prefixFont || '', parser.displayOrder || 'icon-prefix-name'));
}