DocumentaçãoCliente do jogo▾

Cliente do jogo

O cliente é um port em C++ do main.exe original do 0.97k, reconstruído por engenharia reversa. Ele se comporta igual ao binário original e, sobre essa base, integra tudo o que o Main.dll de injeção fazia: modo janela, resoluções, minimapa, menu de opções, vários idiomas e customs.

Roda no Windows e no Linux, e o código está em EmanuelCatania/Mu-97k-Client-Source.

O cliente com DLL foi descontinuado. Main.dll, InfoEncoder e ClientInfo.bmd não são mais usados nem distribuídos. Se você vem desse cliente, veja Se você vem do cliente com DLL.

Plataforma Estado
Windows x86 (backend Win32 ou SDL3) Completo
Linux x86 (backend SDL3) Completo; com NVIDIA, prefira X11

Cada versão do cliente indica no seu Release com qual versão do servidor funciona. Use sempre a mesma versão dos dois lados (por exemplo, cliente 0.97.30 com servidor 0.97.30).

Como funciona a conexão

O endereço do servidor e sua identidade vão compilados dentro do cliente, como no MU 5.2. Não há arquivo de configuração de conexão para distribuir: cada servidor compila o seu próprio cliente.

Por isso os Releases do cliente não trazem executáveis: um executável publicado apontaria para um servidor que não é o seu.

1. Apontar o cliente para o seu servidor

Clone o repositório e edite src/Config/ServerConfig.h:

git clone https://github.com/EmanuelCatania/Mu-97k-Client-Source.git
cd Mu-97k-Client-Source
constexpr char           ConnectServerIP[]   = "mu.seu-dominio.com";
constexpr unsigned short ConnectServerPort   = 44405;   // 0 = sem ConnectServer
constexpr char           GameServerIP[]      = "mu.seu-dominio.com";
constexpr unsigned short GameServerPort      = 55901;
constexpr char           CustomerName[]      = "MuLinux";
constexpr char           ServerSerial[]      = "TbYehR2hFUPBKgZj";
constexpr char           ClientVersion[]     = "0.97.11";

O endereço pode ser um IP ou um nome de host. Um nome é melhor: o servidor pode mudar de IP sem recompilar o cliente. Se o domínio está na Cloudflare, o registro tem que ficar sem proxy (“DNS only”): o proxy só deixa passar tráfego web e corta as conexões do jogo.

As portas são as do servidor: 44405 para o ConnectServer (a lista de servidores) e 55901 para o GameServer. Com ConnectServerPort = 0 o cliente conecta direto ao GameServer.

A identidade tem que coincidir com o MuServer/GameServer/DATA/GameServerInfo - StartUp.dat do servidor. Se algum desses valores não coincidir, o cliente conecta mas nunca entra, sem mostrar um erro útil:

Valor Do .dat Se não coincidir
CustomerName CustomerName= Fica em “conectando ao GameServer” para sempre
ServerSerial ServerSerial= O mesmo, e o login ainda responde “versão incorreta”
ClientVersion ServerVersion= Login recusado com “versão incorreta”

Se você não mudou esses valores no servidor, os do exemplo já coincidem com o servidor do Docker.

2. Compilar

O cliente é sempre de 32 bits (x86), mesmo num Windows ou Linux de 64 bits: o port reproduz as estruturas de memória do binário original.

Windows

Requer o Visual Studio 2022 com “Desenvolvimento para desktop com C++” (inclui o CMake). Abra mu97k.sln, escolha Release e a plataforma Win32, e compile. Ou por um terminal:

cmake -S . -B build -A Win32 -T v143
cmake --build build --config Release

O executável fica em bin/Client/main.exe, junto aos assets.

Linux

É preciso CMake 3.25+, Ninja, GCC com suporte a -m32 e as bibliotecas de desenvolvimento de 32 bits. A lista de pacotes para Arch, Debian/Ubuntu e Fedora está no README do 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 montar o pacote que se distribui (main, Data, launch.sh e licenças):

