4 puntos por GN⁺ 2024-03-04 | 1 comentarios | Compartir por WhatsApp

Reflexiones sobre un servidor de Minecraft escrito en Bash

  • Reflexiona sobre escribir un servidor de Minecraft en Bash.
  • Antes lo intentó en 2009 con el protocolo clásico, pero sintió las limitaciones de Bash para analizar datos binarios.
  • Ideó una forma de leer datos y mostrar volcados hexadecimales usando read y xxd.
  • Bash ignora los bytes nulos y no tiene forma de detectarlos, por lo que los datos pueden corromperse.

Leer bytes nulos en Bash

  • Descubrió una forma de procesar datos binarios que incluyen bytes nulos usando dd y xxd.
  • Con este método se pueden hacer coincidencias de patrones, extracción de datos y más.
  • Usa ncat para escuchar en el puerto TCP predeterminado de Minecraft y, cuando entra una conexión, ejecutar el script principal de shell (mc.sh).

El protocolo en realidad no es tan bueno

  • Lo primero que hay que implementar para que el servidor funcione es el paquete de ping de la lista de servidores.
  • Explica las dificultades de implementar tipos de datos como VarInts y VarLongs.
  • Implementa números VarInt/VarLong usando el esquema de codificación LEB128.
  • Tuvo dificultades para implementar números de punto flotante IEEE754 y lo resolvió con awk.

El tipo de dato "Position"

  • El tipo de dato Position creado por Mojang almacena las coordenadas X, Y y Z en un valor Long de 64 bits.
  • Este tipo de dato puede implementarse con facilidad en Bash.

Named Binary Tag

  • NBT es un formato similar a JSON para datos binarios creado por Mojang.
  • Casi terminó de implementar un parser de NBT, pero usó el directorio del proyecto como tmpfs y perdió el código por una caída del sistema.

Escribir el servidor real

  • Más allá de la parte matemática, llega a la parte divertida de crear un servidor real.
  • Para unirse al servidor, el cliente debe completar el proceso de handshake y enviar algunos paquetes.
  • Las mayores trabas son las estructuras de datos dentro de los paquetes Join Game y Chunk.

Sistema de "plugins"

  • Para que el servidor pudiera hacer más que manejar chunks simples, creó hooks, funciones que pueden sobrescribirse, y una opción para que el servidor cargue código del usuario.
  • Con esto se pueden implementar funciones muy variadas, desde cambiar el aspecto del mundo hasta hacer que el jugador emita un sonido de tic al mover el mouse.

Rarezas de Witchcraft

  • Bash tiene limitaciones para manejar números decimales.
  • El multijugador no funciona por completo.
  • Witchcraft es un servidor multihilo, pero usa hacks para la comunicación entre hilos.
  • La velocidad de intercambio de datos es lenta.
  • Solo funciona si está instalada una versión reciente de BusyBox (1.35.0).

FAQ

  • Incluye preguntas y respuestas sobre de dónde salen los IDs de los bloques, el origen del nombre "WitchCraft" y más.

Recursos

  • Proporciona enlaces a recursos como el repositorio de Witchcraft y la documentación del protocolo en wiki.vg.

Opinión de GN⁺

  • Este proyecto muestra la creatividad y la capacidad de resolver problemas de un desarrollador que busca superar las limitaciones de Bash.
  • Implementar un servidor de Minecraft en Bash puede ser muy ineficiente, pero este tipo de enfoque experimental puede ayudar a encontrar nuevas soluciones.
  • No se recomienda aplicar esta técnica a un servidor de juego real, pero puede ser útil para aprender a entender las limitaciones de los lenguajes de scripting y cómo superarlas.
  • Entre las implementaciones de servidor más eficientes que ofrecen funciones similares están los servidores de Minecraft escritos en Java o C++.
  • Este proyecto puede ser un material educativo útil para entender cómo usar Bash para manejar protocolos de red complejos.

1 comentarios

 
GN⁺ 2024-03-04
Opiniones de Hacker News
  • Experiencia con servidores de Minecraft programables

    Un usuario con mucha experiencia trabajando en servidores de Minecraft programables para Java y Bedrock (ScraM) lo considera impresionante. Dice que le gustaría dar puntos extra por usar la palabra "duckduckgoing" en una oración. La discusión tiene 92 comentarios.

  • Comprensión de los exponentes negativos

    Menciona que un exponente negativo, es decir, 2^(-n), es igual a 1/(2^n), y expresa sorpresa de que el autor no recordara su propio ejemplo de 2^-1 = 0.5 y pidiera ayuda a awk. Sugiere que, si hubiera usado la biblioteca ctypes.sh, habría podido acceder desde bash a libm, poll(), select(), etc.

  • Elogio a un verdadero sitio para hackers

    Dice que este es un verdadero sitio para hackers y lo elogia como algo excelente.

  • Aprecio por bash

    Comenta que le gusta bash, tanto como vim y lua. Destaca que, en un solo binario de menos de 2 MB, es mucho más capaz de lo que mucha gente cree. Menciona que, usando shellcheck y buenos hábitos, bash también puede ser fácil de leer y seguro. Explica que, si se necesitan funciones adicionales, se pueden agregar utilidades con C/C++ sin recurrir a métodos complejos como FFI, y sin tener que traer innumerables dependencias poco claras usando pip/npm, etc.

  • Sorpresa ante la programación en bash

    Dice que no domina la programación en bash, pero expresa sorpresa por lo capaz que realmente es.

  • Curiosidad por escribir servidores personalizados

    Se pregunta si todavía sigue de moda escribir servidores personalizados para juegos comerciales.

  • Elogio a Minecraft

    Considera a Minecraft uno de los mejores juegos desde Quake.

  • Admiración por la implementación de Minecraft

    Dice que ha leído muchos artículos sobre cómo está implementado Minecraft, pero que esto es realmente asombroso y probablemente una de las mejores explicaciones técnicas que ha leído. Lo elogia como de primer nivel.