Skip to content

feat(navigator): refresh the navigator with gradients, rows and quick join - #450

Merged
TheMeinerLP merged 8 commits into
mainfrom
feat/navigator-refresh
Oct 17, 2026
Merged

TheMeinerLP merged 8 commits into
mainfrom
feat/navigator-refresh

Conversation

@TheMeinerLP

@TheMeinerLP TheMeinerLP commented Oct 17, 2026 •

Copy link
Copy Markdown
Contributor

Summary

The navigator gets a four-row layout with a glass frame, a gradient per mode, lore that shows the player count against the known maximum, a quick join for minigames, and a server list in the same style. The server list is translated (it was English-only).

Layout

row 0   F F F F F F F F F
row 1   F . E . . . S . F      E = ElytraRace (11), S = Slender (15)
row 2   F . V . C . B . F      V = Survival (20), C = Creative (22), B = Build (24)
row 3   F F F F W F F F F      W = Spawn (31), replaces the frame pane in the middle

F = frame pane (light blue / cyan by row plus column parity), . = grey pane. A hidden entry leaves its slot grey.

Clicks

Click Minigame (ElytraRace, Slender) Server (Survival, Creative, Build)
Left quick join connect
Right server list, always connect (no hint line)
Shift-left or shift-right, portal exists walk to portal walk to portal
Shift, no portal same as the unshifted click connect
Any other click (number keys, Q, F, middle, double, drag) nothing nothing

Lore per entry: separator in the mode's gradient, Players 13 / 40 (maximum only when every service has announced its limit), blank line, then one ▸ KEY ACTION line per click. The portal line appears only when a portal exists.

Quick join rule

Among the minigame's running services, take those that are ready (limit announced) and not full. Pick the one with the most players; on a tie, the lowest name. Services are read again at click time. If none qualifies, the server list opens and shows why. With nothing running, the list is empty and says "No server is running right now." If the services cannot be read (no count provider, or the lookup fails), nothing opens and the player gets a chat refusal instead.

A pick in the server list reads the services again too, so a server that filled up or stopped since the list opened is refused rather than joined.

Behaviour change

