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 eClientInfo.bmdnã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.
- Windows:
Config.iniao lado domain.exe. - Linux:
~/.local/share/mu97k/Config.ini. A primeira execução o cria em janela a 1024×768.
| 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.