From 238592cd72d75bd85e7a853f0ba7213bf7a59366 Mon Sep 17 00:00:00 2001 From: medievalshell Date: Thu, 28 May 2026 09:02:57 +0200 Subject: [PATCH] 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 --- packages/communication/src/NitroMessages.ts | 5 ++ .../src/messages/incoming/IncomingHeader.ts | 2 + .../src/messages/incoming/index.ts | 1 + .../soundboard/SoundboardPlayEvent.ts | 16 +++++++ .../soundboard/SoundboardSettingsEvent.ts | 16 +++++++ .../src/messages/incoming/soundboard/index.ts | 2 + .../src/messages/outgoing/OutgoingHeader.ts | 2 + .../src/messages/outgoing/index.ts | 1 + .../soundboard/SoundboardPlayComposer.ts | 14 ++++++ .../SoundboardSetEnabledComposer.ts | 14 ++++++ .../src/messages/outgoing/soundboard/index.ts | 2 + .../src/messages/parser/index.ts | 1 + .../parser/soundboard/SoundboardPlayParser.ts | 32 +++++++++++++ .../soundboard/SoundboardSettingsParser.ts | 46 +++++++++++++++++++ .../src/messages/parser/soundboard/index.ts | 2 + 15 files changed, 156 insertions(+) create mode 100644 packages/communication/src/messages/incoming/soundboard/SoundboardPlayEvent.ts create mode 100644 packages/communication/src/messages/incoming/soundboard/SoundboardSettingsEvent.ts create mode 100644 packages/communication/src/messages/incoming/soundboard/index.ts create mode 100644 packages/communication/src/messages/outgoing/soundboard/SoundboardPlayComposer.ts create mode 100644 packages/communication/src/messages/outgoing/soundboard/SoundboardSetEnabledComposer.ts create mode 100644 packages/communication/src/messages/outgoing/soundboard/index.ts create mode 100644 packages/communication/src/messages/parser/soundboard/SoundboardPlayParser.ts create mode 100644 packages/communication/src/messages/parser/soundboard/SoundboardSettingsParser.ts create mode 100644 packages/communication/src/messages/parser/soundboard/index.ts diff --git a/packages/communication/src/NitroMessages.ts b/packages/communication/src/NitroMessages.ts index 9c440a4..6e01288 100644 --- a/packages/communication/src/NitroMessages.ts +++ b/packages/communication/src/NitroMessages.ts @@ -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; @@ -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 diff --git a/packages/communication/src/messages/incoming/IncomingHeader.ts b/packages/communication/src/messages/incoming/IncomingHeader.ts index 394ae07..ca731c5 100644 --- a/packages/communication/src/messages/incoming/IncomingHeader.ts +++ b/packages/communication/src/messages/incoming/IncomingHeader.ts @@ -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; } diff --git a/packages/communication/src/messages/incoming/index.ts b/packages/communication/src/messages/incoming/index.ts index 7af2fd4..774a269 100644 --- a/packages/communication/src/messages/incoming/index.ts +++ b/packages/communication/src/messages/incoming/index.ts @@ -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'; diff --git a/packages/communication/src/messages/incoming/soundboard/SoundboardPlayEvent.ts b/packages/communication/src/messages/incoming/soundboard/SoundboardPlayEvent.ts new file mode 100644 index 0000000..33c4255 --- /dev/null +++ b/packages/communication/src/messages/incoming/soundboard/SoundboardPlayEvent.ts @@ -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; + } +} diff --git a/packages/communication/src/messages/incoming/soundboard/SoundboardSettingsEvent.ts b/packages/communication/src/messages/incoming/soundboard/SoundboardSettingsEvent.ts new file mode 100644 index 0000000..6694218 --- /dev/null +++ b/packages/communication/src/messages/incoming/soundboard/SoundboardSettingsEvent.ts @@ -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; + } +} diff --git a/packages/communication/src/messages/incoming/soundboard/index.ts b/packages/communication/src/messages/incoming/soundboard/index.ts new file mode 100644 index 0000000..1073f40 --- /dev/null +++ b/packages/communication/src/messages/incoming/soundboard/index.ts @@ -0,0 +1,2 @@ +export * from './SoundboardPlayEvent'; +export * from './SoundboardSettingsEvent'; diff --git a/packages/communication/src/messages/outgoing/OutgoingHeader.ts b/packages/communication/src/messages/outgoing/OutgoingHeader.ts index 600f63e..dbaf342 100644 --- a/packages/communication/src/messages/outgoing/OutgoingHeader.ts +++ b/packages/communication/src/messages/outgoing/OutgoingHeader.ts @@ -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; } diff --git a/packages/communication/src/messages/outgoing/index.ts b/packages/communication/src/messages/outgoing/index.ts index 3669f58..cbbc423 100644 --- a/packages/communication/src/messages/outgoing/index.ts +++ b/packages/communication/src/messages/outgoing/index.ts @@ -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'; diff --git a/packages/communication/src/messages/outgoing/soundboard/SoundboardPlayComposer.ts b/packages/communication/src/messages/outgoing/soundboard/SoundboardPlayComposer.ts new file mode 100644 index 0000000..02b0a69 --- /dev/null +++ b/packages/communication/src/messages/outgoing/soundboard/SoundboardPlayComposer.ts @@ -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; } +} diff --git a/packages/communication/src/messages/outgoing/soundboard/SoundboardSetEnabledComposer.ts b/packages/communication/src/messages/outgoing/soundboard/SoundboardSetEnabledComposer.ts new file mode 100644 index 0000000..f13bcd7 --- /dev/null +++ b/packages/communication/src/messages/outgoing/soundboard/SoundboardSetEnabledComposer.ts @@ -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; } +} diff --git a/packages/communication/src/messages/outgoing/soundboard/index.ts b/packages/communication/src/messages/outgoing/soundboard/index.ts new file mode 100644 index 0000000..232c8b8 --- /dev/null +++ b/packages/communication/src/messages/outgoing/soundboard/index.ts @@ -0,0 +1,2 @@ +export * from './SoundboardPlayComposer'; +export * from './SoundboardSetEnabledComposer'; diff --git a/packages/communication/src/messages/parser/index.ts b/packages/communication/src/messages/parser/index.ts index 5ce4f68..5567320 100644 --- a/packages/communication/src/messages/parser/index.ts +++ b/packages/communication/src/messages/parser/index.ts @@ -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'; diff --git a/packages/communication/src/messages/parser/soundboard/SoundboardPlayParser.ts b/packages/communication/src/messages/parser/soundboard/SoundboardPlayParser.ts new file mode 100644 index 0000000..0357708 --- /dev/null +++ b/packages/communication/src/messages/parser/soundboard/SoundboardPlayParser.ts @@ -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; } +} diff --git a/packages/communication/src/messages/parser/soundboard/SoundboardSettingsParser.ts b/packages/communication/src/messages/parser/soundboard/SoundboardSettingsParser.ts new file mode 100644 index 0000000..f30ecd1 --- /dev/null +++ b/packages/communication/src/messages/parser/soundboard/SoundboardSettingsParser.ts @@ -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; } +} diff --git a/packages/communication/src/messages/parser/soundboard/index.ts b/packages/communication/src/messages/parser/soundboard/index.ts new file mode 100644 index 0000000..a30881d --- /dev/null +++ b/packages/communication/src/messages/parser/soundboard/index.ts @@ -0,0 +1,2 @@ +export * from './SoundboardPlayParser'; +export * from './SoundboardSettingsParser';