381 Commits

Author SHA1 Message Date
DuckieTM 84d46b74dc Merge pull request #107 from simoleo89/chore/dep-audit-fixes
chore(deps): clear audit advisories (vite/ws/js-yaml — dev deps)
2026-06-18 12:30:42 +02:00
simoleo89 47bbb39085 chore(deps): bump vite/vitest/jsdom/eslint to clear audit advisories
yarn audit flagged 6 dev-only transitive vulnerabilities: vite <8.0.16 (direct + via vitest), ws <8.21.0 (via jsdom), js-yaml <4.2.0 (via eslint). Upgrading the direct dev deps pulls the patched transitives (vite 8.0.16, ws 8.21.0, js-yaml 4.2.0). yarn audit now reports 0 vulnerabilities. tests 150/150, build green.
2026-06-17 21:54:42 +02:00
DuckieTM 9790827bf9 Merge pull request #106 from simoleo89/feat/earnings-center-dev
feat(earnings): Earnings Center packets (9308-9310 / 9407-9408)
2026-06-17 10:03:59 +02:00
simoleo89 80df492753 feat(earnings): add Earnings Center packets (9308-9310 / 9407-9408)
Client-side counterpart to the emulator earnings contract
(emulatore/docs/earnings-packet-contract.md). Outgoing: RequestEarningsCenter /
ClaimEarningsReward(categoryKey) / ClaimAllEarningsRewards. Incoming:
EarningsCenter + EarningsClaimResult sharing one entry/reward shape. Registered
in NitroMessages + barrel chain (incoming/outgoing/parser).
2026-06-15 22:28:17 +02:00
DuckieTM b8bc7135c2 Merge pull request #105 from simoleo89/docs/claude-md-packet-registration
docs(CLAUDE): outgoing-composer registration + audit both packet maps
2026-06-15 07:27:25 +02:00
DuckieTM 494beb7d13 Merge pull request #104 from simoleo89/fix/furnidata-merge-refresh
fix(session): refresh furni surfaces on live furnidata merge
2026-06-15 07:26:52 +02:00
DuckieTM 2ca3cadfe9 Merge pull request #103 from simoleo89/fix/userprofile-totalbadges
fix(communication): read trailing totalBadges int in UserProfileParser
2026-06-15 07:26:27 +02:00
DuckieTM 7a351144d4 Merge pull request #102 from simoleo89/fix/roomsession-snapshot-invalidate
fix(session): invalidate RoomSession snapshot on room-data/permission changes
2026-06-15 07:26:11 +02:00
DuckieTM 80e6fa0cac Merge pull request #101 from simoleo89/fix/prefix-packet-registrations
fix(communication): register prefix packets (incoming + outgoing)
2026-06-15 07:25:45 +02:00
simoleo89 51c8d0468e docs(CLAUDE): note outgoing-composer registration + audit both _events/_composers
Captures the session learning behind the dead Prefixes panel: NitroMessages has
two maps (_events for incoming, _composers for outgoing); a feature needs both
directions registered, and an unregistered composer silently drops the packet
("Unknown Composer", getComposerId === -1). Audit both maps when a panel is dead.
2026-06-14 13:42:48 +02:00
simoleo89 b954ddcd79 fix(session): refresh furni surfaces on live furnidata merge
mergeFurnitureDataFromUrl dispatched SESSION_DATA_UPDATED, which only drives the
userData snapshot (useUserDataSnapshot) — and it was dispatched here WITHOUT
invalidateUserDataSnapshot(), so the snapshot reference never changed and
consumers bailed out: a no-op. The catalog / inventory / infostand furni name &
description surfaces listen to the window event `nitro-localization-updated` (the
same signal applyFurnidataDelta emits), which the merge never fired — so newly
merged furnidata (e.g. custom/imported.json5 on catalog open) didn't refresh
live. Dispatch `nitro-localization-updated` instead.
2026-06-13 18:17:25 +02:00
simoleo89 e1465f665a fix(communication): read trailing totalBadges int in UserProfileParser
UserProfileComposer appends getTotalBadges() as the final int of the profile
packet, but UserProfileParser returned after displayOrder and never read it, so
the _totalBadges getter always returned its flush default 0. The extended-profile
summary (UserContainerView) reads userProfile.totalBadges with a
`?? userBadges.length` fallback, but since the getter returned 0 (not undefined)
the fallback never triggered and the badge count rendered 0.

