SERVIDOR DE ULTIMA ONLINE NO LINUX
RUNUO + SUNUO + MONO + LINUX
Softwares necessários:
Mono-1.1.7:
http://www.mono-project.org/
SunUO-0.1.8:
http://max.kellermann.name/projects/sunuo
RunUO-1.0.0 Binary Distribution:
http://www.runuo.com/downloads/files/runuo-releases/RunUO-1.0.0.zip
1. INSTALAÇÃO
Baixe os sources - é necessário baixar o source do MONO mais novo, pois o MONO 1.0, por exemplo, é bastante instável para o SUNUO. A página do SUNUO recomenda o mono-1.1.7
Vamos começar instalando a libgdiplus (nos testes que realizei, ainda deixaram o servidor instável)
# wget http://go-mono.com/sources/libgdiplus-1.1/libgdiplus-1.1.7.tar.gz
# tar -zxf libgdiplus-1.1.7.tar.gz
Cheque se vc tem as libs necessárias para compilar a libgdiplus completa ;)
Algumas libs e dependências:
libpixman-dev
libcairo-dev
libfontconfig-dev
libfreetype6-dev
libpixman-dev
libxrender-dev
libjpeg-dev
libungif-dev
libtiff-dev
libpng12-dev
# ./configure
Cheque se:
cairo will be compiled with the following surface backends:
Xlib: yes
Quartz: no
XCB: no (requires XCB http://freedesktop.org/software/xcb)
PostScript: yes
PDF: no
PNG: yes
glitz: no (requires glitz http://freedesktop.org/software/glitz)
and the following font backends:
freetype: yes
atsui: no
* Installation prefix = /usr/local
* Codecs supported:
- TIFF: yes
- JPEG: yes
- GIF: yes
- PNG: yes
Ok, vamos para o próximo passo:
# make
# make install
ou
# checkinstall -D
# wget http://go-mono.com/sources/mono-1.1/mono-1.1.7.tar.gz
# tar -zxf mono-1.1.7.tar.gz
Para a compilação do MONO, vc irá precisar:
* gcc 3.3 ou mais novo
* GNU make
* glib 2.0 (desenvolvimento libglib2.0-dev)
* wget
Caso vc use Debian:
# apt-get install gcc make libglib2.0-dev wget
# ./configure
mcs source: $(top_srcdir)/mcs
GC: included
Globalization:
TLS: pthread
SIGALTSTACK: no
Engine: Building and using the JIT
2.0 Alpha: yes
JNI support: IKVM Native
libgdiplus: assumed to be installed
NOTA: A compilação do mono é demorada
# make
# make install
Pronto, se nenhum erro foi reportado, o mono foi instalado com sucesso.
2. CONFIGURAÇÃO
Agora, vc precisa pegar todos os arquivos com a extensão .mul do seu client e salvá-los em um diretório do servidor. Os arquivos são esses (UOSE):
anim2.mul lightidx.mul multi.mul stadifi0.mul statics3.mul
anim3.mul light.mul palette.mul stadifi1.mul statics4.mul
anim4.mul map0.mul radarcol.mul stadifi2.mul texidx.mul
animdata.mul map2.mul sjis2uni.mul stadifl0.mul texmaps.mul
animinfo.mul map3.mul skillgrp.mul stadifl1.mul tiledata.mul
anim.mul map4.mul skills.mul stadifl2.mul unifont1.mul
artidx.mul mapdif0.mul soundidx.mul staidx0.mul unifont2.mul
art.mul mapdif1.mul sound.mul staidx2.mul unifont.mul
fonts.mul mapdif2.mul speech.mul staidx3.mul
gumpart.mul mapdifl0.mul stadif0.mul staidx4.mul
gumpidx.mul mapdifl1.mul stadif1.mul statics0.mul
hues.mul mapdifl2.mul stadif2.mul statics2.mul
O ideal é vc copiá-los para um CD e depois deixar um backup .tar.gz deles. Basta:
# tar -zcf muls.tar.gz *.mul
Pronto, arquivo criado. Optei por jogar esses arquivos dentro de:
/var/runuo/muls
Crie um arquivo chamado sunuo.xml dentro do diretório do runuo, ex.:
# vim /var/runuo/etc/sunuo.xml
Ele deverá conter algo assim:
/var/runuo/muls/
Pronto. O servidor está preparado. Vamos subir o serviço e testar:
Dentro do diretório do seu RUNUO, execute:
# mono SunUO.exe
SunUO Version 0.1.8 http://max.kellermann.name/projects/sunuo/
on Unix 2.4.27.0, runtime 1.1.4322.573
Compiling scripts: legacy.
Verifying scripts: core[4 items, 0 mobiles] legacy[1654 items, 435 mobiles] - done (1658 items, 435 mobiles)
Enter the Ultima Online directory:
> /var/runuo/muls/
(ele te perguntará isso se vc não especificou corretamente o diretório contido no data-path em etc/sunuo.xml)
World: Loading...done (87789 items, 2350 mobiles) (6,0 seconds)
This server has no accounts.
Do you want to create an administrator account now? (y/n)
y
(aqui ele criará a conta de administrador do shard - pense bem no login e senha que serão utilizados)
Username: admin
Password: umpassword
Account created, continuing
Regions: Loading...done
Address: 127.0.0.1:2593
Address: 172.16.129.25:2593
World: Saving...done in 1,1 seconds.
Testando a conexão com um client:
Client: 172.16.128.45: Connected. [1 Online]
Login: 172.16.128.45: Valid credentials for 'admin'
Client: 172.16.128.45: Disconnected. [1 Online] [admin]
Client: 172.16.128.45: Connected. [1 Online]
Login: 172.16.128.45: Account 'admin' at character list
Login: 172.16.128.45: New character being created (account=admin)
- Character: Jimmi Cliff (serial=0x00000930)
- Started: Britain (1496, 1628, 10) in Trammel
Warning: data file mapdif3.mul not found
Warning: data file mapdifl3.mul not found
Warning: data file stadif3.mul not found
Warning: data file stadifl3.mul not found
Warning: data file stadifi3Client:
172.16.128.45: Disconnected. [1 Online] [admin]
OBS: Esse Warning pode ser desconsiderado.
3. TROUBLESHOOTING
Vários erros podem ser contornados logo no início:
3.1. Lentidão na compilacão dos Scripts - Se o seu equipamento tiver pouca RAM e um processador lento, tenha paciência...a compilação pode demorar horas. Em um P3-800mhz com 128, a compilação demorou 1h. Em um p3-1.2ghz com 1GB RAM a compilação demorou 30s ;)
Não entre em pânico (como eu entrei) se ele ficar travado nessa tela:
# mono SunUO.exe
SunUO Version 0.1.8 http://max.kellermann.name/projects/sunuo/
on Unix 2.4.22.0, runtime 1.1.4322.573
Please make sure you have Mono 1.1.7 or newer! (mono -V)
Compiling scripts: legacy[C#,2040
OBS: Lembre-se também que se vc tiver um equipamento lento e alterar uma vírgula em algum arquivo dentro do diretório de script, ele será compilado e o tempo será o mesmo :)
3.2. World: Loading...failed to load item: System.TypeInitializationException:
An exception was thrown by the type initializer for Server.TileData
---> System.ArgumentException: empty path Isso ocorre se vc não expecificou nenhum diretório no data-path do arquivo sunuo.xml, ou se vc não copiou os arquivos .mul do client corretamente.
NOTA: Existe um bug no SunUO que não permite a inclusão de diretórios com espaço - ex. Caso vc instalou o client pelo wine, e especificou no sunuo.xml:
/home/usuario/.wine/fake_windows/Program\ Files/EA\ GAMES...
O caracter \ causa um Exception e encerra o serviço.
3.3. Gdiplus.dll - Se vc não compilou a libgdiplus, provavelmente seu servidor irá cair com System Exception apontando para uma gdiplus.dll. Ele gerará um Crash log parecido com esse:
Server Crash Report
===================
RunUO Version 0.1.0, Build 8
Operating System: Unix 2.4.22.0
.NET Framework: 1.1.4322.573
Time: 30/5/2005 12:00:12
Mobiles: 2351
Items: 87791
Clients:
- Count: 0
Exception:
System.DllNotFoundException: gdiplus.dll
in (wrapper managed-to-native) System.Drawing.GDIPlus:
GdipGetGenericFontFamilySansSerif (intptr&)
.
.
.
Para resolver isso, ou edite o seu arquivo etc/sunuo.xml e adicione:
(procedimento ainda não testado)
Ou remova o diretório inteiro - Scripts/Misc/Reports ou ainda compile a libgdiplus corretamente :)
3.4. O client não consegue "ATACHAR" ao servidor - isso ocorre devido o erro na hora de subir o serviço nos endereços corretos - provavelmente ele só está escutando no localhost:2593. Vc consegue verificar isso, na hora que o shard sobe:
Verifying scripts: core[4 items, 0 mobiles] legacy[1654 items, 435 mobiles] - done (1658 items, 435 mobiles)
World: Loading...done (87790 items, 2351 mobiles) (14,0 seconds)
Regions: Loading...done
Address: 127.0.0.1:2593
Vc poderá configurar isso corretamente editando o Script:
# vim Scripts/Misc/ServerList.cs
Modifique a variável:
/* Null deixa com que o script ache o IP do equipamento*/
public const string Address = null;
/* Caso ele não funcione, especifique o IP (como no exemplo abaixo) para o shard retornar o IP corretamente para o client*/
public const string Address = "200.5.4.1";
/* Ou ainda*/
public const string Address = "login.dominio.com";
Se o seu serviço subiu normalmente, vc terá uma tela assim:
World: Loading...done (87789 items, 2350 mobiles) (6,0 seconds)
Regions: Loading...done
Address: 127.0.0.1:2593
Address: 172.16.129.25:2593
Veja que aqui ele achou o IP 172.16.129.25 e está escutando na porta 2593.
Caso vc esteja atrás de um firewall (no caso desse exemplo), certifique-se que ele faz NAT (com ou sem port forwarding, dependendo da sua configuração) e que no script ServerList.cs o seu IP público está especificado corretamente.
--
by Rodrigo Fraga
rodrigo.fraga@gmail.com