Commit Graph

63 Commits

Author SHA1 Message Date
medievalshell 238592cd72 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
2026-05-28 09:02:57 +02:00
medievalshell 87eec0563d 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).
2026-05-28 02:39:01 +02:00
duckietm b7688f9d2b 🆕 Added Pickup furni to the floorplan 2026-05-27 09:41:18 +02:00
simoleo89 5dd5b26bbe feat(communication): housekeeping hotel alert + dashboard + audit log
Outgoing 9127-9129: send-hotel-alert (message string), get-dashboard
(no args), list-action-log (limit int).

Incoming 9206 HousekeepingDashboardEvent + 9207 ActionLogEvent with
matching parsers and data classes. Dashboard is a flat one-shot
parse — no count prefix; action log uses the standard "count + N
entries" list pattern.

Closes the HK packet surface — yarn compile:fast clean.
2026-05-24 16:28:52 +02:00
simoleo89 386bf79ddc feat(communication): housekeeping economy — 4 composers
OutgoingHeader 9117-9120: give-credits, give-currency (generic across
duckets/diamonds/seasonal via a currencyType int), grant-item,
set-hc-subscription. All four ride the existing
HousekeepingActionResultEvent — no new parser needed.

`yarn compile:fast` clean.
2026-05-24 16:26:07 +02:00
simoleo89 597cd2402f feat(communication): housekeeping rooms domain — 7 composers + 2 events
* Outgoing 9110-9116: find-room-by-id, search-rooms (exact|prefix),
  room-state (open|close toggle), mute-room, kick-all-from-room,
  transfer-room-ownership, delete-room.

* Incoming 9202 HousekeepingRoomDetailEvent + 9203 RoomListEvent.

* HousekeepingRoomData parser data class with the 11 IHousekeepingRoom
  fields. Single-room and list events share the same data class via
  composition.

`yarn compile:fast` clean.
2026-05-24 16:26:07 +02:00
simoleo89 c6c6cfe04b feat(communication): housekeeping set-rank + trade-lock + reset-password composers
Three composers closing out the users-domain HK actions:
* OutgoingHeader 9107 HousekeepingSetUserRankComposer (userId, rankId)
* OutgoingHeader 9108 HousekeepingTradeLockUserComposer (userId, hours, reason)
* OutgoingHeader 9109 HousekeepingResetUserPasswordComposer (userId)

All three ride the existing HousekeepingActionResultEvent for the ack.
2026-05-24 16:26:07 +02:00
simoleo89 fbe8a02a72 feat(communication): housekeeping force-disconnect-user composer
OutgoingHeader 9106 HousekeepingForceDisconnectUserComposer carrying
(userId, reason). Reuses HousekeepingActionResultEvent for the ack.
2026-05-24 16:26:06 +02:00
simoleo89 370b1fc100 feat(communication): housekeeping mute-user + kick-user composers
OutgoingHeader 9104 HousekeepingMuteUserComposer — (userId, reason,
minutes). 9105 HousekeepingKickUserComposer — (userId, reason). Both
ride the existing HousekeepingActionResultEvent for the ack, so no
new parser is needed.

vitest 138/138, `yarn compile:fast` clean.
2026-05-24 16:26:06 +02:00
simoleo89 c9d8f32e62 feat(communication): housekeeping unban-user composer
HousekeepingUnbanUserComposer (OutgoingHeader 9103) carrying a single
userId int. Response side reuses HousekeepingActionResultEvent — no
new parser needed because the ack shape is action-agnostic.

`yarn compile:fast` clean.
2026-05-24 16:26:06 +02:00
simoleo89 31598b8883 feat(communication): housekeeping ban-user + generic action-result
* HousekeepingBanUserComposer (OutgoingHeader 9102): (userId,
  reason, hours).

