4 poin oleh GN⁺ 2024-03-04 | 1 komentar | Bagikan ke WhatsApp

Pemikiran tentang server Minecraft yang ditulis dengan Bash

  • Pembahasan tentang menulis server Minecraft dengan Bash.
  • Sebelumnya pernah mencoba dengan protokol klasik 2009, tetapi merasakan keterbatasan Bash dalam parsing data biner.
  • Menemukan cara membaca data dan menampilkan dump heksadesimal menggunakan read dan xxd.
  • Bash mengabaikan null byte dan tidak ada cara untuk mendeteksinya, sehingga data bisa rusak.

Membaca null byte di Bash

  • Menemukan cara memproses data biner yang mengandung null byte menggunakan dd dan xxd.
  • Dengan cara ini, pencocokan pola, ekstraksi data, dan lain-lain dapat dilakukan.
  • Menggunakan ncat untuk mendengarkan pada port TCP default Minecraft dan menjalankan skrip shell utama (mc.sh) saat ada koneksi masuk.

Protokolnya sebenarnya tidak begitu bagus

  • Hal pertama yang harus diimplementasikan agar server Minecraft dapat berfungsi adalah paket ping daftar server.
  • Menjelaskan kesulitan dalam mengimplementasikan tipe data seperti VarInts dan VarLongs.
  • Mengimplementasikan angka VarInt/VarLong menggunakan skema encoding LEB128.
  • Mengalami kesulitan dalam mengimplementasikan angka floating point IEEE754, lalu menyelesaikannya dengan awk.

Tipe data "Position"

  • Tipe data Position buatan Mojang menyimpan koordinat X, Y, Z dalam nilai Long 64-bit.
  • Tipe data ini cukup mudah diimplementasikan di Bash.

Named Binary Tag

  • NBT adalah format mirip JSON untuk data biner yang dibuat oleh Mojang.
  • Parser NBT hampir selesai diimplementasikan, tetapi kode hilang karena direktori proyek menggunakan tmpfs dan sistem mengalami crash.

Menulis server yang sebenarnya

  • Setelah melewati bagian matematis, akhirnya sampai pada bagian menarik dari membuat server yang sesungguhnya.
  • Klien harus menyelesaikan proses handshake dan mengirim beberapa paket agar bisa bergabung ke server.
  • Struktur data di dalam paket Join Game dan Chunk menjadi hambatan terbesar.

Sistem "plugin"

  • Agar server bisa melakukan lebih dari sekadar chunk sederhana, dibuat fungsi yang dapat dioverride berupa hook serta opsi agar server dapat memuat kode pengguna.
  • Dengan ini, berbagai fitur dapat dibuat, mulai dari mengubah tampilan dunia hingga membuat pemain berbunyi klik setiap kali mouse digerakkan.

Keanehan Witchcraft

  • Bash memiliki keterbatasan dalam menangani angka desimal.
  • Multiplayer tidak sepenuhnya berfungsi.
  • Witchcraft adalah server multithread, tetapi menggunakan hack untuk komunikasi antarthread.
  • Kecepatan pertukaran data lambat.
  • Hanya berjalan jika BusyBox terbaru (1.35.0) terpasang.

FAQ

  • Tanya jawab tentang dari mana ID blok berasal, asal nama "WitchCraft", dan sebagainya.

Sumber daya

  • Menyediakan tautan sumber daya seperti repositori Witchcraft dan dokumentasi protokol wiki.vg.

Pendapat GN⁺

  • Proyek ini menunjukkan kreativitas dan kemampuan pemecahan masalah pengembang dalam mengatasi keterbatasan Bash.
  • Mengimplementasikan server Minecraft dengan Bash mungkin sangat tidak efisien, tetapi pendekatan eksperimental seperti ini dapat membantu menemukan solusi baru.
  • Menerapkan teknik ini pada server game nyata tidak disarankan, tetapi bisa berguna untuk memahami batas bahasa scripting dan mempelajari cara mengatasinya.
  • Implementasi server yang lebih efisien dengan fungsi serupa tersedia dalam Java atau C++.
  • Proyek ini dapat menjadi materi edukasi yang berguna untuk memahami cara menangani protokol jaringan yang kompleks menggunakan Bash.

1 komentar

 
GN⁺ 2024-03-04
Komentar Hacker News
  • Pengalaman dengan server Minecraft yang bisa di-skrip

    Seorang pengguna yang memiliki banyak pengalaman mengerjakan server Minecraft yang bisa di-skrip untuk Java dan Bedrock (ScraM) menilainya mengesankan. Ia merasa ingin memberi nilai tambah karena menggunakan kata "duckduckgoing" dalam sebuah kalimat. Diskusi tersebut memiliki 92 komentar.

  • Pemahaman tentang eksponen negatif

    Ia menyebut bahwa eksponen negatif, yaitu 2^(-n), sama dengan 1/(2^n), dan menyatakan keterkejutannya karena penulis tidak mengingat contoh 2^-1 = 0.5 miliknya sendiri lalu meminta bantuan awk. Ia juga menyarankan bahwa jika menggunakan pustaka ctypes.sh, bash bisa mengakses libm, poll(), select(), dan sebagainya.

  • Pujian untuk situs hacker sejati

    Ia memuji ini sebagai situs hacker sejati dan mengatakan bahwa ini sangat hebat.

  • Kecintaan pada bash

    Ia mengatakan menyukai bash, sama seperti ia menyukai vim dan lua. Ia menekankan bahwa ini adalah satu biner tunggal berukuran kurang dari 2MB dan jauh lebih mumpuni daripada yang dibayangkan banyak orang. Ia menyebut bahwa dengan shellcheck dan kebiasaan yang baik, bash juga bisa mudah dibaca dan aman. Ia menjelaskan bahwa jika membutuhkan fitur tambahan, utilitas bisa ditambahkan dengan C/C++ tanpa harus memakai cara rumit seperti FFI, dan tanpa perlu memanggil begitu banyak dependensi yang tidak jelas melalui pip/npm dan sejenisnya.

  • Kekaguman pada pemrograman bash

    Ia mengungkapkan bahwa dirinya tidak mahir dalam pemrograman bash, tetapi terkejut melihat betapa mumpuninya bash dalam praktik.

  • Rasa penasaran tentang penulisan server kustom

    Ia penasaran apakah menulis server kustom untuk game komersial masih menjadi tren.

  • Pujian untuk Minecraft

    Ia menilai Minecraft sebagai salah satu game terhebat sejak Quake.

  • Kekaguman pada implementasi Minecraft

    Ia mengatakan sudah membaca banyak artikel tentang bagaimana Minecraft diimplementasikan, tetapi ini benar-benar luar biasa dan mungkin merupakan salah satu penjelasan teknis terbaik yang pernah ia baca. Ia memujinya sebagai karya kelas atas.