python3 .github/scripts/package_linux.py build/linux-x86-release dist

Ele gera dist/mu97k-0.97.30-linux-x86.tar.gz.

Sem instalar compiladores

Se você não quer preparar um ambiente de compilação, pode usar o GitHub Actions: faça um fork do repositório, habilite o Actions no seu fork, edite src/Config/ServerConfig.h pelo site do GitHub e espere o workflow terminar. Na aba Actions você vai encontrar como artefatos o main.exe do Windows e o pacote completo do Linux (mu97k-linux-release).

3. Distribuir

Windows: compacte a pasta bin/Client (o main.exe, a pasta Data e o Config.ini). Não é preciso incluir main.map nem debug.log.

Linux: distribua o .tar.gz do passo anterior. O jogador o extrai numa partição Linux (em NTFS as permissões de execução se perdem) e executa ./launch.sh, sem sudo. Ele precisa das bibliotecas de 32 bits do sistema listadas no README do cliente.

Se o endereço do servidor mudar, é preciso recompilar e redistribuir o executável. Se você usou um nome de host, basta apontar o DNS para o IP novo.

Opções do jogador

As preferências ficam no Config.ini, com as mesmas seções que o Main.dll usava, então um Config.ini que você já tenha continua servindo. A maioria pode ser alterada pelo menu de opções do jogo.

Chave O que faz
[Window] WindowMode 1 = em janela, 0 = tela cheia
[Window] Borderless 1 = janela sem borda
[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 Efeitos e música (1 / 0)
[Sound] SoundLevel, MusicLevel Volume de 0 a 9
[Language] LangSelection Idioma da interface: Eng, Spn ou Por
[MiniMap] Alpha, ZoomLevel Transparência e zoom do minimapa
[Font] FontName, FontHeight… Fonte do jogo
[Antilag] Delete… Desligam sombras, objetos, efeitos, asas e outras partes do render em computadores lentos

Linux com GPUs NVIDIA

Com NVIDIA, rode o cliente no X11:

SDL_VIDEODRIVER=x11 ./launch.sh

A NVIDIA não distribui a plataforma EGL do Wayland em 32 bits: sem ela o Wayland usa render por software (o cliente detecta e passa sozinho para o X11), e com ela funciona, mas rende muito menos que no X11. Com Intel e AMD, o Wayland nativo funciona bem.

Se você vem do cliente com DLL

Antes (DLL) Agora
IP no MainInfo.ini + InfoEncoder → ClientInfo.bmd Endereço em src/Config/ServerConfig.h, compilado
Main.dll injetado no main.exe Tudo integrado ao cliente
Customs no ClientInfo.bmd + item.bmd regenerado O servidor envia as definições; o cliente só leva os modelos. Veja Customs
Config.ini do DLL O mesmo arquivo, com as mesmas chaves
Só Windows Windows e Linux

As tabelas do Encoder que você já tinha (CustomItem.txt, CustomGlow.txt etc.) continuam sendo usadas, mas agora ficam no servidor.

Solução de problemas

O cliente conecta mas não entra, ou fica em “conectando”: confira CustomerName, ServerSerial e ClientVersion com o GameServerInfo - StartUp.dat do servidor. O cliente escreve um debug.log (no Windows, na pasta do cliente; no Linux, em ~/.local/share/mu97k/) com o endereço usado e a chave derivada:

ServerConfig: ConnectServer=mu.seu-dominio.com:44405 GameServer=mu.seu-dominio.com:55901 version='09711'
MuEmu: InitKeys CustomerName='MuLinux' Serial='TbYehR2hFUPBKgZj' -> EncDecKey1=0xC2 EncDecKey2=0x01

A lista de servidores não aparece: verifique se a porta 44405/tcp está aberta e se o PUBLIC_IP do servidor é o IP público correto. Se o domínio passa pela Cloudflare, ele tem que estar em “DNS only”.

Os itens custom aparecem errados ou não aparecem: cliente e servidor têm que ser da mesma versão, e os modelos do item têm que estar na pasta Data do cliente.