* HousekeepingActionResultEvent + Parser (IncomingHeader 9201):
  generic ack carrying (actionKey, ok, actionId, message). Same
  parser will back mute / kick / give-credits / room-close / etc.
  callers — adding a new HK action only needs a new outgoing
  composer plus the right ACTION_KEY constant on the server side.

vitest 138/138, `yarn compile:fast` clean.
2026-05-24 16:26:06 +02:00
simoleo89 3113baf559 feat(communication): housekeeping find-user-by-id composer
OutgoingHeader.HOUSEKEEPING_FIND_USER_BY_ID = 9101 with a one-int
payload. The response side reuses HousekeepingUserDetailEvent (no new
parser) — find-by-id and find-by-name converge on the same shape
because the server has nothing different to say about a user found
via numeric id vs. via username lookup.

vitest 138/138, `yarn compile:fast` clean.
2026-05-24 16:26:06 +02:00
simoleo89 ec7e122e74 feat(communication): add housekeeping find-user-by-name packet pair
TS counterparts to Arcturus' new HK packet pair. Adds
HousekeepingFindUserByNameComposer (OutgoingHeader 9100) and
HousekeepingUserDetailEvent (IncomingHeader 9200) with a parser that
wraps an optional HousekeepingUserDetailData. The data class follows
the flat optional-trailing-field pattern (isMuted / isTradeLocked
read under bytesAvailable guards) so the renderer stays compatible
with a server that hasn't surfaced those manager APIs offline yet.

The parser exposes `found: boolean` and `user: HousekeepingUserDetailData | null`
so a callsite that gets a "user not found" reply can branch without
having to read into an unpopulated data object — the composer writes
`appendBoolean(false)` and stops, the parser sees the false and leaves
`user` null.

Headers 9100..9199 / 9200..9299 reserved for the rest of the HK
packet surface. Composer + event registered in NitroMessages alongside
the existing YouTube-room overrides. `yarn compile:fast` clean, vitest
138/138 green.
2026-05-24 16:26:06 +02:00
duckietm 081e06b208 🆙 Catalog Editor, now you can also edit the text1 2026-05-22 11:05:45 +02:00
simoleo89 4be09c6c62 Merge remote-tracking branch 'origin/Dev' into feat/react19-event-bus
# Conflicts:
#	packages/session/src/UserDataManager.ts
2026-05-19 20:33:54 +02:00
duckietm 4b7d04d0b8 🆕 Infostand Borders 2026-05-19 16:56:25 +02:00
simoleo89 ef6c661058 Renderer: surface allowUnderpass on RoomSettingsData + composer
Arcturus' RoomSettingsComposer appends an extra int at the end of the
payload — room.isAllowUnderpass() ? 1 : 0 — and RoomSettingsSaveEvent
optionally reads back a boolean at the end (if bytesAvailable > 0).
The renderer side never modeled this trailing field, so the client
couldn't surface or persist it.

- RoomSettingsData: add _allowUnderpass field + getter/setter +
  propagation through the .from() copy.
- RoomSettingsDataParser: read one trailing int after the moderation
  settings, guarded by 'if(wrapper.bytesAvailable)' so older servers
  that don't emit it keep parsing cleanly.
- SaveRoomSettingsComposer: optional trailing allowUnderpass arg. The
  server's optional-read guard tolerates 24-arg or 25-arg payloads, so
  callers that don't care about the field still send the legacy shape.

Cross-repo reference points:
- Arcturus emit side: Emulator/src/main/java/com/eu/habbo/messages/
  outgoing/rooms/RoomSettingsComposer.java line 55.
- Arcturus read side: Emulator/src/main/java/com/eu/habbo/messages/
  incoming/rooms/RoomSettingsSaveEvent.java lines 133-135.

