4 pontos por GN⁺ 2024-03-04 | 1 comentários | Compartilhar no WhatsApp

Reflexões sobre um servidor de Minecraft escrito em Bash

  • Reflexões sobre escrever um servidor de Minecraft em Bash.
  • Anteriormente, houve uma tentativa em 2009 com o protocolo clássico, mas foram percebidas limitações no Bash para fazer parsing de dados binários.
  • Foi criada uma forma de ler dados com read e xxd e exibir um dump hexadecimal.
  • O Bash ignora bytes nulos e não há como detectá-los, o que pode corromper os dados.

Lendo bytes nulos no Bash

  • Foi descoberta uma forma de processar dados binários com bytes nulos usando dd e xxd.
  • Com esse método, é possível fazer pattern matching, extrair dados e mais.
  • Usa-se ncat para ficar escutando na porta TCP padrão do Minecraft e, quando uma conexão chega, executar o script principal de shell (mc.sh).

O protocolo na verdade não é tão bom

  • A primeira coisa que precisa ser implementada para um servidor de Minecraft funcionar é o pacote de ping da lista de servidores.
  • São explicadas as dificuldades de implementar tipos de dados como VarInts e VarLongs.
  • Números VarInt/VarLong são implementados usando o esquema de codificação LEB128.
  • Houve dificuldade para implementar números de ponto flutuante IEEE754, resolvida com awk.

Tipo de dado "Position"

  • O tipo de dado Position, criado pela Mojang, armazena coordenadas X, Y e Z em um valor Long de 64 bits.
  • Esse tipo de dado pode ser implementado com facilidade em Bash.

Named Binary Tag

  • NBT é um formato semelhante a JSON para dados binários criado pela Mojang.
  • A implementação de um parser de NBT estava quase concluída, mas o código foi perdido depois que o diretório do projeto foi usado como tmpfs e o sistema travou.

Escrevendo o servidor de fato

  • Depois da parte matemática, chega-se à parte divertida de criar um servidor de verdade.
  • Para que o cliente entre no servidor, ele precisa concluir o processo de handshake e enviar alguns pacotes.
  • As estruturas de dados dentro dos pacotes Join Game e Chunk são o maior obstáculo.

Sistema de "plugins"

  • Para que o servidor pudesse fazer mais do que apenas chunks simples, foram criadas hooks, que são funções sobregraváveis, e uma opção para o servidor carregar código do usuário.
  • Com isso, é possível implementar desde mudanças na aparência do mundo até fazer o jogador emitir sons de clique ao mover o mouse.

Particularidades do Witchcraft

  • O Bash tem limitações para lidar com números decimais.
  • O modo multiplayer não funciona completamente.
  • O Witchcraft é um servidor multithread, mas usa hacks para comunicação entre threads.
  • A troca de dados é lenta.
  • Só roda quando a versão mais recente do BusyBox (1.35.0) está instalada.

FAQ

  • Perguntas e respostas sobre de onde vêm os IDs de blocos, a origem do nome "WitchCraft" e outros temas.

Recursos

  • São fornecidos links de recursos como o repositório do Witchcraft e a documentação do protocolo em wiki.vg.

Opinião do GN⁺

  • Este projeto mostra a criatividade e a capacidade de resolver problemas de um desenvolvedor ao tentar superar as limitações do Bash.
  • Implementar um servidor de Minecraft em Bash pode ser extremamente ineficiente, mas esse tipo de abordagem experimental pode ajudar a encontrar novas soluções.
  • Não é recomendado aplicar essa técnica em um servidor de jogo real, mas ela pode ser útil para entender os limites de linguagens de script e aprender a contorná-los.
  • Implementações de servidor mais eficientes com funcionalidades semelhantes incluem servidores de Minecraft escritos em Java ou C++.
  • Este projeto pode servir como um material educacional útil para entender como lidar com protocolos de rede complexos usando Bash.

1 comentários

 
GN⁺ 2024-03-04
Comentários do Hacker News
  • Experiência com um servidor de Minecraft scriptável

    Um usuário com muita experiência trabalhando em servidores de Minecraft scriptáveis para Java e Bedrock (ScraM) avaliou isso como impressionante. Disse que gostaria de dar pontos extras pelo uso da palavra "duckduckgoing" em uma frase. A discussão tem 92 comentários.

  • Entendimento sobre expoentes negativos

    Menciona que expoentes negativos, ou seja, 2^(-n), são iguais a 1/(2^n), e expressa surpresa pelo fato de o autor não se lembrar do próprio exemplo 2^-1 = 0.5 e recorrer ao awk para obter ajuda. Sugere que, se tivesse usado a biblioteca ctypes.sh, poderia ter acessado libm, poll(), select() e mais no bash.

  • Elogio a um verdadeiro site hacker

    Diz que este é um verdadeiro site hacker e o elogia como algo muito bom.

  • Carinho pelo bash

    Afirma gostar de bash tanto quanto de vim e lua. Enfatiza que, em um único binário com menos de 2 MB, ele é muito mais capaz do que muita gente imagina. Menciona que, com shellcheck e bons hábitos, bash também pode ser legível e seguro. Explica que, se forem necessários recursos adicionais, é possível acrescentar utilitários em C/C++ sem recorrer a métodos complexos como FFI, nem puxar inúmeras dependências obscuras com pip/npm etc.

  • Surpresa com a programação em bash

    Diz que não é habilidoso em programação bash, mas expressa surpresa com o quão capaz ela realmente é.

  • Curiosidade sobre escrever servidores customizados

    Pergunta se ainda é comum escrever servidores customizados para jogos comerciais.

  • Elogio ao Minecraft

    Avalia Minecraft como um dos melhores jogos desde Quake.

  • Admiração pela implementação do Minecraft

    Diz que já leu muitos artigos sobre a forma como Minecraft foi implementado, mas que isto é realmente surpreendente e talvez uma das melhores explicações técnicas que já leu. Elogia como algo de altíssimo nível.