.:: Menu Rápido ::.

Linux | C/C++ | Downloads | SDL | [×]

sexta-feira, 23 de janeiro de 2009

Construindo um MMORPG - Parte 1

Você estava jogando (maravilhado) um destes Multi Massive Online Role-Playing Game... MMORPG's da vida e de repente parou para se perguntar: Como será que eles funcionam ?! Como será que se faz um ?!
Se você já se fez estas perguntas provavelmente morre de vontade de fazer o seu MMORPG's... e como você já tem muita experiência em jogos deste tipo estava precisando de uma mãozinha no desenvolvimento ! Pois você veio ao lugar certo !!!

» Post Completo...

sounds-3795.zip 890b723c
ambient-3795.zip 2942034a
tiles-3961.zip 5d9b6141
update-3998-4056.zip bc599f23
sprites-4235.zip 7d8a966c
update-4235-4319.zip 52b261c0
update-4319-4411.zip 7f87b88
particles-4412-4604.zip df32f8ed
update-4412-4604.zip d2078869
update-4604-4625.zip f7e1230e
update-4665-4696.zip f96a6c39
update-4732-4789.zip deec551
update-4789-4802.zip 8253631
update-4846-4957.zip e06f0358
update-4957-4963.zip cbc40a88
update-92f5898-5e3b3ca.zip c5a98a9e
database-5e3b3ca.zip f1380cc0
update-5e3b3ca..03da427.zip 218a7faf
update-03da427..54e6da8.zip 3ff4fcfb
items-54e6da8.zip e0512e95
update-54e6da8..b5a9d98.zip 8f561d9a
update-b5a9d98..589d43c.zip 2219df21
update-589d43c..90f54d3.zip 8a53af60
update-90f54d3..a915928.zip c6b49f79
update-a915928..3108eb8.zip 2a7577a9
update-3108eb8..82f97c6.zip 91a8f8f7

Para extrair use o comando: unzip -ao sounds-3795.zip. Repita para todos os arquivos e na mesma ordem em que se encontram no arquivo resources2.txt.
O cliente TMW não precisa dos arquivos extraídos, ele pode fazer isto virtualmente utilizando a lib libcurl PhysicsFS. Mas ele também irá procurar por arquivos extraídos, caso não os encontre nos arquivos compactados.

Experimente baixar e jogar The Mana World agora mesmo, pois no próximo artigo precisaremos dele.
Para o próximo artigo precisaremos da versão 0.0.26, mas se você puder instalar a versão 0.0.27 melhor ainda ! Pois a versão 0.0.27 possui efeitos especiais extras.

.:: Link's ::.
» Como funciona a criação de videogames
» Cave Story (Doukutsu Monogatari)

14 comentários:

Eric disse...

Olá Diogo, tudo bom? Conheci seu blog pelo site do Vinygodoi e acompanho tem uns 6 meses já...primeira vez q posto..hehehe!! tem um ano mais ou menos que eu e um amigo meu juntamos pra fazer um MMO, idêntico ao que vc postou ai..jogavamos muito e queriamos fazer!! hehehe..eu sou programador PHP tem 5 anos...creio que não terei problemas com programação em outras linguagens...ai eu tava tentando fazer um servidorzinho em C++ (aprendendo ao mesmo tempo) no linux e o resto no windows com o code::blocks...tive muitos problemas com sockets no linux e acabei que mudei pra java (Aprendendo também)..a gente conseguiu mais duas pessoas para o projeto..hehe..para design e 3D..não sabemos muito e estamos aprendendo com o tempo..tenho um acervo de links muito grande..envolvendo o seu e o do viny...eu gostaria de tirar umas dúvidas na teoria..tipo algo que estou em dúvidas no funcionamento do jogo..por exemplo..como o cliente irá conectar no banco de dados do servidor, sendo que ele não pode de maneira nenhuma conter os dados desse servidor? um amigo meu do www.projetoarret.com.br me falou q passava todas as informações (SELECT, INSERT e UPDATE) pelo socket...mas ai é que tá..se tiver 100 pessoas fazendo isso acaba com o server...correto??

