แนวคิดเกี่ยวกับเซิร์ฟเวอร์ Minecraft ที่เขียนด้วย Bash
- ข้อคิดเกี่ยวกับการเขียนเซิร์ฟเวอร์ Minecraft ด้วย Bash
- ก่อนหน้านี้เคยลองทำด้วยโปรโตคอลคลาสสิกปี 2009 แต่รู้สึกถึงข้อจำกัดของการพาร์สข้อมูลไบนารีใน Bash
- คิดวิธีใช้
read และ xxd เพื่ออ่านข้อมูลและแสดงผลเป็นเฮกซ์ดัมป์
- Bash จะมองข้าม null byte และไม่มีวิธีตรวจจับ ทำให้ข้อมูลอาจเสียหายได้
การอ่าน null byte ใน Bash
- ค้นพบวิธีจัดการข้อมูลไบนารีที่มี null byte ด้วย
dd และ xxd
- วิธีนี้ทำให้สามารถทำ pattern matching, การดึงข้อมูล และงานอื่น ๆ ได้
- ใช้
ncat เพื่อรอฟังบนพอร์ต TCP ปริยายของ Minecraft และเมื่อมีการเชื่อมต่อเข้ามาก็เรียกสคริปต์เชลล์หลัก (mc.sh)
โปรโตคอลจริง ๆ แล้วไม่ค่อยดีนัก
- สิ่งแรกที่ต้องทำให้ได้เพื่อให้เซิร์ฟเวอร์ Minecraft ใช้งานได้คือแพ็กเก็ต server list ping
- อธิบายความยากในการอิมพลีเมนต์ชนิดข้อมูลอย่าง VarInts และ VarLongs
- ใช้วิธีเข้ารหัสแบบ LEB128 เพื่ออิมพลีเมนต์ตัวเลข VarInt/VarLong
- เจอความยากในการอิมพลีเมนต์เลขทศนิยมแบบ IEEE754 และแก้ปัญหาด้วย
awk
ชนิดข้อมูล "Position"
- ชนิดข้อมูล Position ที่ Mojang สร้างขึ้นจะเก็บพิกัด X, Y, Z ไว้ในค่า Long ขนาด 64 บิต
- ชนิดข้อมูลนี้สามารถอิมพลีเมนต์ใน Bash ได้ค่อนข้างง่าย
Named Binary Tag
- NBT คือฟอร์แมตคล้าย JSON สำหรับข้อมูลไบนารีที่ Mojang สร้างขึ้น
- เกือบทำ NBT parser เสร็จแล้ว แต่ใช้ไดเรกทอรีโปรเจ็กต์บน tmpfs และโค้ดหายไปเพราะระบบล่ม
การเขียนเซิร์ฟเวอร์จริง
- หลังจากผ่านส่วนที่เป็นคณิตศาสตร์ ก็เข้าสู่ส่วนสนุกของการสร้างเซิร์ฟเวอร์จริง
- ไคลเอนต์ต้องทำกระบวนการ handshake ให้เสร็จและส่งแพ็กเก็ตอีกบางส่วนเพื่อเข้าร่วมเซิร์ฟเวอร์
- โครงสร้างข้อมูลภายในแพ็กเก็ต Join Game และ Chunk เป็นอุปสรรคที่ใหญ่ที่สุด
ระบบ "ปลั๊กอิน"
- เพื่อให้เซิร์ฟเวอร์ทำอะไรได้มากกว่าชังก์แบบเรียบง่าย จึงสร้าง
hook ที่สามารถ override ได้ และเพิ่มตัวเลือกให้เซิร์ฟเวอร์โหลดโค้ดของผู้ใช้ได้
- ทำให้สามารถทำฟีเจอร์ต่าง ๆ ได้ ตั้งแต่เปลี่ยนหน้าตาของโลกไปจนถึงทำให้ผู้เล่นส่งเสียงคลิกทุกครั้งที่ขยับเมาส์
ความแปลกประหลาดของ Witchcraft
- Bash มีข้อจำกัดในการจัดการตัวเลขทศนิยม
- ระบบหลายผู้เล่นยังทำงานได้ไม่สมบูรณ์
- Witchcraft เป็นเซิร์ฟเวอร์แบบมัลติเธรด แต่ใช้วิธีแฮ็กในการสื่อสารระหว่างเธรด
- การแลกเปลี่ยนข้อมูลช้า
- รันได้เฉพาะเมื่อมี BusyBox รุ่นใหม่ (1.35.0) ติดตั้งอยู่เท่านั้น
FAQ
- คำถามและคำตอบเกี่ยวกับเรื่องอย่าง block ID มาจากไหน และที่มาของชื่อ "WitchCraft"
ทรัพยากร
- มีลิงก์ทรัพยากร เช่น ที่เก็บโค้ด Witchcraft และเอกสารโปรโตคอลของ wiki.vg
ความเห็นของ GN⁺
- โปรเจ็กต์นี้แสดงให้เห็นถึงความคิดสร้างสรรค์และความสามารถในการแก้ปัญหาของนักพัฒนาที่พยายามก้าวข้ามข้อจำกัดของ Bash
- การอิมพลีเมนต์เซิร์ฟเวอร์ Minecraft ด้วย Bash อาจไม่มีประสิทธิภาพอย่างมาก แต่แนวทางเชิงทดลองแบบนี้อาจช่วยให้พบวิธีแก้ปัญหาใหม่ ๆ ได้
- ไม่แนะนำให้นำเทคนิคนี้ไปใช้กับเกมเซิร์ฟเวอร์จริง แต่มีประโยชน์ในการเรียนรู้ข้อจำกัดของภาษาสคริปต์และวิธีเอาชนะมัน
- หากต้องการเซิร์ฟเวอร์ที่มีประสิทธิภาพกว่าและให้ความสามารถคล้ายกัน ก็มีเซิร์ฟเวอร์ Minecraft ที่เขียนด้วย Java หรือ C++
- โปรเจ็กต์นี้อาจเป็นสื่อการเรียนรู้ที่มีประโยชน์ในการทำความเข้าใจวิธีจัดการโปรโตคอลเครือข่ายที่ซับซ้อนด้วย Bash
1 ความคิดเห็น
ความคิดเห็นใน Hacker News
ประสบการณ์กับเซิร์ฟเวอร์ Minecraft ที่เขียนสคริปต์ได้
ความเข้าใจเกี่ยวกับเลขชี้กำลังติดลบ
คำชื่นชมต่อเว็บแฮ็กเกอร์ที่แท้จริง
ความชอบที่มีต่อ bash
ความประหลาดใจต่อการเขียนโปรแกรมด้วย bash
ความสงสัยเกี่ยวกับการเขียนเซิร์ฟเวอร์แบบคัสตอม
คำยกย่องต่อ Minecraft
ความทึ่งต่อการอิมพลีเมนต์ Minecraft