Net client tsgo error count: 3 -> 0 on the NavigatorRoomSettings cluster.
2026-05-11 21:46:36 +02:00
simoleo89 b42f989e28 RoomEnterComposer: optional spawnX/spawnY for reconnect
Arcturus' RequestRoomLoadEvent reads the two extra ints only when
the inbound packet has 8+ bytes remaining after roomId+password, so
the renderer can send 2-arg or 4-arg payloads against the same
header. The client already calls 'new RoomEnterComposer(roomId,
password, spawnX, spawnY)' in two places inside RoomSession /
RoomSessionManager (the reconnect/respawn flow) — the composer
signature is what was lagging behind.

Server-side reference:
Arcturus-Morningstar-Extended/Emulator/src/main/java/com/eu/habbo/
messages/incoming/rooms/RequestRoomLoadEvent.java
2026-05-11 21:09:51 +02:00
simoleo89 0fc38a1c71 Fix self-referential ConstructorParameters in two Wired composers
WiredRoomSettingsRequestComposer and WiredUserVariablesRequestComposer
declared 'implements IMessageComposer<ConstructorParameters<typeof Self>>'
but neither defines a constructor, so ConstructorParameters resolved
to 'any[]' and getMessageArray() returning [] (any[]) failed the
narrower base-type signature () => [].

Both composers send zero payload; type as IMessageComposer<[]>
directly + annotate the return type.
2026-05-11 21:09:37 +02:00
Lorenzune 5fc4564467 Merge remote-tracking branch 'duckie/main' into merge-duckie-main-2026-05-06
# Conflicts:
#	packages/communication/src/messages/parser/room/unit/RoomUnitInfoParser.ts
#	packages/communication/src/messages/parser/user/data/UserProfileParser.ts
#	packages/events/src/session/RoomSessionUserFigureUpdateEvent.ts
#	packages/session/src/handler/RoomUsersHandler.ts
2026-05-06 04:23:13 +02:00
duckietm 2f7b80e894 🆕 Card Background 2026-05-04 08:44:40 +02:00
Lorenzune 7fa8eff751 Merge latest duckie renderer main 2026-04-21 11:53:28 +02:00
Lorenzune c37c7005fc Fix prefix composer imports after duckie merge 2026-04-21 11:23:38 +02:00
Lorenzune 1dede2c098 Merge remote-tracking branch 'duckie-temp/main' into duckie-merge-2026-04-21
# Conflicts:
#	packages/communication/src/NitroMessages.ts
#	packages/communication/src/messages/incoming/IncomingHeader.ts
#	packages/communication/src/messages/outgoing/OutgoingHeader.ts
2026-04-21 11:20:02 +02:00
Lorenzune 7bf552824f Sync renderer safety push 2026-04-21 08:57:35 +02:00
duckietm 078bba0780 🆙 Make have_offer read from emu 2026-04-17 14:24:15 +02:00
duckietm 4b598fc717 Revert "Merge pull request #48 from simoleo89/feature/catalog-admin-composers"
This reverts commit 67c8dd42cd, reversing
changes made to bc6bd8764d.
2026-04-17 14:03:47 +02:00
DuckieTM 67c8dd42cd Merge pull request #48 from simoleo89/feature/catalog-admin-composers
Feature/catalog admin composers
2026-04-17 13:56:46 +02:00
duckietm bc6bd8764d 🆙 Fix Catalog Editor 2026-04-17 13:53:07 +02:00
duckietm bbedf2e5fe 🆙 Merge Dev to Prod 2026-04-14 11:57:23 +02:00
Life 1e3d6a335c Merge branch 'Dev' into feature/catalog-admin-composers 2026-04-13 17:51:16 +02:00
DuckieTM d2a36940d5 Merge branch 'Dev' into feat/wired-fixes-apr08 2026-04-13 17:01:56 +02:00
Life 04d172c735 feat: add catalog admin composers for page images and icon
- CatalogAdminSavePageImagesComposer (header 10060): pageId, headerImage, teaserImage
- CatalogAdminSavePageIconComposer (header 10061): pageId, iconId
- Registered in OutgoingHeader, catalog index, and NitroMessages
- Server handler required in Arcturus to process these packets
2026-04-10 22:22:36 +02:00
duckietm 37f817a098 🆙 Added Youtube Brtoadcast 2026-04-10 11:22:45 +02:00
duckietm a92f2f0603 🆙 Youtube 2026-04-09 15:36:43 +02:00
duckietm 85d3422e86 🆙 Renderer Logic Youtube Broadcast 2026-04-09 11:51:32 +02:00
Lorenzune fd40a74396 feat: add builders club communication support 2026-04-07 14:40:51 +02:00
Lorenzune c75f1b1258 chore: checkpoint current work 2026-04-03 05:22:24 +02:00
Lorenzune 190f02ebbe feat: add wired monitor and variable protocol support 2026-04-02 04:44:04 +02:00
DuckieTM 50b9e0a334 Merge pull request #32 from simoleo89/furnieditor
feat: FurniEditor WebSocket packets (10040-10045)
2026-03-30 11:13:09 +02:00
DuckieTM e6e9dc46db 🆕 Groups Forum 2026-03-29 15:00:47 +02:00
DuckieTM 1fcd10589d Start the forum framework 2026-03-28 08:38:48 +01:00
Life 594b9c28a0 feat: FurniEditor WebSocket packets (10040-10045) — composers, parsers, events 2026-03-27 19:54:21 +01:00
duckietm 87d825746c 🆕 Added New catalogue page 2026-03-23 15:00:55 +01:00
duckietm 531ea1c33d Revert "Merge pull request #16 from simoleo89/furnisettingeditor-pr"
This reverts commit 2e90578976, reversing
changes made to 749ec76177.
2026-03-23 11:39:27 +01:00
Life 35f55d5add feat(furni-editor): add WebSocket packets for furniture editor
Add composers, parsers, and events for the Furni Editor feature
communicating via WebSocket with the Arcturus emulator.