A right click on a minigame used to walk to the portal (since #414) when a portal existed. It now always opens the server list, and the portal moved to shift-click. Players who used the right click for the portal need to shift-click.

Review fixes

  • Only left and right clicks, with or without shift, act. Other click types are cancelled and do nothing, on minigames, servers and list entries.
  • A failed or unavailable service read is no longer shown as an empty list.
  • A pick is checked against a fresh read, not the list from when it opened.
  • Tests for the ignored click types, the read failure and the stale pick were written first and failed on assertions before the fix. Picker listener counts stay constant across repeated opening, and stopping the module removes every opened list.

Menu variants

Kept the eight shared inventories (four permission combinations times two languages). The title is set per language when the module starts. Rejected two alternatives:

  • GlobalTranslatedInventoryBuilder: Aves does not fire its click and close listeners for translated builders, so the module would have to forward them itself, as SwitcherInventory does.
  • One inventory per opening: each open would register new listeners, and the leak tests would have to count openings instead of registrations.

The server list has one shared instance per minigame and language, with one builder per row count.

Other

  • Bundles: 15 keys in messages_de.properties and messages_en.properties; a test checks both files against NavigatorMessages.KEYS.
  • Removed DestinationPlayerLoreTest and DestinationClickHintLoreTest, which pinned the old lore API; NavigatorLoreTest and NavigatorClickHintTest cover that now.
  • Updated cloudnet tests for the new slots and the four-row layout (NavigatorProtectionOrderingTest, SpawnReturnWiringTest, StandardLoadoutTest).

Test plan

  • Pure tests written first: QuickJoinTest, ClickActionTest, NavigatorLayoutTest, NavigatorLoreTest, ServerPickerStyleTest, TaskCapacityTest, NavigatorMessagesTest.
  • Environment tests: NavigatorRenderedLayoutTest (frame, slots, hidden entries), NavigatorClickHintTest, NavigatorServerPickerTest (quick join, server list, shift portal), and the existing permission, portal, telemetry and leak tests updated for the new slots.
  • ./gradlew spotlessApply and ./gradlew build are green locally.
  • Not yet checked on a running lobby: colours, and the German strings in the real client.

https://claude.ai/code/session_01DWzXyozSMX1ngvbMZGLvwA

@TheMeinerLP
TheMeinerLP requested a review from a team as a code owner October 17, 2026 15:00
Proposes the navigator refresh: four rows with a glass frame, per-mode
gradients, a player line with the known maximum, quick join on the left
click for minigames, the server picker on the right click, and walking to
the portal on shift-click (right click no longer walks to the portal).

Claude-Session: https://claude.ai/code/session_01DWzXyozSMX1ngvbMZGLvwA
… join

The navigator is now four rows with a glass frame: minigames in row two,
servers in row three, spawn in the bottom middle. Each mode has its own
gradient, and its lore lists a separator, the players against the known
maximum, and the click lines.

A left click on a minigame quick-joins its best ready service (the
fullest one, then the lowest name) and opens the server list when none is
ready. A right click always opens the server list. A shift click walks to
the portal when one exists. This moves the portal from the right click to
shift; a server connects on any unshifted click.

The server list follows the same style and is translated. Titles and
click lines come from the de and en bundles.

Claude-Session: https://claude.ai/code/session_01DWzXyozSMX1ngvbMZGLvwA
@TheMeinerLP
TheMeinerLP force-pushed the feat/navigator-refresh branch from f9f2a8b to de2098e Compare October 17, 2026 15:26
@TheMeinerLP
TheMeinerLP changed the base branch from feat/navigator-slender-permission to main October 17, 2026 15:26
@github-actions

github-actions Bot commented Oct 17, 2026 •

Copy link
Copy Markdown
Contributor

Test results

  936 files    936 suites   53m 13s ⏱️
2 523 tests 2 521 ✅  2 💤 0 ❌
7 597 runs  7 514 ✅ 83 💤 0 ❌

Results for commit fdf606d.

♻️ This comment has been updated with latest results.

…esh pick

Written before the fix in the next commit. Observed red on assertions:
- unnamed click types (HotbarSwap, DropSlot, OffhandSwap, Middle, Double)
  connected, joined or opened the picker on servers, minigames and picker
  entries
- a failing or missing service read opened the picker instead of refusing
- a picked server was joined from the snapshot taken when the list opened
- TaskPlayers reported a failed read as an empty list

Also renames the misnamed spawn wiring test (it clicks slot 31) and the
shift-click ClickAction test, and pins the picker listener counts across
repeated opening and module stop (green already).

Claude-Session: https://claude.ai/code/session_01DWzXyozSMX1ngvbMZGLvwA
… re-read picks

- Only left and right clicks, with or without shift, act. Every other click
  type is cancelled and does nothing, on minigames, servers and the entries
  of the server list. ClickAction.of returns an Optional for that.
- The services are read as three cases: running (possibly none), or
  unreadable (no count provider, or the lookup failed). Unreadable refuses
  in chat with a translated reason and opens no list, so it no longer looks
  like nothing running.
- A minigame with nothing running opens the list with a centred "No server
  is running right now." entry, which does nothing when clicked.
- A picked server is read again on click; it is joined only if it still has
  announced its limit and a free slot. A server that has stopped running is
  refused as not ready.

Claude-Session: https://claude.ai/code/session_01DWzXyozSMX1ngvbMZGLvwA
The navigator feather name uses the gradient it has in code, the build and
slender slots match the four-row layout (24 and 15), and the README and the
module doc say that clicks other than left and right do nothing.

Claude-Session: https://claude.ai/code/session_01DWzXyozSMX1ngvbMZGLvwA
Adds scenarios for ignored click types, unreadable services, the fresh read
on pick, the empty server list and the listener cleanup on stop. The change
now targets main.

Claude-Session: https://claude.ai/code/session_01DWzXyozSMX1ngvbMZGLvwA
@TheMeinerLP
TheMeinerLP merged commit 343d5a6 into main Oct 17, 2026
7 checks 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