Add a 5th optional-trailing tier reading the int (bytesAvailable-guarded so older
servers that don't emit it still parse cleanly).
2026-06-13 18:17:21 +02:00
simoleo89 3ce15e5819 fix(session): invalidate RoomSession snapshot on room-data and permission changes
getActiveRoomSessionSnapshot() caches the frozen snapshot keyed on the session
reference, but RoomDataHandler (tradeMode/groupId/isGuildRoom/doorMode/allowPets)
and RoomPermissionsHandler (controllerLevel/owner) mutate those fields on the
same session object without invalidating the cache. Any consumer reading a
mutable field via useActiveRoomSessionSnapshot would get stale data and never
re-render.

Expose invalidateRoomSessionSnapshot() on IRoomHandlerListener and call it from
both handlers after they mutate the session.
2026-06-13 18:17:17 +02:00
simoleo89 2ea53af267 fix(communication): register outgoing prefix request/delete composers
RequestPrefixesComposer (REQUEST_PREFIXES=7011) and DeletePrefixComposer
(DELETE_PREFIX=7013) are used by the client's useInventoryPrefixes but were
never registered in NitroMessages, so SendMessageComposer(new RequestPrefixesComposer())
resolved to composer id -1 ("Unknown Composer") and the packet was dropped — the
Prefixes panel never even requested its list, so the incoming registrations from
the previous commit had nothing to decode. Both headers align with the emulator
(RequestUserPrefixesEvent / DeletePrefixEvent = 7011 / 7013).

Completes the previous incoming-side fix; the prefix list + delete flow now goes
out end-to-end.
2026-06-13 18:17:12 +02:00
simoleo89 0d8e52b0e0 fix(communication): register incoming prefix packets so the Prefixes panel works
UserPrefixesEvent (7001), PrefixReceivedEvent (7002) and
ActivePrefixUpdatedEvent (7003) were defined and exported but never mapped in
NitroMessages, so the client's useInventoryPrefixes listeners could never fire:
opening the Prefixes inventory tab sends RequestUserPrefixes, the emulator
replies with UserPrefixesComposer (7001) and the client had no decoder for it
(panel stayed empty); purchase (7002) and active-prefix changes (7003) likewise
didn't update live. Only the sibling USER_NICK_ICONS (7004) was registered,
which is why this went unnoticed.

Register the three incoming headers next to USER_NICK_ICONS.
2026-06-13 18:17:12 +02:00
duckietm a49c835870 🆙 Fix : classic O(n²) buffer blow-up in the message decoder — not threading 2026-06-11 13:04:35 +02:00
duckietm a1ef3aaefe 🆙 Fix multiheight 2026-06-10 15:11:41 +02:00
DuckieTM 906f0bb786 Merge pull request #97 from simoleo89/fix/handshake-uniqueid-before-sso
fix(handshake): send UniqueID before the SSO ticket
2026-06-10 06:43:12 +02:00
simoleo89 a2064e2901 fix(handshake): send UniqueID (machine fingerprint) before the SSO ticket
Arcturus' Habbo.connect() runs when the SSOTicket packet is handled and needs the machineId, which is set by the UniqueID packet. Sending the SSO ticket first made such servers reject the login (WS closed with "Bye") because the fingerprint hadn't arrived yet. Send UniqueID before the SSO ticket so the machineId is available when the server processes the login.
2026-06-09 20:53:48 +02:00
DuckieTM fa0cb9b4b1 Merge pull request #96 from duckietm/main
Sync Main to DEV
2026-06-08 07:30:22 +02:00
DuckieTM ffde77b287 Merge pull request #95 from simoleo89/feat/furnidata-detail-diagnostics
Parse furnidata detail diagnostics
2026-06-07 23:17:59 +02:00
simoleo89 6e0cfb033e feat: parse furnidata diagnostics 2026-06-07 21:21:21 +02:00
simoleo89 8b613edbeb Merge origin/main into main
Resolved NitroMessages.ts conflict: kept local import (superset of upstream
symbols) and dropped upstream's duplicate FURNITURE_DATA_RELOAD registration
(already present locally). tsgo type-check clean.
2026-06-07 11:43:58 +02:00
DuckieTM 8b6358e157 Merge pull request #94 from duckietm/Dev
Dev
2026-06-07 08:55:52 +02:00
DuckieTM 94ab2981c4 Merge pull request #93 from simoleo89/feat/furni-editor
feat(furni): live furnidata updates + Furni Editor packets (reload/edit/revert/sort/import)
2026-06-07 08:22:29 +02:00
simoleo89 4a4394d0c4 chore(deps): sync yarn.lock to package.json (pixi 8.19.0 dedup)
Dev's committed yarn.lock was stale vs package.json (the single-8.19.0
pixi dedup landed on main but not Dev), so CI's yarn install
--frozen-lockfile failed. Regenerated lockfile (Yarn 1.22.22) — verified
--frozen-lockfile passes.
2026-06-06 17:59:58 +02:00
simoleo89 b75b9d9dbe feat(furni-editor): import-text packet (10049) for Habbo furnidata fetch
Add FurniEditorImportTextComposer (outgoing 10049) + FurniEditorImportText
ResultEvent/Parser (incoming 10049: found, name, description, classname),
register both in NitroMessages and export from the furnieditor barrels.
Lets the editor pull official names/descriptions from a server-fetched
Habbo furnidata URL.
2026-06-06 17:40:08 +02:00
simoleo89 9737f7143b feat(furni-editor): add sortField/sortDir to search composer
Append optional sort field + direction to FurniEditorSearchComposer so
the server can order the full result set (not just the visible page).
Defaults id/asc keep existing callers working.
2026-06-06 17:40:08 +02:00
simoleo89 25385a0d85 feat(furnieditor): outgoing composers for furnidata update (10046) + revert (10048) 2026-06-06 17:40:08 +02:00
simoleo89 8de869786c feat(session): apply FurnitureDataReload delta + reload-hint (separate path) 2026-06-06 17:40:07 +02:00
simoleo89 6e9463e148 feat(communication): route FURNITURE_DATA_RELOAD to its event 2026-06-06 17:40:07 +02:00
simoleo89 7a77b302e1 feat(communication): FurnitureDataReload incoming event + parser (header 10047) 2026-06-06 17:40:07 +02:00
simoleo89 108a24625f feat(furni-editor): import-text packet (10049) for Habbo furnidata fetch
Add FurniEditorImportTextComposer (outgoing 10049) + FurniEditorImportText
ResultEvent/Parser (incoming 10049: found, name, description, classname),
register both in NitroMessages and export from the furnieditor barrels.
Lets the editor pull official names/descriptions from a server-fetched
Habbo furnidata URL.
2026-06-06 15:26:23 +02:00
simoleo89 7da07aa1d5 feat(furni-editor): add sortField/sortDir to search composer
Append optional sort field + direction to FurniEditorSearchComposer so
the server can order the full result set (not just the visible page).
Defaults id/asc keep existing callers working.
2026-06-06 15:08:46 +02:00
simoleo89 751da35ce4 fix(furnieditor): register furnidata update/revert composers (was Unknown Composer) 2026-06-06 13:07:53 +02:00
simoleo89 4f3e2b7ce7 feat(furnieditor): outgoing composers for furnidata update (10046) + revert (10048) 2026-06-06 02:42:17 +02:00
simoleo89 beea0a2c61 Merge remote-tracking branch 'fork/main'
# Conflicts:
#	packages/communication/src/NitroMessages.ts
2026-06-06 00:21:11 +02:00
simoleo89 6dcf63d608 chore(deps): dedupe pixi.js to single 8.19.0 in lockfile 2026-06-06 00:19:43 +02:00
simoleo89 334e8e07be Merge branch 'feat/furni-names-from-json-server'
# Conflicts:
#	packages/communication/src/NitroMessages.ts
2026-06-05 23:35:10 +02:00
DuckieTM 6627977912 Merge pull request #92 from duckietm/Dev
Dev
2026-06-05 21:19:46 +02:00
DuckieTM 6a7443b602 🆙 mask filter 2026-06-05 21:01:54 +02:00
duckietm 746e2c8289 🆙 Small alphablend fix 2026-06-05 17:22:48 +02:00
duckietm 20f6af232e 🆙 Update to Pixi.js 8.19.0 and alphablend is now fixed 2026-06-05 16:30:22 +02:00
duckietm d61a07e1e7 🆙 Fix the Admin Catalogue stuff 2026-06-05 14:25:47 +02:00
simoleo89 437bba5a88 docs: document FurnitureDataReload live furnidata pipeline 2026-06-04 22:39:41 +02:00
simoleo89 1d6c102fd6 feat(session): apply FurnitureDataReload delta + reload-hint (separate path) 2026-06-04 22:01:08 +02:00
simoleo89 dbd398ae80 feat(communication): route FURNITURE_DATA_RELOAD to its event 2026-06-04 21:54:43 +02:00
simoleo89 17957e7f54 feat(communication): FurnitureDataReload incoming event + parser (header 10047) 2026-06-04 21:50:34 +02:00
simoleo89 c0f6504d9c docs(furni): liveness implementation plan (Piece 2) 2026-06-04 21:36:15 +02:00
simoleo89 842d8407e8 docs(furni): spec — server-authoritative furni names/descriptions from JSON + live
Design for sourcing furni display names from furnidata JSON (DB keeps technical data), with a live delta-broadcast pipeline (emulator file-watch -> renderer patch -> client refresh) and a security hardening section. Cross-repo reference copy.
2026-06-04 20:13:08 +02:00