Packet handlers:
- Search (10040/10041): search furniture by name, ID, or type
- Detail (10042/10043): get/receive full furniture details by sprite ID
- Update (10044): save furniture property changes
- Create (10045): create new furniture items
- Delete (10046): delete furniture items
- Interactions (10047/10048): list available interaction types
- Result (10049): confirmation response for save/delete/create

New files:
- 7 outgoing composers (Search, Detail, BySprite, Interactions, Update, Create, Delete)
- 4 incoming events (Search, Detail, Interactions, Result)
- 4 parsers (Search, Detail, Interactions, Result)
- Updated IncomingHeader, OutgoingHeader, NitroMessages, and barrel exports
2026-03-22 18:04:27 +01:00
Lorenzune 10b3d64ee0 Merge remote-tracking branch 'origin/main'
# Conflicts:
#	packages/communication/src/NitroMessages.ts
2026-03-21 14:49:08 +01:00
simoleo89 68af013c60 feat: custom prefix system protocol layer
Prefix parsers, composers and events:
- UserPrefixesParser, PrefixReceivedParser, ActivePrefixUpdatedParser
- PurchasePrefixComposer, SetActivePrefixComposer, DeletePrefixComposer, RequestPrefixesComposer
- RoomUnitChatParser reads prefixText/Color/Icon/Effect from chat packets
- RoomSessionChatEvent carries prefix data to client
- RoomChatHandler passes prefix fields through event chain
2026-03-20 17:22:50 +01:00
duckietm 5aef7a3de2 🆕 Disconnection handler, when you got disconnected you automatic go back to the room 2026-03-19 15:04:47 +01:00
Lorenzune 00743a3865 feat(room): add single-click user packet for wired trigger
- add ClickUserMessageComposer and outgoing header wiring\n- send the user click packet from RoomObjectEventHandler for avatar single clicks\n- support wf_trg_click_user in the linked Nitro UI/emulator flow
2026-03-18 17:38:56 +01:00