Ir para conteúdo
Faça parte da equipe! (2024) ×

alexandrekva

Membro
  • Total de Posts

    1
  • Registro em

  • Última visita

  • WCoins

    15

Titulo do usuário

  • TItulo de usuário
    AlexandreKVA
  • 1688515200

Últimos Visitantes

O bloco dos últimos visitantes está desativado e não está sendo visualizado por outros usuários.

alexandrekva's Achievements

Novato

Novato (1/15)

  • De grão em grão... Rara
  • Olá, mundo!
  • Agora que já nos conhecemos... Rara

Emblemas Recentes

14

Reputação

  1. Um dia bateu a curiosidade sobre como seriam feito os servidores privados do WYD, e resolvi procurar para ver se encontrava algo sobre. Acabei encontrando o projeto do Open WYD e a série de vídeos "Emulador WYD em NodeJS" do @ Rechdan (fiquei inconformado quando cheguei no 5º vídeo e percebi que era o último ). Vim aqui compartilhar um pouco do que aprendi para aqueles que, assim como eu, não sabe nada de programação de jogos, mas sabe alguma coisa de programação no geral. Início Primeiramente, é importante escolher uma Client do WYD (ex: BR 7.54, 7.55 e assim por diante). Pra muitos pode parecer óbvio, mas a parte visual do jogo já está toda pronta, o que estaremos fazendo será apenas conectar nosso Client com o nosso próprio Servidor. O jogo funciona a partir da comunicação entre o Client e o Servidor. Ao interagirmos com o jogo, o mesmo envia pacotes para o Servidor com as informações necessárias para que o mesmo processe a informação, enviando uma resposta ao jogo. Ou seja, durante o desenvolvimento do Servidor, precisamos ser capazes de receber um pacote do Cliente conectado, processarmos o pacote específico, e enviarmos uma resposta de volta para o cliente, atualizando-o. 1º Passo O primeiro passo é escolhermos um Client como base, como dito anteriormente. Na minha tentativa, comecei com o 7.54. A lista de Clients pode ser encontrada neste link. Tentei utilizar uma versão mais atual (se não me engano, a 7.62 foi utilizada na série pelo Rechdan), mas não conseguir iniciar o jogo com versões superiores a 7.55. Agradeceria se alguém puder disponibilizar o método de como atualizar os Clients através dos patches (entendi que seria essa a maneira de atualizar o jogo para versões posteriores, mas posso estar enganado). Com um Client em mãos, precisamos descobrir o IP da sua máquina, que será responsável por hostear o Servidor. Para encontrar seu endereço abra o Prompt de Comando e digite "ipconfig -all" (sem aspas) e procure pelo "Endereço IPv4". Agora será necessário editar o arquivo serverlist.bin dentro da pasta do WYD. Esse é o arquivo que armazena a informação dos servidores que o Client tentará se conectar. Se você baixar os Client da OnGame, por exemplo, lá estarão os servidores do antigo WYD BR, que obviamente não estão mais ativos, e por isso, todos os canais estarão offline. Existem alguns programas específicos para editarmos esse arquivo, já que você não consegue abrir esse arquivos e visualiza-los de maneira convencional. Perdi o link de onde baixei o meu, mas procurando na internet por "WYD serverlist editor" você também conseguirá encontrar. (adicionarei o link no post quando e se encontrar). Ao abrir o arquivo com o editor, vemos alguns ip's, como por exemplo: "http://www.wyd.com.br/wyd_br/servers/serv01.asp". Entendo que esse primeiro link seja responsável por retornar a quantidade de players no server. Você deve substituir pelo seu endpoint responsável por fazer o mesmo. No meu caso, coloquei como: "http://[meu ip]:3000/server". Juntamente com esse primeiro link, teremos uma lista de IP's. Já nessa lista, entendo que seja o IP de cada canal. No meu caso, substitui apenas o primeiro IP por [meu ip], que será utilizado hostname no server socket. (isso foi o que entendi vendo os vídeos e experimentando algumas coisas, por favor, se estiver errado, corrijam!) (caso alguém saiba e queira compartilhar também, acharia interessante explicar como funciona o editor do serverlist.bin, o que precisaria ser feito para visualizar o arquivo como txt ou algo do tipo) 2º Passo Tendo o serverlist editado, precisamos por no ar o nosso próprio servidor e você pode utilizar diversas tecnologias para isso. O Rechdan utilizou o NodeJS, mas no meu caso, por ter mais familiaridade com Kotlin, escolhi utilizar o KTOR. O primeiro passo é disponibilizar um endpoint responsável por retornar a quantidade de players no server. Esse endpoint deve ser o mesmo que você definiu na edição do serverlist. Nesse caso, criei um server na porta 3000 com o endpoint "http://[meu ip]:3000/server" que retorna um texto. Esse texto é a quantidade de players logados (acredito que seja entre 0 e 750), caso você mande 0, aparecerá um server vazio, e caso mande 750, o servidor aparecerá como FULL (pode ser que esses limites variem de acordo com cada Client, não tenho certeza). Inicialmente você pode deixar o endpoint retornando um valor fixo, como "100". Assim, ao menos um canal já deverá aparecer como disponível no jogo. 3º Passo Agora devemos criar a parte responsável por gerenciar o servidor do game propriamente dito. Nesse caso, o servidor tenta se conectar a um Socket na porta 8281. O IP deverá ser o definido na serverlist também. Caso tudo esteja correto, após preencher um ID e Senha, ao clicar em conectar, o Client se conectará com o seu server socket. 4º Passo Crie um listener para ficar escutando as mensagens enviadas pelo Client, geralmente os pacotes serão armazenados em um Buffer. (atente-se na ordenação dos bytes no Buffer, eles devem estar ordenados em Little Endian. No meu caso estava em Big Endian, e demorei um tempinho até descobrir isso). Ao tentar conectar, o client provavelmente enviará um pacote nas seguintes condições: - Um pacote de tamanho 4 seguido de um pacote de tamanho 116. - Um pacote de tamanho 120. O pacote de 4 bytes pode ser ignorado, é apenas uma msg para dizer que se conectou ao server. Caso ele venha no formato de 120 bytes, apenas ignore os 4 primeiros. São os 116 bytes que nos interessam. Todo pacote do WYD deve seguir a mesma estrutura. Os primeiros 12 bytes são o cabeçalho do pacote, e contém as seguintes informações: Os Bytes 0 e 1 são um Unsigned Short que indicam o tamanho do pacote. Nesse primeiro caso, será 116. O Byte 2 é um Unsigned Byte que contem a key para criptografia. O Byte 3 é um Unsigned Byte que contem a hash para verificação da criptografia/decriptografia. Os Bytes 4 e 5 são um Short que indicam o código do pacote (cada pacote é identificado através desse código, o código do pacote de conexão, por exemplo, é o 525). Os Bytes 6 e 7 são um Short que indicam o ID do cliente que enviou o pacote. Os Bytes 8, 9, 10 e 11 são um Unsigned Int que indicam um timestamp. Os demais Bytes são o conteúdo do pacote. (mais infos sobre byte, short, int, long, signed e unsigned) Os pacotes chegam ao seu servidor criptografados. Apenas os primeiros bytes não estão criptografados. Ou seja, as informações sobre o código do pacote, ID do cliente, timestamp e conteúdo estará completamente criptografado, e você não conseguirá manipula-lo. 5º Passo Precisamos agora descriptografar/criptografar os nossos pacotes. O algoritmo para tal está no repositório do Rechdan e também achei esse artigo interessante do @ raphaelts3 que fala um pouco mais a fundo sobre a criptografia do WYD (link do artigo). Estude os códigos e tente implementar a criptografia. (No meu caso, utilizei o ChatGPT para me ajudar no entendimento do código e converter para Kotlin). Para verificar se a criptografia está funcionando, descriptografe o pacote de conexão. Os 12 primeiros bytes do conteúdo do pacote (desconsiderando o header) são o login e os bytes 16 a 26 são a senha. Você pode transformar o pacote inteiro para uma string UTF-8. Se tudo estiver correto, você irá conseguir ver o ID e a Senha inseridos no cliente em seu pacote descriptografado. 6º Passo Agora que estamos nos recebendo os pacotes do Client e conseguindo descriptografá-los, vamos tentar enviar um pacote para o Client. Por enquanto, o único pacote que consegui enviar foi o que exibe um banner no topo da tela do Client com uma mensagem. Para o header desse pacote, utilize o código "257" e tamanho "108". Pode ser enviado um ID de cliente "0" e a chave de criptografia pode ser um Byte Unsigned aleatório entre 0 e 256. Para o conteúdo do pacote, converta uma string (sua mensagem) para um array de bytes. Após construir o seu pacote, criptográfe-o e envie para o Client, que deverá exibir a mensagem no topo da tela. Próximos passos Acredito que isso seja o básico do básico para que você seja capaz de criar um servidor de WYD inteiramente do zero. Para dar continuidade ao projeto, é importante entender o que o Client envia em cada pacote e o que ele espera receber como resposta. Até o momento, nem mesmo consegui ir para a tela de seleção de personagens (não sei se estou enviando um pacote diferente do que o Client 7.54 espera ou se há algum erro no mesmo). Será necessário entender as estruturas dos dados utilizados no jogo (mobs, itens, status, etc...) Também será necessário conectar-se com um banco de dados. Ou seja, praticamente nada foi feito, mas achei interessante compartilhar essa informações para quem, assim como eu, soubesse alguma coisa de programação mas não soubesse nada de servidores privados de WYD. (usuários avançados provavelmente vão achar esse conteúdo bem inútil, haha) Se eu conseguir avançar com algo além disso, volto aqui para atualizar o post. Link para o meu repositório (precisa de java para rodar) Dúvidas (minhas ou de vocês) P: É viável construir um servidor inteiramente do zero dessa forma? R: Não faço ideia, estou fazendo mais pela diversão. P: E a performance de um servidor feito dessa maneira? R: Também não sei como seria, afinal, nem ao menos consegui chegar na tela de personagens. P: Como faço para descobrir todos os pacotes que o jogo envia e espera receber? R: Gostaria muito de saber isso também, mas infelizmente não faço ideia. Espero que alguém possa dar uma luz nisso. Provavelmente escrevi alguma coisa que pode estar errada, então sintam-se a vontade para corrigir! (por favor)
×
×
  • Criar Novo...

Informação Importante

Nós fazemos uso de cookies no seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies , caso contrário, vamos supor que você está bem para continuar.