feat: soundboard packets

Add the soundboard message protocol mirroring the Arcturus side:
- incoming SoundboardSettings (enabled flag + sound list) and
  SoundboardPlay (soundId, url, username) events + parsers
- outgoing SoundboardPlay (soundId) and SoundboardSetEnabled composers
- header ids 9405/9406 (incoming), 9306/9307 (outgoing)
- NitroMessages registration + barrel exports
This commit is contained in:
medievalshell
2026-05-28 09:02:57 +02:00
parent 87eec0563d
commit 238592cd72
15 changed files with 156 additions and 0 deletions
@@ -11,6 +11,7 @@ import { HousekeepingActionLogEvent, HousekeepingActionResultEvent, Housekeeping
import { RareValuesEvent, RequestRareValuesComposer } from './messages';
import { WheelBuySpinComposer, WheelDataEvent, WheelOpenComposer, WheelRecentWinsEvent, WheelResultEvent, WheelSpinComposer } from './messages';
import { WheelAdminGetPrizesComposer, WheelAdminPrizesEvent, WheelAdminSavePrizesComposer } from './messages';
import { SoundboardPlayEvent, SoundboardSettingsEvent, SoundboardPlayComposer, SoundboardSetEnabledComposer } from './messages';
export class NitroMessages implements IMessageConfiguration
{
private _events: Map<number, Function>;
@@ -524,6 +525,8 @@ export class NitroMessages implements IMessageConfiguration
this._events.set(IncomingHeader.WHEEL_RESULT, WheelResultEvent);
this._events.set(IncomingHeader.WHEEL_RECENT_WINS, WheelRecentWinsEvent);
this._events.set(IncomingHeader.WHEEL_ADMIN_PRIZES, WheelAdminPrizesEvent);
this._events.set(IncomingHeader.SOUNDBOARD_SETTINGS, SoundboardSettingsEvent);
this._events.set(IncomingHeader.SOUNDBOARD_PLAY, SoundboardPlayEvent);
this._events.set(IncomingHeader.WIRED_REWARD, WiredRewardResultMessageEvent);
this._events.set(IncomingHeader.WIRED_SAVE, WiredSaveSuccessEvent);
this._events.set(IncomingHeader.WIRED_ERROR, WiredValidationErrorEvent);
@@ -1308,6 +1311,8 @@ export class NitroMessages implements IMessageConfiguration
this._composers.set(OutgoingHeader.WHEEL_BUY_SPIN, WheelBuySpinComposer);
this._composers.set(OutgoingHeader.WHEEL_ADMIN_GET_PRIZES, WheelAdminGetPrizesComposer);
this._composers.set(OutgoingHeader.WHEEL_ADMIN_SAVE_PRIZES, WheelAdminSavePrizesComposer);
this._composers.set(OutgoingHeader.SOUNDBOARD_PLAY, SoundboardPlayComposer);
this._composers.set(OutgoingHeader.SOUNDBOARD_SET_ENABLED, SoundboardSetEnabledComposer);
}
public get events(): Map<number, Function>
@@ -518,4 +518,6 @@ export class IncomingHeader
public static WHEEL_RESULT = 9402;
public static WHEEL_RECENT_WINS = 9403;
public static WHEEL_ADMIN_PRIZES = 9404;
public static SOUNDBOARD_SETTINGS = 9405;
public static SOUNDBOARD_PLAY = 9406;
}
@@ -26,6 +26,7 @@ export * from './handshake';
export * from './help';
export * from './housekeeping';
export * from './rarevalues';
export * from './soundboard';
export * from './wheel';
export * from './inventory';
export * from './inventory/achievements';
@@ -0,0 +1,16 @@
import { IMessageEvent } from '@nitrots/api';
import { MessageEvent } from '@nitrots/events';
import { SoundboardPlayParser } from '../../parser';
export class SoundboardPlayEvent extends MessageEvent implements IMessageEvent
{
constructor(callBack: Function)
{
super(callBack, SoundboardPlayParser);
}
public getParser(): SoundboardPlayParser
{
return this.parser as SoundboardPlayParser;
}
}
@@ -0,0 +1,16 @@
import { IMessageEvent } from '@nitrots/api';
import { MessageEvent } from '@nitrots/events';
import { SoundboardSettingsParser } from '../../parser';
export class SoundboardSettingsEvent extends MessageEvent implements IMessageEvent
{
constructor(callBack: Function)
{
super(callBack, SoundboardSettingsParser);
}
public getParser(): SoundboardSettingsParser
{
return this.parser as SoundboardSettingsParser;
}
}
@@ -0,0 +1,2 @@
export * from './SoundboardPlayEvent';
export * from './SoundboardSettingsEvent';
@@ -556,4 +556,6 @@ export class OutgoingHeader
public static WHEEL_BUY_SPIN = 9303;
public static WHEEL_ADMIN_GET_PRIZES = 9304;
public static WHEEL_ADMIN_SAVE_PRIZES = 9305;
public static SOUNDBOARD_PLAY = 9306;
public static SOUNDBOARD_SET_ENABLED = 9307;
}
@@ -23,6 +23,7 @@ export * from './handshake';
export * from './help';
export * from './housekeeping';
export * from './rarevalues';
export * from './soundboard';
export * from './wheel';
export * from './inventory';
export * from './inventory/avatareffect';
@@ -0,0 +1,14 @@
import { IMessageComposer } from '@nitrots/api';
export class SoundboardPlayComposer implements IMessageComposer<[ number ]>
{
private _data: [ number ];
constructor(soundId: number)
{
this._data = [ soundId ];
}
public getMessageArray(): [ number ] { return this._data; }
public dispose(): void { return; }
}
@@ -0,0 +1,14 @@
import { IMessageComposer } from '@nitrots/api';
export class SoundboardSetEnabledComposer implements IMessageComposer<[ number ]>
{
private _data: [ number ];
constructor(enabled: boolean)
{
this._data = [ enabled ? 1 : 0 ];
}
public getMessageArray(): [ number ] { return this._data; }
public dispose(): void { return; }
}
@@ -0,0 +1,2 @@
export * from './SoundboardPlayComposer';
export * from './SoundboardSetEnabledComposer';
@@ -26,6 +26,7 @@ export * from './handshake';
export * from './help';
export * from './housekeeping';
export * from './rarevalues';
export * from './soundboard';
export * from './wheel';
export * from './inventory';
export * from './inventory/achievements';
@@ -0,0 +1,32 @@
import { IMessageDataWrapper, IMessageParser } from '@nitrots/api';
export class SoundboardPlayParser implements IMessageParser
{
private _soundId: number = 0;
private _url: string = '';
private _username: string = '';
public flush(): boolean
{
this._soundId = 0;
this._url = '';
this._username = '';
return true;
}
public parse(wrapper: IMessageDataWrapper): boolean
{
if(!wrapper) return false;
this._soundId = wrapper.readInt();
this._url = wrapper.readString();
this._username = wrapper.readString();
return true;
}
public get soundId(): number { return this._soundId; }
public get url(): string { return this._url; }
public get username(): string { return this._username; }
}
@@ -0,0 +1,46 @@
import { IMessageDataWrapper, IMessageParser } from '@nitrots/api';
export interface ISoundboardSound
{
id: number;
name: string;
url: string;
}
export class SoundboardSettingsParser implements IMessageParser
{
private _enabled: boolean = false;
private _sounds: ISoundboardSound[] = [];
public flush(): boolean
{
this._enabled = false;
this._sounds = [];
return true;
}
public parse(wrapper: IMessageDataWrapper): boolean
{
if(!wrapper) return false;
this._enabled = wrapper.readBoolean();
const count = wrapper.readInt();
this._sounds = [];
for(let i = 0; i < count; i++)
{
this._sounds.push({
id: wrapper.readInt(),
name: wrapper.readString(),
url: wrapper.readString()
});
}
return true;
}
public get enabled(): boolean { return this._enabled; }
public get sounds(): ISoundboardSound[] { return this._sounds; }
}
@@ -0,0 +1,2 @@
export * from './SoundboardPlayParser';
export * from './SoundboardSettingsParser';