DocumentaciónCliente desde el source▾

Cliente desde el source

Además del cliente clásico con DLL, el servidor ahora es compatible con el cliente reconstruido desde código fuente: un port a C++ del main.exe del 0.97k, hecho por ingeniería inversa del binario original.

A diferencia del cliente con DLL —que es un ejecutable cerrado al que se le inyecta una librería—, acá tenés el código. Se compila, se modifica y se depura como cualquier proyecto de C++.

En qué estado está. Arranca, conecta, hace login, entra al mundo y se juega: terreno, personajes, inventario, equipo, chat, party, guild, tienda, baúl, combate y efectos funcionan. No es un cliente terminado — es una reconstrucción en curso y van apareciendo diferencias a medida que se ejercitan caminos nuevos. Para producción, el cliente con DLL sigue siendo la opción estable.

Cuál de los dos usar

Cliente con DLL Cliente desde el source
Cómo se configura la IP ClientInfo.bmd (InfoEncoder) server.cfg, texto plano
Cómo se obtiene carpeta lista para distribuir lo compilás vos
Estado estable, probado en producción reconstrucción en curso
Se puede modificar no, es un binario sí, es código fuente
Linux nativo no todavía no — ver más abajo

Si solo querés levantar un servidor y que la gente juegue, usá el cliente con DLL. Esta guía es para quien quiera compilarlo, estudiarlo o modificarlo.

Compilar

Necesitás Visual Studio 2022 con el toolset de C++ para escritorio.

  1. Abrir mu97k.sln
  2. Seleccionar configuración Debug y plataforma Win32
  3. Compilar

El ejecutable queda en bin/Client/main.exe. El proyecto enlaza directo sobre esa carpeta, que es donde viven los assets y la configuración, así que no hay copia intermedia ni riesgo de ejecutar un binario viejo.

La plataforma tiene que ser Win32 (x86). Todo el port asume punteros de 32 bits: las direcciones del binario original, los layouts de struct y los pools de memoria. En x64 no compila, y si compilara no funcionaría.

Las librerías que enlaza son todas del SDK de Windows (opengl32, glu32, winmm, ws2_32), salvo libjpeg que va incluida en el repositorio. No hay que instalar nada más.

Configurar: server.cfg

Acá está la diferencia principal con el cliente clásico. No se usa ClientInfo.bmd ni InfoEncoder: la configuración es un archivo de texto plano llamado server.cfg, al lado del ejecutable.

127.0.0.1 44405        ← ConnectServer (lista de servidores)
127.0.0.1 55901        ← GameServer (fallback)

CustomerName=MuLinux
ServerSerial=TbYehR2hFUPBKgZj
ClientVersion=0.97.11

Las direcciones

Con dos líneas se usa el flujo ConnectServer completo: el cliente pide la lista real de servidores, el servidor contesta con nombres y ocupación, y al elegir uno te redirige al GameServer. Con una sola línea conecta directo al GameServer, que es el comportamiento clásico.

Reemplazá 127.0.0.1 por la IP pública de tu VPS en las dos líneas.

La identidad del servidor

Los tres valores de abajo tienen que coincidir con los de tu servidor, en MuServer/GameServer/DATA/GameServerInfo - StartUp.dat. Si alguno no coincide, el cliente conecta pero nunca entra, y sin ningún mensaje útil:

Clave De dónde sale Qué pasa si no coincide
CustomerName CustomerName= del .dat Conecta, desencripta basura y se queda en “conectando al GameServer” para siempre
ServerSerial ServerSerial= del .dat Lo mismo, y además el login devuelve “versión incorrecta”
ClientVersion ServerVersion= del mismo .dat Login rechazado con “versión incorrecta”

CustomerName y ServerSerial alimentan la clave de encriptación, que el GameServer deriva de los dos combinados. Por eso cambiar el nombre del cliente rompe la conexión aunque todo lo demás esté bien.

Si se omiten, se usan los valores por defecto del proyecto (los del ejemplo de arriba). ClientVersion acepta tanto 0.97.11 como 09711.

Opciones del cliente

El 0.97k original lee estas opciones del registro de Windows, que es donde las deja el launcher oficial. Como acá no hay launcher, también se aceptan en server.cfg y, cuando están, ganan sobre el registro — así se puede distribuir el cliente ya configurado.

Clave Default Qué hace
MusicOnOff 0 Música de fondo. Viene apagada en el binario original; el ejemplo la trae en 1. El cliente no decodifica el mp3, lanza MuPlayer.exe.
SoundOnOff 1 Efectos de sonido.
Resolution 0 Índice 0..4 o ANCHOxALTO, pero sólo las cinco del binario: 640×480, 800×600, 1024×768, 1280×1024 y 1600×1200. Cualquier otra se ignora y arranca en 640×480.
WindowMode 1 1 = en ventana, 0 = pantalla completa.
Borderless 0 Sin barra de título ni borde. Sólo aplica en modo ventana.

Se aceptan como 0/1 o como on/off.

El modo ventana es un agregado: el 0.97k original sólo corre a pantalla completa y busca un modo de video de 16 bits de color que en Windows 10/11 ya no existe, así que el cambio de modo falla en silencio y la ventana queda sin bordes en una esquina.

Diagnóstico

El cliente escribe bin/Client/debug.log en cada arranque. La primera línea útil es la clave de encriptación derivada:

MuEmu: InitKeys CustomerName='MuLinux' Serial='TbYehR2hFUPBKgZj' -> EncDecKey1=0xC2 EncDecKey2=0x01
server.cfg: ClientVersion='09711'

Si el cliente se queda colgado conectando, esa línea es lo primero que hay que mirar: compará el CustomerName con el de tu servidor.

Linux: todavía no

El cliente no compila en Linux por ahora, y es lo que se viene.

El port está hecho contra el binario original de Windows: asume punteros de 32 bits, usa la API de Win32 para la ventana y el input, y OpenGL a través de wgl. Llevarlo a Linux es una etapa propia del proyecto —abstracción de plataforma y sistema de build con CMake— que arranca después de cerrar la reconstrucción 1:1.

Mientras tanto, el cliente corre en Windows contra un servidor Linux sin problema: el servidor es nativo de Linux desde el principio y la comunicación es por red.

El repositorio

El código vive en EmanuelCatania/Mu-97k-Client-Source.

Es desarrollo activo: la reconstrucción 1:1 contra el binario original todavía no está cerrada, y los avances se van mergeando por pull request. El README del repositorio documenta el estado por subsistema, cómo compilar y las trampas conocidas del port.