Esses seus artigos irão me ajudar muito em todas essas partes...hehehe

Obrigado ai..pode ter certeza que vou acompanhar os seus próximos post e estou esperando os próximos artigos sobre MMO!!

Abraço

Diogo_RBG disse...

Eu apenas iniciei meus estudos sobre servidores MMORPG e ainda não tive a curiosidade de saber o que se passa entre o cliente TMW e o servidor eAthena.

Mas passar SELECT, INSERT e UPTADE por socket é no mínimo uma falha de segurança:
Veja isto: "Falha ao Preservar a Estrutura da Busca SQL (conhecido como Injeção de SQL): Se os atacantes podem influenciar as procuras SQL do seu programa, então eles podem controlar o seu banco de dados."

Quanto ao número de usuários que seu MMORPG pode suportar vai depender do seu servidor e também da intensidade de interação entre cliente e servidor... eu também não saberia pra onde correr !!!

Boa sorte com seu projeto e obrigado pela força !!!

Eric Maicon disse...

Do jeito que eu conversei com ele foi o que deu a entender..não sei se são os dados ou se são os SELECTS...mas eu penso que se passasse as informações do banco de dados (ip, login e senha) pelo socket fica mais perigoso ainda..não?

Eu tenho um estudo legal em SQL Injection na parte de PHP...vou dar um look nele para a parte de linguagens de desktop!! Valeu

Obrigado!

Diogo_RBG disse...

Um Servidor MMO segue os mesmos princípios dos servidores web.

Para manter a segurança banco de dados do servidor: ip, login e senha do banco de dados são conhecidos apenas pelo servidor.
O servidor é o único que tem acesso ao banco de dados e é ele que gera os SELECT's e tudo mais.
O cliente acessa a base de dados de forma indireta... ele pede tudo ao servidor.

Para manter a segurança do cliente já é mais complicado. Para preservar a senha basta envia-la codificada por um hash MD5 MD5(login+senha). No banco de dados a senha tbm está gravada de forma codificada. Para garantir a segurança do usuário de verdade já é mais difícil. Mas funciona do mesmo modo que o protocolo https.

vinigodoy disse...

É muito difícil fazer um jogo interativo em rede, principalmente na Internet, já que você tem que gerenciar atrasos de conexão.

Os jogos atuais já fazem misérias para disfarçar o lag e só esse aspecto já é bastante complicado de ser programado.

Esqueça jogos de ações de tempo real ou comportamento muito previsível.

Existem também as preocupações com segurança. Se você deixar coisas para o client fazer, você reduz a carga do server, mas permite que seus jogadores criem game hacks. Se você deixar tudo no server, terá que garantir um enorme poder de processamento. Existirão pessoas tentando descobrir como funciona o seu protocolo para tirar proveito de falhas no servidor.

Depois, tem o fato dele ser massivo. São 8000 jogadores realizando ações ao mesmo tempo, o que implica em ter uma IA leve e bem feita. Isso explica porque a IA de jogos massivos é geralmente rudimentar.

Eu não me preocuparia tanto com o BD, no quesito performance ou carga. Eles são feitos para muito mais transações do que isso. Eu me preocuparia mais em como organizar os dados para que boa parte deles possam ser mantidos na memória do client, sem muito acesso ao servidor. O que realmente compromete a performance na rede é fazer consultas constantes ao banco. Cada SELECT enviado sofre o mesmo lag do jogo, tanto na ida do comando pro server, quanto na volta dos dados para o client.

Eric disse...

ou seja...vc indica enviar o login, senha e ip pelo socket e assim nao precisa mais conectar e fazer selects pelo socket? (o bd)...

e nessa questão de desenvolvimento, segurança e criações de ferramentas vc indica C++ ou Java Vini?? pois pelo que eu lembre vc desenvolve os dois!!

Diogo_RBG disse...

