Always up to date · Auto-built from ranked-clean

Get the Jedaii Client

One download. Everything you need to join the ranked dueling server — the custom OpenJK client and the Jedaii RPG PK3, packaged together and ready to drop in.

 Branch: ranked-clean
 Released: October 28, 2026
 4.4 MB
 Windows

Source Branch

View the ranked-clean branch on GitHub. See the full release history, changelogs, and source code for the custom OpenJK fork.

 ranked-clean  Public
 View on GitHub

See the New Look

Every window in the client has been redrawn: HUD cards, shop, quests, leaderboards, the cantina games and the Master RPG Hub, all animated. Sound on for the music.

Quick Install Guide

01

Download

Click Download Full Package above and save the zip anywhere on your PC.

02

Unzip

Extract the zip. You will find mbii.x86.exe and zzz_rpg_hud.pk3 inside.

03

Place Client

Copy mbii.x86.exe into your Jedi Academy GameData/ folder.

04

Place PK3

Copy zzz_rpg_hud.pk3 into GameData/MBII/

05

Launch

Start the game through the normal MBII launcher as you always do. The PK3 loads automatically.

06

Enjoy

Connect to the Jedaii Ranked server. Climb the ranks. Become a Legend.

Ranked Changelog

Recent gameplay updates, social features, and ranked system enhancements.

