Cliente del juego
El cliente es un port a C++ del main.exe original del 0.97k, reconstruido por ingeniería inversa. Se comporta igual que el binario original y, sobre esa base, integra todo lo que antes hacía el Main.dll de inyección: modo ventana, resoluciones, minimapa, menú de opciones, multiidioma y customs.
Corre en Windows y Linux, y el código está en EmanuelCatania/Mu-97k-Client-Source.
El cliente con DLL quedó deprecado.
Main.dll, InfoEncoder yClientInfo.bmdya no se usan ni se distribuyen. Si venías de ese cliente, mirá Si venías del cliente con DLL.
| Plataforma | Estado |
|---|---|
| Windows x86 (backend Win32 o SDL3) | Completo |
| Linux x86 (backend SDL3) | Completo; con NVIDIA conviene X11 |
Cada versión del cliente indica en su Release con qué versión del servidor funciona. Usá siempre la misma versión de los dos lados (por ejemplo, cliente 0.97.30 con servidor 0.97.30).
Cómo funciona la conexión
La dirección del servidor y su identidad van compiladas dentro del cliente, como en MU 5.2. No hay archivo de configuración de conexión que distribuir: cada servidor compila su propio cliente.
Por eso los Releases del cliente no traen ejecutables: un ejecutable publicado apuntaría a un servidor que no es el tuyo.
1. Apuntar el cliente a tu servidor
Cloná el repositorio y editá src/Config/ServerConfig.h:
git clone https://github.com/EmanuelCatania/Mu-97k-Client-Source.git
cd Mu-97k-Client-Source
constexpr char ConnectServerIP[] = "mu.tu-dominio.com";
constexpr unsigned short ConnectServerPort = 44405; // 0 = sin ConnectServer
constexpr char GameServerIP[] = "mu.tu-dominio.com";
constexpr unsigned short GameServerPort = 55901;
constexpr char CustomerName[] = "MuLinux";
constexpr char ServerSerial[] = "TbYehR2hFUPBKgZj";
constexpr char ClientVersion[] = "0.97.11";
La dirección puede ser una IP o un nombre de host. Conviene un nombre: el servidor puede mudarse de IP sin recompilar el cliente. Si el dominio está en Cloudflare, el registro tiene que ir sin proxy (“DNS only”): el proxy sólo deja pasar tráfico web y corta las conexiones del juego.
Los puertos son los del servidor: 44405 para el ConnectServer (la lista de servidores) y 55901 para el GameServer. Con ConnectServerPort = 0 el cliente conecta directo al GameServer.
La identidad tiene que coincidir con MuServer/GameServer/DATA/GameServerInfo - StartUp.dat del servidor. Si alguno de estos valores no coincide, el cliente conecta pero nunca entra, sin mostrar un error útil:
| Valor | Del .dat |
Si no coincide |
|---|---|---|
CustomerName |
CustomerName= |
Se queda en “conectando al GameServer” para siempre |
ServerSerial |
ServerSerial= |
Lo mismo, y además el login responde “versión incorrecta” |
ClientVersion |
ServerVersion= |
Login rechazado con “versión incorrecta” |
Si no cambiaste esos valores en el servidor, los del ejemplo ya coinciden con el servidor de Docker.
2. Compilar
El cliente es siempre de 32 bits (x86), también en un Windows o Linux de 64 bits: el port reproduce las estructuras de memoria del binario original.
Windows
Requiere Visual Studio 2022 con “Desarrollo para el escritorio con C++” (incluye CMake). Abrí mu97k.sln, elegí Release y plataforma Win32, y compilá. O desde una terminal:
cmake -S . -B build -A Win32 -T v143
cmake --build build --config Release
El ejecutable queda en bin/Client/main.exe, junto a los assets.
Linux
Hace falta CMake 3.25+, Ninja, GCC con soporte -m32 y las bibliotecas de desarrollo de 32 bits. La lista de paquetes para Arch, Debian/Ubuntu y Fedora está en el README del cliente.
# Arch. Debian/Ubuntu: /usr/lib/i386-linux-gnu/pkgconfig. Fedora: /usr/lib/pkgconfig
export PKG_CONFIG_LIBDIR=/usr/lib32/pkgconfig:/usr/share/pkgconfig
cmake --preset linux-x86-release
cmake --build --preset linux-x86-release
Para armar el paquete que se distribuye (main, Data, launch.sh y licencias):
python3 .github/scripts/package_linux.py build/linux-x86-release dist
Genera dist/mu97k-0.97.30-linux-x86.tar.gz.
Sin instalar compiladores
Si no querés preparar un entorno de compilación, podés usar GitHub Actions: hacé un fork del repositorio, habilitá Actions en tu fork, editá src/Config/ServerConfig.h desde la web de GitHub y esperá a que termine el workflow. En la pestaña Actions vas a encontrar como artefactos el main.exe de Windows y el paquete completo de Linux (mu97k-linux-release).
3. Distribuir
Windows: comprimí la carpeta bin/Client (el main.exe, la carpeta Data y Config.ini). No hace falta incluir main.map ni debug.log.
Linux: distribuí el .tar.gz del paso anterior. El jugador lo descomprime en una partición Linux (en NTFS se pierden los permisos de ejecución) y ejecuta ./launch.sh, sin sudo. Necesita las bibliotecas de 32 bits del sistema que lista el README del cliente.
Si cambia la dirección del servidor, hay que recompilar y redistribuir el ejecutable. Si usaste un nombre de host, alcanza con apuntar el DNS a la IP nueva.
Opciones del jugador
Las preferencias se guardan en Config.ini, con las mismas secciones que usaba el Main.dll, así que sirve un Config.ini que ya tengas. La mayoría se cambia desde el menú de opciones del juego.
- Windows:
Config.inial lado delmain.exe. - Linux:
~/.local/share/mu97k/Config.ini. El primer arranque lo crea en ventana a 1024×768.
| Clave | Qué hace |
|---|---|
[Window] WindowMode |
1 = en ventana, 0 = pantalla completa |
[Window] Borderless |
1 = ventana sin borde |
[Window] Resolution |
0 640×480, 1 800×600, 2 1024×768, 3 1280×1024, 4 1280×720, 5 1366×768, 6 1600×900, 7 1920×1080 |
[Sound] EnableSound, EnableMusic |
Efectos y música (1 / 0) |
[Sound] SoundLevel, MusicLevel |
Volumen de 0 a 9 |
[Language] LangSelection |
Idioma de la interfaz: Eng, Spn o Por |
[MiniMap] Alpha, ZoomLevel |
Transparencia y zoom del minimapa |
[Font] FontName, FontHeight… |
Fuente del juego |
[Antilag] Delete… |
Apagan sombras, objetos, efectos, alas y otras partes del render para equipos lentos |
Linux con GPUs NVIDIA
Con NVIDIA, corré el cliente en X11:
SDL_VIDEODRIVER=x11 ./launch.sh
NVIDIA no distribuye la plataforma EGL de Wayland en 32 bits: sin ella Wayland usa render por software (el cliente lo detecta y pasa solo a X11), y con ella funciona pero rinde mucho menos que en X11. Con Intel y AMD, Wayland nativo funciona bien.
Si venías del cliente con DLL
| Antes (DLL) | Ahora |
|---|---|
IP en MainInfo.ini + InfoEncoder → ClientInfo.bmd |
Dirección en src/Config/ServerConfig.h, compilada |
Main.dll inyectado en main.exe |
Todo integrado en el cliente |
Customs en ClientInfo.bmd + item.bmd regenerado |
El servidor manda las definiciones; el cliente sólo lleva los modelos. Ver Customs |
Config.ini del DLL |
El mismo archivo, con las mismas claves |
| Sólo Windows | Windows y Linux |
Las tablas del Encoder que ya tenías (CustomItem.txt, CustomGlow.txt, etc.) se siguen usando, pero ahora van en el servidor.
Resolución de problemas
El cliente conecta pero no entra, o se queda en “conectando”: revisá CustomerName, ServerSerial y ClientVersion contra el GameServerInfo - StartUp.dat del servidor. El cliente escribe un debug.log (en Windows, en la carpeta del cliente; en Linux, en ~/.local/share/mu97k/) con la dirección usada y la clave derivada:
ServerConfig: ConnectServer=mu.tu-dominio.com:44405 GameServer=mu.tu-dominio.com:55901 version='09711'
MuEmu: InitKeys CustomerName='MuLinux' Serial='TbYehR2hFUPBKgZj' -> EncDecKey1=0xC2 EncDecKey2=0x01
No aparece la lista de servidores: verificá que el puerto 44405/tcp esté abierto y que PUBLIC_IP del servidor sea la IP pública correcta. Si el dominio pasa por Cloudflare, tiene que estar en “DNS only”.
Los items custom se ven mal o no se ven: el cliente y el servidor tienen que ser de la misma versión, y los modelos del item tienen que estar en la carpeta Data del cliente.