Skip to content

AIR 13 parity: settings, chrome, room, inventory, chat, infostands, moderation - #476

Merged
SimoLeoLife merged 43 commits into
Devfrom
fix/air13-ux-parity
Sep 11, 2026
Merged

SimoLeoLife merged 43 commits into
Devfrom
fix/air13-ux-parity

Conversation

@SimoLeoLife

@SimoLeoLife SimoLeoLife commented Sep 6, 2026

Copy link
Copy Markdown
Collaborator

Parity pass of the client against the decompiled Habbo AIR 13 build (the 2026-09 package), outside the wired editor. Seven commits, one per area, each with its tests.

What changes

  • Settings. The official per-user chat preferences (free flow or line by line, bubble width, scroll speed), the friend-online notification preference (everyone / relationships only / nobody) and the switch that silences wired whispers. All stored with the other client preferences; no server packet yet.
  • Chrome. The Ubuntu font name pointed at the condensed file, so every window read condensed where the official uses Ubuntu regular 12. Skinned tooltips drawn from the official tooltip skin replace browser titles; every card gets the official frame 3 and the classic scrollbar unless it opts out; the reconnect overlay uses the disconnected.* texts in the shape of the official alert.
  • Room. :flip keeps a state and comes back; the camera and the thumbnail camera refuse only a zoom below one or a flipped room, as the official does; one zoom table up to 16x, animated, Ctrl+wheel toward the cursor, the plain wheel turns a furni being placed; Shift+wheel pans the floor plan.
  • Inventory and catalog. Type filters like the official furni view; marketplace offer details with price history and volume; average, lowest and suggested price when selling; own offers with status filter, search, recall-all and mark-as-seen; ten trade slots with each side's item count and credit value; the purse shows the delta it received; the catalog resizes vertically; trophies get previous/next model; LTD raffle line; targeted offer sends to credits when short.
  • Chat and help. The official player commands (:visit, :roomid, :cam, :fs, :ignore, :unignore, :mutepets, :moonwalk, :habnam, :hidemouse, :wf, :var, :inspect, :link); ignore from the chat history; a report ignores and unfriends the reported user except for topic 21, asks for a reason on unlawful activity and refuses a description too short; bubbles keep off the desktop margins, cap their height, glide into place, treat highlight links as hints, and stack line by line when that mode is chosen; the new-user chat reminder and the commands help button; friend-list feedback when full or after a request.
  • Infostands and room tools. Badges rank and real name on the user infostand; wired inspect, rent/extend/buy-out, place more on the furni infostand; kick, move, rotate on the pet infostand; jump, "more" and the minimized own-avatar menu; open profile and the full ambassador mute set; achievements and camera on the room tools, browser-like room history, persisted collapsed state; the room-enter panel with clickable tags; the navigator hover menu on the toolbar; users chooser type filter; ranking line, group icons and embed code in the navigator.
  • Moderation and notifications. Housekeeping links on the sanction counters, 48-hour fade of the last sanction, message templates, issue browser with auto-pick, release-all and the official columns, the "my reports" status window, and a notification feed docked above the toolbar with a stream, per-category settings and a draggable folded tab. The mentions window and its toolbar icon are gone: the feed lists the server's mentions as their own category, with the unread badge, mark-all-as-read and the go-to-room / delete actions on each row. The navigator hover menu is drawn like the official toolbar_hover layout, centred over the icon with a tail.

