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
Comentários do Hacker News
Experiência com um servidor de Minecraft scriptável
Entendimento sobre expoentes negativos
Elogio a um verdadeiro site hacker
Carinho pelo bash
Surpresa com a programação em bash
Curiosidade sobre escrever servidores customizados
Elogio ao Minecraft
Admiração pela implementação do Minecraft