A fork of the Season 5.2 client sources uploaded by Louis, modernized for Season 6 Episode 3 and playable with OpenMU. The project improves rendering, UI, networking and developer tooling while continuing work on Season 6 compatibility.
- 🔥 Inventory and vault extensions, the Season 6 master skill tree, and Rage Fighter support.
- 🔥 MU Helper UI and core logic, with further improvements still planned.
- 🔥 Automatic reconnection and monster health bars after attacking.
- 🔥 Qubit's improvements to right-click equipping, Dark Lord's Raven visuals, Fenrir glow, and screen resolutions.
- 🔥 Extended Season 6 networking with larger damage/EXP values and improved item and appearance serialization. The protocol includes custom extensions.
- 🔥 Higher frame rates than the original's fixed 25 FPS: VSync by default, uncapped when VSync
is off (
$fps <value>sets a cap), while animation and movement keep their 25 FPS timing (ADR 0001). - 🔥 SDL GPU rendering with deferred draw batching, indexed geometry, growable buffers, packed bone palettes, allocation-free sprites, and detailed performance statistics.
- 🔥 A unified RmlUi system with layout and styling in RML/RCSS, centralized UI scaling, theme inheritance, and theme-defined window placement.
- 🔥 Unicode text and a generated translation system for runtime language switching.
- 🔥 A C# .NET 10 network library built with Native AOT, using MUnique.OpenMU.Network.
- 🔥 Socket-based automation for gameplay and UI interactions, state inspection, and screenshots; the in-game tester generates pass/fail reports.
- 🔥 An in-game MU Editor for camera and rendering tuning, terrain and world object editing, and minimap capture.
- 🔥 Chat diagnostics for frame timing, rendering statistics and per-system rendering cost, plus UI previews of any window or event; see Chat commands.
Remaining Season 6 work includes Lucky Items.
Hosted releases provide Windows native x64 Release, Linux x64 Release and macOS arm64 Release
builds with the editor disabled; Semantic Release publishes all three as GitHub Release assets.
Each runtime excludes Data/ and fonts/: its Compatible game data link points to the
separate data release tagged data-<id>. Follow the platform-specific assembly steps in the
release instructions.
x86, Debug, editor-enabled and MinGW configurations are not hosted; build locally where supported. See the supported targets.
Use CMake 3.25+, a platform C++ toolchain, and the .NET 10 SDK. Platform-specific prerequisites, IDE setup, dependency troubleshooting and cross-compilation instructions live in the build guide.
| Environment | Guide |
|---|---|
| Windows / Visual Studio | Visual Studio setup |
| Windows / terminal | CMake presets and prerequisites |
| Linux / terminal | Native Linux setup |
| Linux or Windows IDEs | CLion, Rider and VS Code guides |
| WSL / MinGW | Windows cross-compilation |
For a Windows x64 player build, install the prerequisites in the Windows terminal guide,
set VCPKG_ROOT, then run from the repository root in a Visual Studio Developer PowerShell:
cmake --preset windows-x64
cmake --build --preset windows-x64-release
cd out/build/windows-x64/src/Release
.\Main.exeCMake initializes required submodules and downloads dependencies during configuration. Native builds also build the network library and stage game assets beside the executable. Run from that output directory so the client finds its data and libraries.
Player presets disable the editor and control socket. The -mueditor presets enable
both, plus the in-game tester. These configure-time choices are independent of Debug,
Release or RelWithDebInfo; see build options.
Run Main.exe from its output directory. It connects to the server in config.ini
([CONNECTION SETTINGS], localhost port 44405 by default); Main.exe connect /u<IP> /p<PORT>
overrides it for that run, for example Main.exe connect /u192.168.0.20 /p55902. The
OpenMU launcher passes the same arguments.
The client identifies itself with version 2.04d and serial k1Pk2jcET48mxL3b.
The client reads config.ini from the executable directory and creates it on first save.
Missing keys take the defaults below. The options window writes most of them; see
Options window and config.
| Section | Key | Default | Description |
|---|---|---|---|
[Window] |
Width, Height |
1024, 768 |
Window or fullscreen resolution. |
[Window] |
Windowed |
1 |
0 runs fullscreen. |
[Audio] |
SoundVolume, MusicVolume |
5 |
0 mutes. |
[LOGIN] |
Language |
Eng |
Game data language: the Data/Local/<Language>/ folder (item names, map name art). |
[LOGIN] |
RememberMe, SavePassword |
0 |
Remember the account name, and the password too. Both are stored encrypted for this machine and user (EncryptedUsername, EncryptedPassword). |
[CONNECTION SETTINGS] |
ServerIP, ServerPort |
localhost, 44405 |
Server to connect to when no connect argument is given. |
[UI] |
Locale |
en |
UI language (en, de, es, id, ja, pl, pt, ru, tl, uk, zh-TW). Switchable at runtime in the options window. |
[UI] |
Font |
empty | UI font family; empty uses the platform's default. |
[UI] |
RmlTheme |
legacy |
UI theme: legacy (the original look) or modern. $theme <name> switches it for the session. |
[UI] |
UIScalePercent |
100 |
UI scale, clamped to 75-150. |
[UI] |
EnableAnimationTaskPool |
0 |
1 updates character animation through AnimationTaskPool when at least 20 characters are visible. |
[Camera] |
Zoom |
1735 |
Persisted Orbital-camera distance. |
[Render] |
VSync |
1 |
0 disables VSync across restarts and resolution changes. $vsync on / $vsync off update it. |
[Render] |
FpsCap |
-1 |
Frame cap while VSync is off; -1 is uncapped. $fps <value> updates it. |
[Render] |
Backend |
default |
SDL GPU driver: default, vulkan, direct3d12 (or d3d12), metal. Falls back to SDL's choice with a logged warning when unavailable. Edited by hand only. |
[Render] |
DisableEffects, DisableParticles, DisableSkillEffectModels, DisableBoids, DisableWingShadow |
0 |
Rendering-cost reductions for low-end PCs, also in the options window and $effects. |
[Render] |
SortParticleDraws |
0 |
Opt-in depth sorting of particle draws. |
[ChatCommands] |
Favourite<N>, Template<N> |
none | Written by the chat commands window. |
The retired [Render] CoreProfile key is ignored, and keys the client no longer uses are
removed from the file when it loads.
connect /u<IP> /p<PORT>: connects to that server instead of[CONNECTION SETTINGS].--enable-taskpool: enablesAnimationTaskPoolregardless ofconfig.ini; the 20-character threshold still applies.--editor: starts with the ImGui editor open in editor-enabled builds (the-mueditorpresets); F12 toggles it.
Typed into the chat input, in any build:
$fps <value>,$vsync on|off,$fpscounter on|off,$details on|off,$glstats on|off: frame timing and rendering statistics.$effects on|offand$effects <system> on|off, where<system>issprites,particles,skillmodels,boids,wingshadow,jointsorwingextralayers: turn rendering systems off to compare their cost.$theme <name>: switch the UI theme for this session.$win <name> [full]($win listnames them),$preview <event>($previewlists them,$preview offends one) and$dialog: open any window, event windows with sample data, and test dialogs, for UI work.
Developer diagnostics, read at startup:
| Variable | Effect |
|---|---|
MU_CONTROL_SOCKET=<path> |
Opens the control socket there (builds with ENABLE_CONTROL_SOCKET). |
MU_CAPTURE_FRAME=<N>, MU_CAPTURE_PATH=<file> |
Dumps the Nth presented frame as a PPM (default mu-frame.ppm), for headless setups. |
MU_RENDER_TIMING |
Logs frame timing and renderer counters every 60 frames; see rendering parity. |
MU_INPUT_DIAGNOSTICS |
Logs window scale metrics and input routing. |
MU_NETWORK_DIAGNOSTICS |
Logs every sent and received packet. |
MU_D3D12_DISABLE_CULLING=1, MU_D3D12_DISABLE_TRIANGLE_MERGING=1 |
Direct3D 12 driver only: turn culling or triangle merging off to isolate driver issues; see rendering parity. |
- RmlUi UI system - UI architecture, building windows, layout and scaling, theming, and reusable components.
- GPU skinning and SDL GPU rendering - the downstream mapping for upstream Core Profile, GPU skinning, and DXP work.
- Camera system - modes, switching (F9), config,
frustum culling,
$detailsoverlay, and the gameplay behaviour changes from the 3D camera rework. - Chat commands window - the commands the server offers (J), how their values are entered, and how favourites and templates are stored.
- DevEditor - the in-game tuning UI (F12, editor-enabled builds), including the Map Editor tab for terrain textures/height/attributes, world objects, and minimap capture.
- Options window and config - runtime
resolution / windowed toggle, slider rounding, and what the options
window stores in
config.ini. - Build guide - platform-specific build notes.
- In-game tests - the tester next to developer builds that plays test scenarios with real clients against a fresh OpenMU test server and writes a report with a screenshot per step.
- Control socket - the developer socket through which scripts and the in-game tests drive the client.
- Translation system - how the .resx -> generated C++ accessors pipeline works, how to add a string or a locale, runtime locale switching, and observer hooks for cached UI strings.
All code changes - by humans and AI assistants - should follow
docs/CODING_RULES.md. Read it before opening a PR.
AI coding assistants (Claude Code, Cursor, Codex, etc.) should also read
AGENTS.md, which points at the same rules and at the build guide.
- Webzen
- Louis
- Qubit (tuservermu.com.ve)
- Community members of RaGEZONE and tuservermu.com.ve for posting fixes
- Nitoy for the MU Helper and RmlUi UI System
- janblade for the work on GPU Skinning and some rendering optimizations
- yesid for the SDL3 and SDL_GPU porting
- valentino for the Map Editor
- StinkyFax for the Socket Control automation
- Mosch for general maintenance, code quality and organizational fixes, and various feature support (such as MU Editor, data driven framework, etc)
- And to all the contributors who helped test, report issues, suggest improvements, and send PRs. 🔥