Notes for review

  • The room flip and the wheel rotation read two renderer methods that arrive with the companion renderer PR (fix/room-flip-zoom-api, Room flip state and preview rotation for the client's AIR 13 parity Octane-Renderer#213). Until it is published the client reads them as optional and answers "not flipped" / "nothing to rotate", so this branch builds against the current renderer.
  • Text keys new to this branch fall back to English in the code; the gamedata files carry them in six languages on the hotel side.
  • Frame 3 and the classic scrollbar are now the default for every card: windows with fixed heights lose the height of the title strip; explicit frameStyle={0} / classicScrollbar={false} keep the old chrome.

Second pass (2026-09-07 evening)

  • Help. The Habbo Way booklet, its quiz (server ids through 1296/3720 when the emulator answers, static five-question session otherwise) and the welcome tour popup that requests a guide, as GuideHelpManager does.
  • Games. Games-left counter with the HC upsell and the leave-game block countdown, the five how-to-play pages in place of the tile grid, and the snowwar_ending results screen with team columns, hits and K.O.'s, spotlights, rematch countdown and skill stars, from what the packets carry today.
  • Room. Badge rarity tiers with the official glow and tag, the Habbo Home link on the infostand, the enforce-category modal answering the server's RoomCategorySelectionEnforcement, per-friend tokens on the friend bar.
  • Settings. Chat mode, bubble width, scroll speed, friend-online and wired-whisper preferences go through the official composers and come back in the user-settings event (server side: feat(users): server-side chat preferences and the personal word filter Polaris-Emulator#665); the personal word filter window (memenu_chat_settings layout, composers 145/68/1996).
  • Chrome. The navigator hover menu's visited and frequent rows open the navigator views like ToolbarHoverCtrl; the fixed-size windows (camera editor and checkout, group members and information, habbicon hub) get the 6px the default frame takes.
  • Texts: 492 keys added to the hotel gamedata in six languages.

The new composers and parsers live in the renderer companion PR; this branch types green once that one is published.

Third pass (2026-09-07 night)

  • Rentables. The rentable space widget with the official error codes, rented-to and expiry; the rent confirmation for extend and buy-out; the catalog info_rentables page.
  • Quests. The quests window with campaigns, accept and cancel, the in-room tracker, the completed popup; daily tasks with claim and refresh countdown; the reward track with free and premium prizes, filters, levels and the premium confirmation; three ME-menu entries.
  • Avatar editor. The hot looks tab, as the official editor has it (no catalog page: the official has none).
  • Groups. Block and unblock members, the blocked list for managers.
  • Room. Badge tiers and owner counts read from the badges packet; snowwar per-player stats and skill levels from the ending and lobby packets; the quiz lockout notice.
  • Texts: 172 more keys in six languages (664 in total tonight).

Server side: duckietm/Polaris-Emulator#665. Renderer: duckietm/Octane-Renderer#213 (this branch types green once it is published).

Fourth pass (2026-09-08): the client-only gaps of the AIR 13 audit

Eight areas, one commit each, all against packets the renderer and the emulator already have:

  • Chat and room. The official commands with their gates (:kick, :mute, :drop, ambassador alert and classification, :avisit, :uc, :wiredreset, :playtest, :ping with its bubble, :fps, :showstats, :lang, :news/:mail, the full :ejectall, :hidemouse tile cursor, :screenshot named after the room), the stack height walk variant and multi-walk, the helpBubble link protocol, the camera perk gate, the room tools collapse seeded from uiFlags.
  • Inventory. Enter/Escape search, rent state on tiles with extend, buy-out and go-to-room, rarity plaque, tradeable and recyclable counters, the trade item_popup, badge normal/achievements and rarity filters with the badge_details card.
  • Notifications. The missing producers (room messages, recycler, sound machine, friend offline), the achievement style, bubble ids that dedupe and retract, stay/display time and the stop/resume toggle, feed rows with decoration and action button, the epic popup, the safety-lock notice, the navigator blocked alert, the CanCreateRoom flow with the HC promo, the illustrated cfh.created.
  • Navigator and hotel view. Legacy search codes and the back-stack, room tag chips; the promo article, avatar image, room hopper, generic and community goal VS-mode widgets, moving background objects.
  • Catalog, marketplace, trading. info_pets2/3, teaser links, the bundle extra info, credit_redeem, vip_benefits; the marketplace buy confirmation with average price and offer count, combine-uniques; nine trade slots, the account and credits warnings, the minimised strip, the name-scam warning.
  • Social. Group HC popup and join/edit failure alerts, forum reports, unread polling and jump to first unread, help room reports, the unlawful-activity fields, the safety booklet, pending ticket popups, the profile block button, the logout confirmation, the NUX offers.
  • Guardians and talent. The chat-review jury (accept, vote, results) and the reporter feedback; the talent track panorama, task dialog, level-up popup and citizenship welcome.
  • Polls, mod tools, furni. The poll offer and question dialogs with NPS, the ticket default-sanction flow with the topic dropdown and next-issue auto-pick, the ecotron and placeholder widgets, the Niko trophy.

Text keys of this pass follow in the gamedata files. What still needs renderer or emulator packets is listed in docs/air13_gap_report_2026-09-08.md §4.2 and §4.3.


Room competition window

The competition packets have been in the renderer all along and nothing on the client listened, so a competition stayed invisible even once the hotel served it (the server side is Polaris #676).

This is the official strip the client drops at the top of the room: caption and info line on the left, one button with a line above it on the right, and — when that is what is missing — the furniture the room still lacks, each with a tick or a cross. It opens on room entry in submit shape for the owner of a room that could enter, and in vote shape for a visitor of a room taking part; it walks the official three steps (accept the rules, submit, confirm) and offers the vote only to somebody eligible with votes left.

The texts are the official keys, looked up the way the official window does it: the key with the result code first, the key without it second, the element hidden when neither exists. Their markup is dropped rather than shown, since the whole info line is the link. The don't-show-me-today switch is remembered per viewer.

One new text key, roomcompetition.noroom.info; everything else is an official key that already exists in the gamedata.

Tests: the whole client suite, 341 files and 1816 tests, green.


Resolution furni: the three windows

The hotel answers the resolution furni properly since Polaris #676 and nothing on the client listened, so the furni stayed silent.

The window has the three shapes the official has: the picker while the furni carries no promise, with the owner's achievements in a grid and the one they are looking at beside it; the progress, with the badge of the level they promised, a bar, the clock and the re-select button; and the kept-promise card. Re-selecting resets and then asks the furni again, which is what the official window does, so the picker comes straight back.

An achievement that cannot be promised is greyed out and says why, with the two official reasons. The renderer already sends the open packet when the furni is clicked, so nothing here has to know about the click.

Every text is an official resolution.* key the gamedata already carries: no new keys.

Tests: the whole client suite, 343 files and 1827 tests, green.

SimoLeoLife and others added 7 commits September 6, 2026 22:13
…ne and wired-whisper preferences


The official client keeps three chat preferences per user (free flow or
line by line, bubble width, scroll speed), a preference for who may
trigger the friend-online bubble (everyone, relationships only, nobody)
and a switch that silences wired whispers. All five live in local
storage with the other client preferences; the renderer has no
composer for them yet, so nothing reaches the server.
…cial frame and scrollbar by default


The Ubuntu family name pointed at the condensed file, so every window
read condensed where the official client uses Ubuntu regular 12. The
tooltips now draw the official blue bubble instead of the browser
title, every card gets frame 3 and the classic scrollbar unless it opts
out, and the reconnect overlay speaks through the disconnected.* keys
in the shape of the official alert.
…odel


The flip command sent a scale of -1 that the renderer stored as is, so
the room turned and never turned back. The renderer now keeps a flip
state; the camera and the thumbnail camera refuse only a zoom below one
or a flipped room, as the official does; the zoom has one table up to
16x, animates in log2 space, zooms toward the cursor with Ctrl and the
wheel, and the plain wheel turns a furni being placed. The floor plan
pans with Shift and the wheel.
…en trade slots, purse deltas


The inventory filters by type the way the official furni view does;
the marketplace shows an offer's price history and volume, the
make-offer form its average, lowest and suggested prices, the own
offers a status filter, search, recall-all and mark-as-seen; the trade
has ten slots with each side's item count and credit value; the purse
shows the change it just received; the catalog resizes vertically, the
trophies page has previous and next model, the confirmation shows the
LTD raffle line and the targeted offer offers credits when short.
…t follow-up, bubble rules


Fourteen player commands the official client has (visit, roomid, cam,
fullscreen, ignore, unignore, mutepets, moonwalk, habnam, hidemouse,
wired menu shortcuts, link) join the chat input; the chat history
offers to ignore a speaker and springs back to the latest line; a
report ignores and unfriends the reported user except for topic 21,
asks for a reason on unlawful activity and refuses a description too
short; bubbles keep off the desktop margins, cap their height, glide
into place, treat highlight links as hints, and stack line by line when
that chat mode is chosen; new users get the chat reminder and a help
button; the friend list says when it is full or a request went out.
…s from the official client


The user infostand shows the badges rank and the real name; the furni
infostand inspects wired furni, rents, extends, buys out and places
more; the pet infostand kicks, moves and rotates; the own avatar menu
has jump, a more submenu and the minimized mode, the others' menu opens
the profile and the full ambassador mute set; the room tools gain
achievements and camera, a browser-like history and a persisted
collapsed state; a panel with the room's tags slides out on entering;
the toolbar's navigator icon lists home, favourites, visited and
frequent rooms on hover; the users chooser filters by type; the room
info shows the ranking and the popup the group icons; the share dialog
gives an embed code.
…, moderation tool, notification feed


The user info links its sanction counters to housekeeping and fades
the last sanction from red to black over 48 hours; the room and
message tools offer canned templates; the issue browser picks the next
priority issue, releases all and shows score, category, time, source,
target and message count; a moderation tool bans, warns, gives coins
and furni; the help index opens the report status window; the
notification centre keeps a feed with a stream and per-category
settings, and knows the friend-offline, room-messages and sound-machine
bubbles.
simoleo89 and others added 15 commits September 6, 2026 22:18
… message shape

The bubble height cap read a per-message text size this branch does
not carry, and the zoom anchor met the pixi Point the published engine
still types; the size comes from the stored preference and the anchor
is cast until the companion renderer change widens the type.
The published engine still types the anchor as a pixi Point while
reading only x and y; the companion renderer change widens it to a
plain point, so the cast leaves with it.
Ban, warn, coins and furni belong to housekeeping; the client keeps the
official mod tools only.
…elow the purse, movable tab

The mentions window and its toolbar icon go away: the feed lists the
server's mentions as their own category, with the unread badge, mark
all as read, and the go-to-room and delete actions on each row, in the
Notifications sections and in the Stream in arrival order. The
mentions/ links open the feed instead.

The feed panel docked at top-14 and covered the purse menus, so their
buttons stopped answering while it was open; it now hangs above the
toolbar at the bottom right. The folded tab can be dragged up and down
the edge and remembers where it was left.

The navigator hover menu is drawn like the official toolbar_hover
layout: centred over the icon, a tail pointing at it, 238px rows in the
official greys with Ubuntu bold 12.
The hover wrapper was a zero-height box centred in the slot, so the
icon's absolute offsets measured from the middle and the icon sat low
and clipped. The wrapper now fills the slot.
Centred on the icon, half of it left the screen: the navigator sits by
the left edge. The tail still points at the icon's centre.
Half a second before it folds, as the official timer; the gap between
the icon and the bubble counts as part of it; with a room list unfolded
it waits two seconds and closes at once on a click elsewhere.
…mention

The purse settings menu portals to the body, hangs under the purse and
closes on a click elsewhere, so nothing stacked on the right side can
cover it again. The folded feed tab flashes when a mention arrives, as
the old toolbar icon lit up. The mentions row of the old window goes
with the window.
…vigator views

As ToolbarHoverCtrl.as does with showHistoryRooms / showFrequentRooms;
the chevron keeps unfolding the inline list from the local history.
The default frame keeps a 35px title strip and 2px of padding inside
the card, so the camera editor, the group members and information
windows and the habbicon hub were 6px short and 4px narrow for their
pixel layouts, and the camera checkout still subtracted the old 31px
header. The cards grow by that much; the layouts stay untouched.
The booklet pages through the official do/don't pairs from the texts;
the quiz asks the server for the question ids and grades through it,
falling back to a static five-question session while the emulator has
no handler; the tour popup arms thirty seconds after a new user enters
a room and requests a guide, as GuideHelpManager does.
…al ending screen

The tile shows the free games left and the HC upsell, and blocks with
the countdown after leaving a game; the instructions replace the tile
grid in place with the five animated pages; the results screen follows
snowwar_ending with the team columns, hits and K.O.'s, the spotlights,
the rematch countdown and the skill stars, all drawn from what the
packets carry today.
…through the server

The official composers (2506 chat preferences, 818 online indicator,
1226 wired menu settings) carry each change, and the values come back
in the user-settings event on login; local storage stays as the
fallback until the packet arrives.
…gory dialog and friend bar tokens

Badges glow and carry the rarity tag by the official tiers; the
infostand's home icon opens the user's Habbo Home page; the navigator
answers the server's category selection enforcement with the official
modal and reloads the own-rooms list after a settings save; the
friend bar shows the per-friend notification tokens.
The official memenu_chat_settings layout: the list the server keeps
for the user, add and remove through the official composers (145, 68,
1996) and results (3883, 3333), reached from the purse menu and the
settings menu when user.custom.filter.enabled allows it. The masking
itself stays server-side, as in the official client.
The rentable space widget (rent, rented-to with expiry, cancel for the
owner or staff, the official error codes), the rent confirmation
window for extend and buy-out through 2518/35 and 1071, and the
catalog's info_rentables page.
…e ending packet, quiz lockout notice

The badges packet now carries owner count and rarity tier per slot,
so the infostand and the profile read them instead of the leaderboard
cache; the snowwar ending and lobby packets carry the per-player
stats and skill levels the results screen draws; the quiz tells the
user when the server refuses a retry.
…ck members

Hot looks as the official avatar editor has them: a tab between legs
and misc listing the looks the server sends, click to load one. Group
managers block a member with the kick confirmation and see the blocked
list, blocked rows offer unblock (2864), as the official group members
window does.
…rd track

The official quest flow: campaigns with their current quest, accept,
cancel, the in-room tracker with the check animation, the completed
popup with the reward; the daily tasks window with progress, claim
and the refresh countdown; the reward track with free and premium
prizes, task filters, levels and the premium confirmation. Three
entries in the ME menu with unseen counters. Packets on the ids the
renderer already shared plus the custom 9450-9452 where the official
ids were taken.
…p, safety lock notice and the HC room-limit promo

Room messages posted, recycler finished, sound machine and friend
offline bubbles; the achievement style with its category link; bubble
ids that dedupe and retract, stay and display time, the stop/resume
toggle; feed rows with decoration image and action button; the epic
popup frame, the safety-lock notice, the navigator blocked alert, the
CanCreateRoom flow with the club promo, the illustrated cfh.created.
… and recyclable counters, badge filters and details

Enter runs the search and Escape clears it; rented furni show the
rent state overlay, the expiry line and extend, buy-out and go-to-room
following FurniView; rarity plaque and counters with the official
tooltips; the trade offer grids get the item_popup hover card; the
badge tab gets the normal/achievements and rarity filters and the
badge_details card.
…(talent): the talent track, task dialog, level-up popup and citizenship welcome

The jury flow of GuideSessionController: accept with countdown, the
anonymised incident log with the three votes, waiting for voters and
results with the verdict; the reporter feedback window. The talent
track panorama with the level panes, task cards, reward boxes and the
progress meter, the task progress dialog with its actions, the level
up popup and the citizenship welcome.
…eholder widgets, the Niko trophy

The poll offer, question dialog with radio, checkbox and text answers
and the NPS follow-up, cancel confirmation and thanks; mod tickets get
the CFH topic dropdown, the default sanction label and close, the
next-issue auto-pick and the caller/reported messages; the ecotron box
card, the placeholder window and the Niko trophy view.
…and safety booklet, profile block, logout confirm, NUX dialogs

Groups: the club-required popup and the official join/edit failure
alerts, accept-all pending, thread and message reports, unread forum
polling with the me-menu badge, jump to the first unread message,
the official three list modes. Help: room reports, the unlawful
activity fields, the safety booklet with its dimmed backdrop, the
pending ticket popups. Profile block button, view-once friend bar
tokens dropped on collapse, logout confirmation under the purse, the
name change link in the avatar editor, the NUX offers.
…tags; feat(hotel-view): the official widget types

The legacy search types and codes resolve to what the emulator
serves, so the existing group, owner and tag links work; the back
button walks the search history like SearchContextHistoryManager; the
room info shows up to four tag chips. The hotel view renders the
official promo article, avatar image, room hopper, generic elements
and community goal VS-mode widgets, plus the moving background
objects.
…edit redeem, VIP benefits; marketplace confirmation; trading warnings, minimised strip, name-scam check

The info_pets2/3 layouts, the monkey and niko teaser regions, the
bundle promo bar with the discount rows, the credit_redeem widget
and the vip_benefits window; the marketplace combine-uniques option
and the official buy confirmation with average price and offer count;
trading with nine slots, the account-disabled and credits warnings,
the minimised strip on the other tabs and the name-scam warning that
compares the trader's name with the room and the friend list.
… stack height multi-walk, UI help bubbles, camera perk gate

Kick, mute, drop, ambassador alert and classification, avisit, uc,
wiredreset, playtest, ping with the chat bubble, fps and showstats,
lang, news and mail, the gates on furni and cam, the full ejectall
line, hidemouse with the tile cursor, screenshot named after the
room; the walk-height variant and multi-walk of the stack height
widget; the helpBubble link protocol with its anchors; the camera
perk on the room tools, the toolbar and the widget; the room tools
collapse seeded from uiFlags. Plus the shared registry lines of the
evening's eight areas.
The competition packets have been in the renderer all along and nothing on the
client listened, so a competition was invisible even once the hotel served it.

This is the official strip the client drops at the top of the room: the caption
and its info line on the left, one button with a line above it on the right, and
the furniture the room still lacks listed with a tick or a cross when that is
what is missing. It opens on room entry in submit shape for the owner of a room
that could enter and in vote shape for a visitor of a room taking part, walks the
official three steps (accept the rules, submit, confirm) and offers the vote only
to somebody eligible with votes left.

The texts are the official keys, looked up the way the official window does it:
the key with the result code first, the key without it second, and the element
hidden when neither exists. Their markup is dropped rather than shown, since the
whole info line is the link. The don't-show-me-today switch is remembered per
viewer, so a visitor who ticks it stops being asked until tomorrow.
The hotel answers the resolution furni properly since this morning and nothing
on the client listened, so the furni stayed silent.

The window has the three shapes the official has: the picker while the furni
carries no promise, with the owner's achievements in a grid and the one they are
looking at beside it; the progress, with the badge of the level they promised, a
bar, the clock and the re-select button; and the kept-promise card. Re-selecting
resets and then asks the furni again, which is what the official window does, so
the picker comes straight back.

An achievement that cannot be promised is greyed out and says why, using the two
official reasons. The renderer already sends the open packet when the furni is
clicked, so nothing here has to know about the click. Every text is an official
resolution.* key that the gamedata already carries: no new keys.
The element drew the badge and did nothing. When it carries a request code it is
a button now, as the official one is: it asks the hotel whether the badge was
already claimed when it appears, claims it on click, and settles into a disabled
claimed state on the answer. Without a request code it stays the plain image it
was, so existing landing pages do not change.
AIR 13 has no FAQ window: the three FAQ packets are legacy and the official
client opens 'cfh.faq.url' in the browser from two places, the help window and
the sanction card. Both links already existed here and went to the habbopage.

They now open the configured address when there is one, and keep the habbopage
when there is not, so a hotel with an external FAQ can point at it without losing
the built-in page. Only http and https are followed.
The info line of the voting window is the official 'see all participants' link
and it went to the hotel view. It now asks the hotel for the rooms taking part
and opens the navigator on the answer, which is what the official window does.
@SimoLeoLife
SimoLeoLife removed this pull request from stack #481 September 11, 2026 16:08
@SimoLeoLife
SimoLeoLife marked this pull request as ready for review September 11, 2026 16:11
@SimoLeoLife
SimoLeoLife merged commit ef048e3 into Dev Sep 11, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant