feat: rare values + fortune wheel protocol + prize editor

Composers/parsers/events for rare values + wheel (open/spin/buy/data/result/
recent-wins) + admin (get/save prizes), headers 9300-9305 / 9400-9404.
fix: figure map uses split-aware loadGamedata (raw fetch broke on tier-manifest
gamedata, silently empty avatars).
This commit is contained in:
medievalshell
2026-05-28 02:39:01 +02:00
parent 4a74fb948d
commit 87eec0563d
29 changed files with 431 additions and 17 deletions
@@ -548,4 +548,12 @@ export class OutgoingHeader
public static HOUSEKEEPING_SEND_HOTEL_ALERT = 9121;
public static HOUSEKEEPING_GET_DASHBOARD = 9122;
public static HOUSEKEEPING_LIST_ACTION_LOG = 9123;
// Custom features — IDs 9300+ reserved
public static REQUEST_RARE_VALUES = 9300;
public static WHEEL_OPEN = 9301;
public static WHEEL_SPIN = 9302;
public static WHEEL_BUY_SPIN = 9303;
public static WHEEL_ADMIN_GET_PRIZES = 9304;
public static WHEEL_ADMIN_SAVE_PRIZES = 9305;
}
@@ -22,6 +22,8 @@ export * from './groupforums';
export * from './handshake';
export * from './help';
export * from './housekeeping';
export * from './rarevalues';
export * from './wheel';
export * from './inventory';
export * from './inventory/avatareffect';
export * from './inventory/badges';
@@ -0,0 +1,7 @@
import { IMessageComposer } from '@nitrots/api';
export class RequestRareValuesComposer implements IMessageComposer<[]>
{
public getMessageArray(): [] { return []; }
public dispose(): void { return; }
}
@@ -0,0 +1 @@
export * from './RequestRareValuesComposer';
@@ -0,0 +1,7 @@
import { IMessageComposer } from '@nitrots/api';
export class WheelAdminGetPrizesComposer implements IMessageComposer<[]>
{
public getMessageArray(): [] { return []; }
public dispose(): void { return; }
}
@@ -0,0 +1,32 @@
import { IMessageComposer } from '@nitrots/api';
export interface IWheelAdminPrizeEdit
{
id: number;
type: string;
value: string;
amount: number;
pointsType: number;
weight: number;
label: string;
}
export class WheelAdminSavePrizesComposer implements IMessageComposer<(number | string)[]>
{
private _data: (number | string)[];
constructor(prizes: IWheelAdminPrizeEdit[])
{
const data: (number | string)[] = [ prizes.length ];
for(const prize of prizes)
{
data.push(prize.id, prize.type, prize.value, prize.amount, prize.pointsType, prize.weight, prize.label);
}
this._data = data;
}
public getMessageArray(): (number | string)[] { return this._data; }
public dispose(): void { return; }
}
@@ -0,0 +1,7 @@
import { IMessageComposer } from '@nitrots/api';
export class WheelBuySpinComposer implements IMessageComposer<[]>
{
public getMessageArray(): [] { return []; }
public dispose(): void { return; }
}
@@ -0,0 +1,7 @@
import { IMessageComposer } from '@nitrots/api';
export class WheelOpenComposer implements IMessageComposer<[]>
{
public getMessageArray(): [] { return []; }
public dispose(): void { return; }
}
@@ -0,0 +1,7 @@
import { IMessageComposer } from '@nitrots/api';
export class WheelSpinComposer implements IMessageComposer<[]>
{
public getMessageArray(): [] { return []; }
public dispose(): void { return; }
}
@@ -0,0 +1,5 @@
export * from './WheelOpenComposer';
export * from './WheelSpinComposer';
export * from './WheelBuySpinComposer';
export * from './WheelAdminGetPrizesComposer';
export * from './WheelAdminSavePrizesComposer';