Skip to content

VelocityNavigator v4.3.0

Latest

Choose a tag to compare

@github-actions github-actions released this 13 Jul 23:10

[4.3.0] - 2026-07-14

Advanced proxy systems

  • Added native parties with /party invite, accept, deny, kick, leave, and disband, private /p chat, and leader-follow synchronization on ServerConnectedEvent.
  • Added a virtual lobby-capacity queue with action-bar position updates, asynchronous slot polling, automatic connection, /queue leave, and optional initial-join holding_server support.
  • Added a dependency-free Redis RESP client for vn:servers:register dynamic registration and cross-proxy circuit-breaker, health-cache, backend-state, and affinity synchronization.
  • Added backend MOTD lifecycle parsing for markers such as [STATE:IN_GAME]; routing only uses configured allowed states.
  • Geographic-routing integrations and BungeeCord/Waterfall compatibility remain deferred and are not part of v4.3.0.
  • Added optional server management: /vn server add game writes only to velocity.toml, while /vn server add lobby also persists lobby metadata in servers.toml and activates it immediately without reload.
  • Added /vn server remove and /vn server list, overwrite protection, custom Velocity-config paths, IPv4/hostname/IPv6 parsing, and atomic configuration writes.
  • Expanded gui.toml Bedrock controls with enable/fallback switches, sorting, button limits, visibility toggles, and title/content/button overrides with color conversion.
  • Added backend config.yml switches for the bridge, inventory channel, handshake, refresh, delay, title length, and fallback material.

Added

  • Configurable language packs — explicit en, ru, es, fr, de, pt_br, and zh_cn selection plus arbitrary custom codes. Built-in changes rewrite active text; player locale is never auto-detected.
  • Separate gui.toml — rows, materials, fillers, refresh interval, navigation slots, and per-server fixed slot/material/name/lore overrides.
  • Universal Java inventory selector — the same 4.3.0 JAR runs in Velocity proxy or Paper/Spigot bridge mode and announces its mode at startup.
  • Pagination, live refresh, and unavailable indicators for Java inventory menus.
  • /vn bridge status reports detected backend bridge versions and last-seen times.
  • Universal bridge integration tests cover proxy-open, backend-click, navigation, handshake, and proxy-selection flows.
  • Exponential backoff with jitter for connection retries — each retry waits progressively longer with a small random jitter to avoid thundering-herd reconnects.
  • Player affinity persistence — unexpired sticky-session mappings are now saved to disk and restored across proxy restarts.
  • /vn health command — consolidated one-shot diagnostics: routing mode, lobby count, circuit-breaker states, drained servers, cache sizes, and affinity entry count in a single screen.
  • HTML operations dashboard — a separate HTTP server on its own port serving a live lobby table, routing distribution chart, affinity map, config summary, recent routing events, and joins/leaves-since-start counters. Disabled by default and authenticated via a bearer-token login flow.
  • velocity-plugin.json descriptor — modern Velocity plugin metadata alongside the existing @Plugin annotation.
  • New reproducible marketplace brand system with a plugin icon, hero banner, social card, nine feature panels, platform-specific listing copy, meaningful alt text, and a visual feature overview in the wiki.
  • Built the backend bridge against the Spigot API 1.16.5 baseline without version-specific NMS.

Changed

  • Dashboard documentation now distinguishes the universal 127.0.0.1 loopback example from provider addresses and explains allocated ports, container binds, and browser URLs.
  • The official wiki URL is now built in. startup.wiki_url is no longer written or accepted as a custom documentation target, and legacy entries are removed during configuration normalization.
  • Language documentation now explains structural test coverage, custom packs, and how native speakers can contribute new or improved translations.
  • routing.use_menu_for_lobby replaces use_chat_menu_for_lobby; the old key remains a compatible alias.
  • Selector mode/fallback lives in navigator.toml, language in messages.toml, GUI presentation in gui.toml, and managed lobby metadata in servers.toml. The plugin/config versions are 4.3.0/v8.
  • MiniMessage, classic &/§, &#RRGGBB, and Bungee-style hex colors are accepted in configurable text.
  • Server health cache keys are now normalized to lowercase. Mixed-case server names no longer produce duplicate cache entries.
  • Consistent hash ring uses a thread-local MessageDigest instead of allocating one per lookup. Throughput on consistent_hash mode improves by roughly 3–4× under load.
  • RoutePlanner now builds a Map<String, LobbyEntry> once per planning call instead of scanning the lobby list linearly per candidate.
  • Config reload now uses a dedicated ReentrantLock instead of synchronized(this). Admin commands and event subscribers no longer contend on the same monitor during a reload.
  • Bedrock form text stripping now matches legacy color codes case-insensitively. &C and &L are now stripped alongside &c and &l.
  • Update checks are now silent by default — no startup log line, no periodic console message. /vn updatecheck still works for manual checks. Set update_checker.silent = false in navigator.toml to restore the old behavior.
  • Config version bumped to 8. Adds the final 4.3.0 advanced-system, managed-server, selector, dashboard, and Redis settings. Older configs are auto-migrated and backed up; network-facing systems remain disabled by default.

Fixed

  • Party commands now expose explicit /party status and /party chat <message> paths, while /p <message> and multiword messages use Velocity raw-command parsing.
  • Escaped MiniMessage entities such as &lt;player&gt; are no longer mistaken for the legacy &l bold color code.
  • Dashboard API version data now comes from the plugin metadata instead of a hardcoded prerelease string.
  • Redis RESP parsing on the Velocity proxy now enforces line, bulk, array, total-frame, and nesting limits before allocation or recursion.
  • Backend Redis lifecycle registration now rejects oversized response lines instead of allowing peer-controlled heap growth.
  • Dashboard bearer credentials are accepted only through the Authorization header. The browser login keeps the token in memory and never places it in URLs or persistent browser storage.
  • MetricsService.active() and statusLine() are now volatile. Reader threads (Prometheus exporter, /vn status) no longer risk seeing stale values after a config reload.
  • PrometheusExporter.start() now clears the server reference if start() throws. Previously the next stop() call would operate on an unstarted server.
  • UpdateChecker now uses the non-deprecated JsonParser.parseString(...) and the nextAllowedCheck read-modify-write is guarded by a synchronized block to prevent duplicate 429 retries under concurrency.
  • ConfigManager's generated navigator.toml header box no longer overflows on the bStats URL line.
  • Empty if branch in applyLoadedConfiguration removed — round-robin reset logic is now a single positive check.

Internal

  • Stripped ~110 inline // comments across the source tree. Public API javadoc and license headers are preserved.
  • Removed unused imports, unused constructors (Config.UpdateCheckerSettings(UpdateChannel), ServerCandidate 4-arg, etc.) and SemanticVersion.raw().
  • Tightened a handful of synchronized blocks to lock-free alternatives where safe.