From 2c2f03f20e2c8ca6a43d58a7475c1231e109bf71 Mon Sep 17 00:00:00 2001 From: duckietm Date: Fri, 17 Apr 2026 11:48:38 +0200 Subject: [PATCH 1/2] =?UTF-8?q?=F0=9F=94=A5=20Fix=20Avatar=20buddy=20they?= =?UTF-8?q?=20are=20now=20100%=20as=20habbo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/api/src/nitro/avatar/IAvatarImage.ts | 2 + packages/avatar/src/AvatarImage.ts | 5 +++ packages/avatar/src/AvatarStructure.ts | 39 +++++++++++++++++++ packages/avatar/src/cache/AvatarImageCache.ts | 2 + 4 files changed, 48 insertions(+) diff --git a/packages/api/src/nitro/avatar/IAvatarImage.ts b/packages/api/src/nitro/avatar/IAvatarImage.ts index d8d5052..72ce55e 100644 --- a/packages/api/src/nitro/avatar/IAvatarImage.ts +++ b/packages/api/src/nitro/avatar/IAvatarImage.ts @@ -1,4 +1,5 @@ import { Container, Texture } from 'pixi.js'; +import { IActiveActionData } from './actions'; import { IAvatarFigureContainer } from './IAvatarFigureContainer'; import { IAnimationLayerData, ISpriteDataContainer } from './animation'; import { IPartColor } from './structure'; @@ -18,6 +19,7 @@ export interface IAvatarImage getDirection(): number; getFigure(): IAvatarFigureContainer; getPartColor(_arg_1: string): IPartColor; + getMainAction(): IActiveActionData; isAnimating(): boolean; getCanvasOffsets(): number[]; initActionAppends(): void; diff --git a/packages/avatar/src/AvatarImage.ts b/packages/avatar/src/AvatarImage.ts index 762fbe9..27b17e4 100644 --- a/packages/avatar/src/AvatarImage.ts +++ b/packages/avatar/src/AvatarImage.ts @@ -158,6 +158,11 @@ export class AvatarImage implements IAvatarImage, IAvatarEffectListener return this._canvasOffsets; } + public getMainAction(): IActiveActionData + { + return this._mainAction; + } + public getLayerData(k: ISpriteDataContainer): IAnimationLayerData { return this._structure.getBodyPartData(k.animation.id, this._frameCounter, k.id); diff --git a/packages/avatar/src/AvatarStructure.ts b/packages/avatar/src/AvatarStructure.ts index d3fff55..024cbf8 100644 --- a/packages/avatar/src/AvatarStructure.ts +++ b/packages/avatar/src/AvatarStructure.ts @@ -366,6 +366,9 @@ export class AvatarStructure const visiblePartTypes = this._geometry.getParts(geometryType, bodyPartId, direction, activePartTypes, avatar); const figurePartTypeIds = figureContainer.getPartTypeIds(); + const mainAction = avatar?.getMainAction?.(); + const isSittingPosture = (mainAction?.definition?.assetPartDefinition === 'sit') + || (action.definition.assetPartDefinition === 'sit'); for(const figurePartType of figurePartTypeIds) { @@ -390,8 +393,44 @@ export class AvatarStructure { removes = removes.concat(figurePartSet.hiddenLayers); + let petHasVisibleSit = false; + + if(isSittingPosture && figurePartType === 'pt') + { + for(const fp of figurePartSet.parts) + { + if(fp.type === 'pt') + { + for(const dir of ['0', '2']) + { + const assetName = 'h_sit_pt_' + fp.id + '_' + dir + '_0'; + const testAsset = this._renderManager.getAssetByName(assetName); + + if(testAsset && testAsset.width > 1 && testAsset.height > 1 && testAsset.source === assetName) + { + const stdName = 'h_std_pt_' + fp.id + '_' + dir + '_0'; + const stdAsset = this._renderManager.getAssetByName(stdName); + + if(!stdAsset || stdAsset.source !== assetName) + { + petHasVisibleSit = true; + break; + } + } + } + + break; + } + } + } + for(const figurePart of figurePartSet.parts) { + if(isSittingPosture && figurePartType === 'pt') + { + if(petHasVisibleSit && figurePart.type !== 'pt') continue; + if(!petHasVisibleSit) continue; + } if(visiblePartTypes.indexOf(figurePart.type) > -1) { if(animationAction) diff --git a/packages/avatar/src/cache/AvatarImageCache.ts b/packages/avatar/src/cache/AvatarImageCache.ts index a2d457e..30c2dc1 100644 --- a/packages/avatar/src/cache/AvatarImageCache.ts +++ b/packages/avatar/src/cache/AvatarImageCache.ts @@ -139,6 +139,8 @@ export class AvatarImageCache if((((this._geometryType === GeometryType.SITTING) && (k === GeometryType.VERTICAL)) || ((this._geometryType === GeometryType.VERTICAL) && (k === GeometryType.SITTING)) || ((this._geometryType === GeometryType.SNOWWARS_HORIZONTAL) && (k = GeometryType.SNOWWARS_HORIZONTAL)))) { + this.disposeInactiveActions(0); + this._geometryType = k; this._canvas = null; this._defaultAction = (k === GeometryType.HORIZONTAL) ? 'lay' : 'std'; From bc6bd8764d85e07a27be8472392276ed2a51e6d4 Mon Sep 17 00:00:00 2001 From: duckietm Date: Fri, 17 Apr 2026 13:53:07 +0200 Subject: [PATCH 2/2] =?UTF-8?q?=F0=9F=86=99=20Fix=20Catalog=20Editor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../outgoing/catalog/CatalogAdminCreateOfferComposer.ts | 4 ++-- .../outgoing/catalog/CatalogAdminSaveOfferComposer.ts | 4 ++-- .../messages/parser/catalog/CatalogPageMessageOfferData.ts | 7 +++++++ 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/packages/communication/src/messages/outgoing/catalog/CatalogAdminCreateOfferComposer.ts b/packages/communication/src/messages/outgoing/catalog/CatalogAdminCreateOfferComposer.ts index 5bbd2ef..f964b6f 100644 --- a/packages/communication/src/messages/outgoing/catalog/CatalogAdminCreateOfferComposer.ts +++ b/packages/communication/src/messages/outgoing/catalog/CatalogAdminCreateOfferComposer.ts @@ -4,9 +4,9 @@ export class CatalogAdminCreateOfferComposer implements IMessageComposer; - constructor(pageId: number, itemId: number, catalogName: string, costCredits: number, costPoints: number, pointsType: number, amount: number, clubOnly: number, extradata: string, haveOffer: boolean, offerIdGroup: number, limitedStack: number, orderNumber: number, catalogMode: string = 'NORMAL') + constructor(pageId: number, itemIds: string, catalogName: string, costCredits: number, costPoints: number, pointsType: number, amount: number, clubOnly: number, extradata: string, haveOffer: boolean, offerIdGroup: number, limitedStack: number, orderNumber: number, catalogMode: string = 'NORMAL') { - this._data = [ pageId, itemId, catalogName, costCredits, costPoints, pointsType, amount, clubOnly, extradata, haveOffer, offerIdGroup, limitedStack, orderNumber, catalogMode ]; + this._data = [ pageId, itemIds, catalogName, costCredits, costPoints, pointsType, amount, clubOnly, extradata, haveOffer, offerIdGroup, limitedStack, orderNumber, catalogMode ]; } dispose(): void diff --git a/packages/communication/src/messages/outgoing/catalog/CatalogAdminSaveOfferComposer.ts b/packages/communication/src/messages/outgoing/catalog/CatalogAdminSaveOfferComposer.ts index 7b399a9..521ac32 100644 --- a/packages/communication/src/messages/outgoing/catalog/CatalogAdminSaveOfferComposer.ts +++ b/packages/communication/src/messages/outgoing/catalog/CatalogAdminSaveOfferComposer.ts @@ -4,9 +4,9 @@ export class CatalogAdminSaveOfferComposer implements IMessageComposer; - constructor(offerId: number, pageId: number, itemId: number, catalogName: string, costCredits: number, costPoints: number, pointsType: number, amount: number, clubOnly: number, extradata: string, haveOffer: boolean, offerIdGroup: number, limitedStack: number, orderNumber: number, catalogMode: string = 'NORMAL') + constructor(offerId: number, pageId: number, itemIds: string, catalogName: string, costCredits: number, costPoints: number, pointsType: number, amount: number, clubOnly: number, extradata: string, haveOffer: boolean, offerIdGroup: number, limitedStack: number, orderNumber: number, catalogMode: string = 'NORMAL') { - this._data = [ offerId, pageId, itemId, catalogName, costCredits, costPoints, pointsType, amount, clubOnly, extradata, haveOffer, offerIdGroup, limitedStack, orderNumber, catalogMode ]; + this._data = [ offerId, pageId, itemIds, catalogName, costCredits, costPoints, pointsType, amount, clubOnly, extradata, haveOffer, offerIdGroup, limitedStack, orderNumber, catalogMode ]; } dispose(): void diff --git a/packages/communication/src/messages/parser/catalog/CatalogPageMessageOfferData.ts b/packages/communication/src/messages/parser/catalog/CatalogPageMessageOfferData.ts index 301fa3d..c16e5c9 100644 --- a/packages/communication/src/messages/parser/catalog/CatalogPageMessageOfferData.ts +++ b/packages/communication/src/messages/parser/catalog/CatalogPageMessageOfferData.ts @@ -14,6 +14,7 @@ export class CatalogPageMessageOfferData private _bundlePurchaseAllowed: boolean; private _isPet: boolean; private _previewImage: string; + private _itemIds: string; private _products: CatalogPageMessageProductData[]; constructor(wrapper: IMessageDataWrapper) @@ -41,6 +42,7 @@ export class CatalogPageMessageOfferData this._bundlePurchaseAllowed = wrapper.readBoolean(); this._isPet = wrapper.readBoolean(); this._previewImage = wrapper.readString(); + this._itemIds = wrapper.readString(); } public get offerId(): number @@ -102,4 +104,9 @@ export class CatalogPageMessageOfferData { return this._products; } + + public get itemIds(): string + { + return this._itemIds; + } }