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
Opiniones de Hacker News
Experiencia con servidores de Minecraft programables
Comprensión de los exponentes negativos
Elogio a un verdadero sitio para hackers
Aprecio por bash
Sorpresa ante la programación en bash
Curiosidad por escribir servidores personalizados
Elogio a Minecraft
Admiración por la implementación de Minecraft