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