Active-Mode Stats Fix, Loot Balance, !scrap & Chat Ranking (!top chat) Latest Release Live Release
October 28, 2026
Live update from GitHub release.
  • Fix: the HUD card and the stats window showed the duel numbers on Battleground / Open / FA servers. !stats correctly showed the numbers of the mode the server runs, but every automatic sync (after a kill, a win, a login) re-sent the duel numbers, so the card and the stats window jumped back to duel. The sync now uses the active mode (Elo, wins/losses, kills, deaths, highest streak; Open mode uses team wins / losses, like !stats) and also sends the current streak, trivia wins and top rival instead of zeros. Server-side change in SV_Ranked_SyncClientRPG: needs a new server build on those servers.
  • Objective loot drops are no longer guaranteed. Completing an objective in FA / Legends used to always drop an item with a boosted rarity. Now: 35% chance (loot_objective_chance), at most 2 drops per player per round (loot_objective_round_cap, 0 = no cap), and a pity counter (loot_objective_pity, default 4): after that many objectives in a row without a drop the next one is guaranteed and at least Uncommon (the counter is saved on the account). Objective rarity is now 45% Common / 35% Uncommon / 16% Rare / 4% Legendary (was 30 / 35 / 25 / 10). Kill and assist drops are unchanged. All three numbers are settings in the server's ranked config.json.
  • New !scrap [item]: sells every extra copy of loot items at the normal sell price and keeps one of each, so set pieces are never sold by accident. !scrap does all duplicates, !scrap just that item. Listed in !help and in the !collection text. Server-side change: needs a new server build.
  • Fix: garbled duel messages. The "Valiant Effort" line printed a random number instead of "Elo" (for example -30 1.283134E+108lo Loss Shielded) and the anti-farm line could do the same: the text was built with va() and then read as a format string a second time, so the % in "-30% Elo" was taken as a format code. Both now pass their format straight to the command.
  • New chat ranking !top chat (also !topchat): counts how many *different* messages a logged-in player writes in public chat, in every mode, and shows the top 10 in a new "Chat Kings" window (same Holo style as the other lists) with a funny chat rank next to each count (Silent Youngling, Throat Clearer, Cantina Regular, Gossip Droid, Jawa Translator, Chatterbox Knight, Senate Filibusterer, Midi-chlorian Mouth, Jar Jar's Apprentice, Wookiee Whisperer, Galactic Broadcast). Only the number is stored (chat_msgs on the account), never the text. Spam does not count: a message that repeats one of the player's last 5 messages (ignoring case, punctuation, colour codes and doubled letters, so "ok", "OK!" and "okkk" are the same), messages under 2 letters, more than one counted message per 2 seconds, and more than 10 per minute are ignored. Players get a chat line when they reach a new chat rank, and !top chat also shows their own rank, place and the next rank. Needs a new server build and client; the global list needs the account service updated (it must know the chat_msgs field).
Client Resolution Fix, Live Rank Table, Collection Book & Jedaii Icon Engine & Features
October 27, 2026
<strong>1. Client Fixes</strong> • <strong>2. Server-Driven RPG Menu Data</strong> • <strong>2b. UI Text and HUD Layout</strong>
  • No more "Could not load generic shader!" after changing resolution: CL_ShutdownRef in codemp/client/cl_main.cpp now always unloads the renderer DLL on vid_restart. MBII's own rd-rend2-mbii / rd-vanilla-mbii DLLs keep static state and cannot be re-initialised in place.
  • Console version text: the bottom-right console text now reads Jedaii-MBII-MP v1.1.0 (JEDAII_VERSION in codemp/qcommon/game_version.h) instead of OpenJK-MP: v1.0.1.0. The engine VERSION_* numbers are unchanged.
  • Jedaii logo as the exe icon: codemp/win32/icon.ico rebuilt from the Jedaii logo (16-256 px).
  • Live rank table: the server now sends rpg_ranks "" ...</code> (from <code>ranked/config.json</code>, <code>xp_per_level</code>) whenever it syncs RPG data (<code>SV_Ranked_SendRankTable</code> in <code>sv_ranked_logic.cpp</code>). The <code>!rpgmenu</code> RANKS tab draws that table, shows each rank's Elo range and marks the player's current rank.</li> <li><strong>XP per level</strong>: <code>stats_sync</code> and the XP bar use the server's <code>xp_per_level</code> instead of a hard-coded 1000. The wrong "XP = 100 + (L-1)*150 ..." footnote was replaced with the real formula.</li> <li><strong>Proportional UI font</strong>: all client overlay text (<code>SCR_DrawVirtualString</code> / <code>SCR_GetStringWidth</code> in <code>cl_scrn.cpp</code>) now uses the MBII proportional font (<code>ergoec</code>, falling back to <code>arialnb</code> / <code>ocr_a</code>) instead of the fixed-width character sheet, so letters are evenly spaced. Text with emoji glyphs (0x80-0x8F) still uses the old path.</li> <li><strong>RPG HUD</strong>: the XP text now matches the bar (<code>245 / 1000 XP</code>), kills/deaths/wins/losses are spelled out, long names are shortened with <code>..</code> and the level badge is pinned to the card edge, and the wide bar style has a fixed width so it no longer resizes with the name.</li> <li><strong>Follow-up fixes</strong>: the font code no longer leaves the renderer colour set (casino buttons were tinted yellow until hovered), text is drawn slightly smaller and higher so it no longer collides with the card art, the rank line is left-aligned on all card styles, the XP text is centred inside the bar, and the wide bar style shows its stats under the bar. The garbled bullet in the blackjack subtitle was replaced with a dash.</li> <li><strong>New HUD style "Holo"</strong> (<code>rpg_hud_style holo</code>, or the HUD Style button in the RPG menu): code-drawn card in the look of the duel result announcer (navy glass, thin border, accent bar). It slides in when it appears, and the XP bar is the animated part: it eases to its value, has a moving sheen, flashes with a floating <code>+N XP</code> on every XP gain, and turns gold with a LEVEL UP flash on level up.</li> <li><strong>HUD cards are shorter</strong> (48 instead of 58 units, the empty gap between the stats row and the XP bar is gone) and <strong>Edge now has the avatar and the Kills/Deaths/Wins/Losses row like Holo</strong>; its cut corners are drawn with one row per screen pixel and an outline that no longer tints the inside of the card</li> </ul> </div> <div class="dl-cl-card"> <div class="dl-cl-card-header"> <div class="dl-cl-card-title-group"> <span class="dl-cl-card-title">Server Connect Crash Fix, Reliable Chat Parsing & Stability Overhaul</span> <span class="dl-cl-badge gold"> Engine & Features </span> </div> <span class="dl-cl-date"><i class="far fa-calendar-alt" style="margin-right:5px;opacity:.7;"></i>October 1, 2026</span> </div> <div class="dl-cl-desc"><strong>1. Server Connection Crash Guard</strong> • <strong>2. Chat &amp; Command System Improvements</strong></div> <ul class="dl-cl-list"> <li><strong>Fixed <code>FX_WorldToScreen</code> NULL-Pointer Dereference</strong>: Added defensive validation for <code>theFxHelper.refdef</code> and positive FOV (<code>fov_x > 0</code>, <code>fov_y > 0</code>) in <code>codemp/client/FxPrimitives.cpp</code>. Previously, joining a server triggered 3D screen calculations before the 3D scene was initialized, resulting in a fatal segmentation fault when loading into game servers.</li> <li><strong>Client Overlay State Guards</strong>: Added <code>cls.cgameStarted</code> and <code>cl.snap.valid</code> checks to overhead icon functions (<code>SCR_DrawPartyOverheadIcons</code>, <code>SCR_DrawHotPotatoOverheadIcon</code>, <code>SCR_DrawInspectOverlay</code>) in <code>codemp/client/cl_scrn.cpp</code>.</li> <li><strong>Non-Destructive Server Tokenizer</strong>: Replaced global <code>Cmd_TokenizeString</code> in <code>party_info</code> parsing (<code>codemp/client/cl_parse.cpp</code>) with isolated <code>COM_Parse</code>. This prevents network packet updates from overwriting active user chat commands and eliminates "eaten" chat messages.</li> <li><strong>Connection-State Chat Preservation</strong>: Updated <code>Message_Key</code> in <code>codemp/client/cl_keys.cpp</code> to permit chat transmission in all connected states (<code>>= CA_CONNECTED</code>), preventing dropped messages during server loading, spectator transitions, or intermissions.</li> </ul> </div> <div class="dl-cl-card"> <div class="dl-cl-card-header"> <div class="dl-cl-card-title-group"> <span class="dl-cl-card-title">Lagometer Unchoke, High-Tier ELO Decay & Non-Blocking Database</span> <span class="dl-cl-badge gold"> Engine & Features </span> </div> <span class="dl-cl-date"><i class="far fa-calendar-alt" style="margin-right:5px;opacity:.7;"></i>August 26, 2026</span> </div> <div class="dl-cl-desc"><strong>1. Solid Green Lagometer (Zero Choke)</strong> • <strong>2. Non-Blocking Debounced Database</strong> • <strong>3. Competitive Rank Symmetry &amp; Decay</strong></div> <ul class="dl-cl-list"> <li><strong>Unchoked Snapshot Delivery</strong>: Hardcoded unchoked snapshot delivery in <code>codemp/server/sv_snapshot.cpp</code> to guarantee 100% green lagometer and eliminate packet delivery choking.</li> <li><strong>Rate-Throttling Removal</strong>: Removed <code>SNAPFLAG_RATE_DELAYED</code> restrictions.</li> <li><strong>Zero-Latency Saves</strong>: Transitioned player stats, rank data, and inventory saving to debounced asynchronous writes in <code>sv_ranked_db.cpp</code>, completely eliminating tickrate hitching upon kill events.</li> <li><strong>High-Tier ELO Balance</strong>: Refined win/loss point gains for top-tier players.</li> <li><strong>Diamond+ Inactivity Decay</strong>: Added automated weekly rating decay for inactive Diamond+ ranked players to maintain competitive leaderboard integrity.</li> </ul> </div> <div class="dl-cl-card"> <div class="dl-cl-card-header"> <div class="dl-cl-card-title-group"> <span class="dl-cl-card-title">Cantina Games Hub, Pazaak 20, Blackjack 21 & Party System</span> <span class="dl-cl-badge gold"> Engine & Features </span> </div> <span class="dl-cl-date"><i class="far fa-calendar-alt" style="margin-right:5px;opacity:.7;"></i>August 20, 2026</span> </div> <div class="dl-cl-desc"><strong>1. Star Wars Pazaak 20 &amp; Canto Bight Blackjack 21</strong> • <strong>2. Party &amp; Team System</strong></div> <ul class="dl-cl-list"> <li><strong>Multiplayer Pazaak 20</strong>: Full multiplayer wagering system (<code>!pazaak challenge <name> <bet></code>, <code>!pazaak accept</code>), 52-card custom deck, side deck modifiers, stand/end turn mechanics, and UI rendering.</li> <li><strong>Canto Bight Blackjack 21</strong>: Interactive blackjack table with animated 3D chip stacks and real-time dealer logic.</li> <li><strong>Cantina Games Hub (<code>!games</code>)</strong>: Unified menu to launch casino and cantina mini-games.</li> <li><strong>Party Hub (<code>!party</code>, <code>!p</code>)</strong>: Create and manage parties with custom colors, shared scores, party health/armor/force/BP indicators, and dedicated party chat styled in yellow.</li> <li><strong>Live BP Telemetry</strong>: Real-time duel Block Points (BP) tracking and status telemetry.</li> </ul> </div> <div class="dl-cl-card"> <div class="dl-cl-card-header"> <div class="dl-cl-card-title-group"> <span class="dl-cl-card-title">Exempt NPCs from Duel Culling & Fix Bone Remapping</span> <span class="dl-cl-badge gold"> Engine & Features </span> </div> <span class="dl-cl-date"><i class="far fa-calendar-alt" style="margin-right:5px;opacity:.7;"></i>June 13, 2026</span> </div> <div class="dl-cl-desc"><strong>1. Exempt NPCs from Duel Culling</strong> • <strong>2. Revert Bone Remapping Commit</strong> • <strong>Files Modified</strong></div> <ul class="dl-cl-list"> <li><strong>NPC Culling Exemption</strong>: Modified <code>DuelCull</code> in <code>codemp/server/duel_cull.cpp</code> to return <code>0</code> (do not cull, do not disable collision) if either entity is an NPC (<code>isNPC(flatten(ent)) || isNPC(flatten(touch))</code>).</li> <li><strong>Rationale</strong>: Prior to this fix, when a player entered a duel, the server's snapshot duel culling would identify NPCs as non-dueling actors and filter them out of the dueling player's snapshots. This caused NPCs to disappear immediately after spawning or starting a duel. This fix keeps NPCs visible and interactive for all players, regardless of their dueling state.</li> <li><strong>Reverted 31304c14</strong>: Reverted the bone-remapping commit which corrupted skeleton structures on 72-bone humanoid models for dedicated servers, causing all NPCs to become invisible.</li> <li><code>codemp/server/duel_cull.cpp</code> (Exempt NPCs from Duel Culling)</li> <li><code>codemp/rd-dedicated/tr_model.cpp</code> (Revert bone remapping)</li> <li><code>codemp/rd-rend2/tr_model.cpp</code> (Revert bone remapping)</li> <li><code>codemp/rd-vanilla/tr_model.cpp</code> (Revert bone remapping)</li> </ul> </div> <div class="dl-cl-card"> <div class="dl-cl-card-header"> <div class="dl-cl-card-title-group"> <span class="dl-cl-card-title">Mode Sync, Rival Tracking & Logic Hardening</span> <span class="dl-cl-badge gold"> Engine & Features </span> </div> <span class="dl-cl-date"><i class="far fa-calendar-alt" style="margin-right:5px;opacity:.7;"></i>May 13, 2026</span> </div> <div class="dl-cl-desc"><strong>1. Engine &amp; Mode Synchronization</strong> • <strong>2. Rivalry &amp; Persistence Enhancements</strong></div> <ul class="dl-cl-list"> <li><strong>Triggered Mode Refresh</strong>: Integrated <code>SV_Ranked_SaveConfig()</code> into <code>SV_SpawnServer()</code> in <code>sv_init.cpp</code>. The Ranked engine now re-queries <code>g_Authenticity</code> and <code>g_gametype</code> at the start of every map, ensuring the dashboard correctly reflects "Duel" vs "Open" mode immediately.</li> <li><strong>Initialization Cleanup</strong>: Fixed a bug in <code>SV_Ranked_Init</code> that printed the active mode before CVars were synchronized, which previously caused misleading "Open" reports in the startup log.</li> </ul> </div> </div> <!-- Technical Github Notice --> <div class="dl-cl-tech-box"> <div class="dl-cl-tech-info"> <i class="fab fa-github dl-cl-tech-icon"></i> <div class="dl-cl-tech-text"> <h4>Looking for technical changes?</h4> <p>Engine commits, source code diffs, and developer patch notes are hosted on GitHub.</p> </div> </div> <a href="https://github.com/Liki002/Asu-OpenJK-mb2-Jedaii/releases/tag/latest-ranked-clean" target="_blank" rel="noopener" class="dl-cl-tech-btn"> <i class="fab fa-github"></i> Technical Changelog on GitHub </a> </div> </div> </div> <!-- Discord Support --> <div class="dl-support"> <div class="dl-support-inner"> <div class="dl-support-icon"><i class="fab fa-discord"></i></div> <div class="dl-support-text"> <h3>Need help installing?</h3> <p>Join our Discord for setup assistance, bug reports, and community support.</p> </div> <a id="btn-discord-support" href="https://discord.gg/jedaii" target="_blank" rel="noopener" class="dl-discord-btn"> <i class="fab fa-discord"></i> Join Discord </a> </div> </div> </main> <footer style="text-align:center;padding:24px;color:var(--text-muted);font-size:.78rem;border-top:1px solid rgba(255,255,255,.06);"> Je'daii Ranked Duel — <a href="index.php" style="color:var(--primary-color);text-decoration:none;">Back to Home</a>  |  <a href="https://github.com/Liki002/Asu-OpenJK-mb2-Jedaii/releases/tag/latest-ranked-clean" target="_blank" rel="noopener" style="color:var(--primary-color);text-decoration:none;"> <i class="fab fa-github"></i> Release History </a> </footer> </div> <script> // Matrix canvas background const canvas = document.getElementById('matrix-canvas'); if (canvas) { const ctx = canvas.getContext('2d'); canvas.width = window.innerWidth; canvas.height = window.innerHeight; const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789@#$%&*<>'; const fontSize = 14; const cols = Math.floor(canvas.width / fontSize); const drops = Array(cols).fill(1); function draw() { ctx.fillStyle = 'rgba(13,15,16,0.05)'; ctx.fillRect(0, 0, canvas.width, canvas.height); ctx.fillStyle = '#00F2FF'; ctx.font = fontSize + 'px JetBrains Mono'; drops.forEach((y, i) => { const c = chars[Math.floor(Math.random() * chars.length)]; ctx.fillText(c, i * fontSize, y * fontSize); if (y * fontSize > canvas.height && Math.random() > 0.975) drops[i] = 0; drops[i]++; }); } setInterval(draw, 40); window.addEventListener('resize', () => { canvas.width = window.innerWidth; canvas.height = window.innerHeight; }); } // Mobile nav const mBtn = document.getElementById('mobile-menu-btn'); const nav = document.getElementById('nav-menu'); if (mBtn && nav) mBtn.addEventListener('click', () => nav.classList.toggle('active')); document.querySelectorAll('.nav-group').forEach(g => g.addEventListener('click', () => g.classList.toggle('open'))); </script> </body> </html>