Percebo que login, senha e IP são uma dúvida cruel a vc ! O que o vini disse não contradiz nada do que eu disse antes... login, senha e IP do banco de dados é uma coisa que o cliente nunca irá saber.
O login, senha e IP que pertencentes ao cliente são:
* login e senha do jogador
* IP do servidor... não do banco de dados.

Para que a senha do jogador não seja pega pela rede a gente codifica ela em hash: Hash(login+senha)... mas só isso não garante muita coisa. Eu pensei em outra coisa também: O cliente e o servidor combinam uma palavra qualquer... que pode ser inclusive ser uma data e daí vc manda assim: MD5(palavra+MD5(login+senha)) e o servidor compara com MD5(palavra+hash_senha).
hash_senha é o que foi gravado na base de dados e corresponde a MD5(login+senha).

C++ ou Java... eu respondo essa com outro post: O jogo, pasmem, é feito em Java e roda razoavelmente bem. Acho que fosse feita em C++...

Marcelo disse...

Oi Diogo,

Primeiro parabéns pelo blog, acabei de encontrá-lo e ainda estou me "divertindo".

Quanto à questão de autenticação, senha, e etc. Bom todo bom amante de MMORPG, sabe que mais dia menos dia acabam aparecendo os famigerados bots, dupes, hit maximizers, auto-heals, etc.

Esta sem dúvida é uma questão que dá pano para manga e está diretamente ligada à intercepção de dados entre cliente/servidor. Sinceramente, até hoje não joguei nenhum MMORPG que conseguisse "fechar todas suas portas" para tal vulnerabilidade.

Well... fora isto, gostaria de saber de vocês se alguém conhece um bom gerador de snippets para C++ que pudesse ser utilizado aqui no Blogger. Estou retomando meus estudos de Computação Gráfica e eventualmente vou querer postar alguns trechos de código no meu blog.

Diogo_RBG disse...

Sobre o uso de bots... bem, neste caso é ainda mais fácil deles existirem para seu jogo, pois qualquer bot feito para o servidor eAthena pode ser utilizado aqui ! Não tem pra onde correr !

Eu não conheço nenhum snippets que possa ser utilizado no blogger. Eu apenas utilizo um div com alguns parâmetros que tornam o parágrafo diferente dos demais... sem qualquer destaque de sintaxe.

Legal o seu blog. Não pude deixar de reparar que seu blog está todo em Inglês !

Marcelo disse...

Encontrei um formatador de snippets:

SyntaxHighlighter

Eis aqui um tutorial de como espetar no Blogger.

Para dizer a verdade não gostei muito... principalmente porquê quando você dá [ctr]+c/[ctrl]+v o número das linhas vêem junto. Não gostei muito... mas é melhor que nada.

Sobre meu blog estar em inglês... bom não é antinacionalismo não... é que via de regra, na época que eu estudava, eu conseguia encontrar muito mais gente utilizando o inglês. Vou estudar uma forma de manter um blog em paralelo em português, ou então algum esquema de transliteração.

[]s e obrigado!

Eric Maicon disse...

um dos meus amigos do projeto me falou existe um MMO q é impossível de se hackeiar...
www.talesofpirates.com

não sei..não joguei e não olhei direito..hehehe..mas eh uma boa dar uma pesquisada pra ver como realmente funciona!!

digo..em questões de segurança e se existe realmente algo sobre!!

Diogo_RBG disse...

Sei não... me parece propagando enganosa !!!
É que nem algoritmo de criptografia. Você só não o quebra porque tem mais o que fazer. A recompensa não vale o esforço do tempo e quantidade de máquinas necessárias para o feito.

Só jogando pra crer !!!

Anônimo disse...

Ja joguei tales of pirates...
E essa coisa de que nao pode ser hackear é mentira !
tinha um hack la de trade...
Voce colocava itens no trade e o trade era cancelado e seus itens desapareciam!
Mas pelo visto ja corrigiram este problema nunca mais ouvi falar sobre isso.

andrio pereira disse...

Esse seu post e muito interessante para mim.
ele tem continuações não achei link para próxima parte. ou você finalizou ele?