4 คะแนน โดย GN⁺ 2024-03-04 | 1 ความคิดเห็น | แชร์ทาง WhatsApp

แนวคิดเกี่ยวกับเซิร์ฟเวอร์ 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 ความคิดเห็น

 
GN⁺ 2024-03-04
ความคิดเห็นใน Hacker News
  • ประสบการณ์กับเซิร์ฟเวอร์ Minecraft ที่เขียนสคริปต์ได้

    ผู้ใช้รายหนึ่งที่มีประสบการณ์มากในการทำงานกับเซิร์ฟเวอร์ Minecraft ที่เขียนสคริปต์ได้สำหรับ Java และ Bedrock (ScraM) ประเมินว่าสิ่งนี้น่าประทับใจมาก อยากให้คะแนนพิเศษกับการใช้คำว่า "duckduckgoing" ในประโยค การสนทนานี้มีความคิดเห็น 92 รายการ

  • ความเข้าใจเกี่ยวกับเลขชี้กำลังติดลบ

    มีการกล่าวถึงว่าเลขชี้กำลังติดลบ หรือ 2^(-n) เท่ากับ 1/(2^n) และแสดงความประหลาดใจที่ผู้เขียนจำตัวอย่าง 2^-1 = 0.5 ของตัวเองไม่ได้จนต้องขอความช่วยเหลือจาก awk พร้อมเสนอว่าถ้าใช้ไลบรารี ctypes.sh ก็น่าจะเข้าถึง libm, poll(), select() ฯลฯ ได้จาก bash

  • คำชื่นชมต่อเว็บแฮ็กเกอร์ที่แท้จริง

    บอกว่านี่คือเว็บของแฮ็กเกอร์ที่แท้จริง และชื่นชมว่ายอดเยี่ยมมาก

  • ความชอบที่มีต่อ bash

    บอกว่าชอบ bash และชอบพอๆ กับ vim และ lua พร้อมเน้นว่ามันเป็นไบนารีเดี่ยวขนาดไม่ถึง 2MB ที่มีความสามารถมากกว่าที่หลายคนคิดมาก หากใช้ shellcheck และแนวปฏิบัติที่ดี bash ก็สามารถอ่านง่ายและปลอดภัยได้เช่นกัน อีกทั้งหากต้องการความสามารถเพิ่มเติม ก็สามารถเพิ่มยูทิลิตีด้วย C/C++ ได้โดยไม่ต้องใช้วิธีซับซ้อนอย่าง FFI และไม่ต้องดึง dependency จำนวนมากที่ไม่ชัดเจนผ่าน pip/npm เป็นต้น

  • ความประหลาดใจต่อการเขียนโปรแกรมด้วย bash

    แม้จะไม่เชี่ยวชาญการเขียนโปรแกรมด้วย bash แต่ก็แสดงความทึ่งว่าจริงๆ แล้วมันมีความสามารถมากเพียงใด

  • ความสงสัยเกี่ยวกับการเขียนเซิร์ฟเวอร์แบบคัสตอม

    สงสัยว่าการเขียนเซิร์ฟเวอร์แบบคัสตอมสำหรับเกมเชิงพาณิชย์ยังคงเป็นที่นิยมอยู่หรือไม่

  • คำยกย่องต่อ Minecraft

    ประเมินว่า Minecraft เป็นหนึ่งในเกมที่ยิ่งใหญ่ที่สุดนับตั้งแต่ Quake

  • ความทึ่งต่อการอิมพลีเมนต์ Minecraft

    บอกว่าแม้จะเคยอ่านบทความมากมายเกี่ยวกับวิธีที่ Minecraft ถูกอิมพลีเมนต์ แต่สิ่งนี้ก็น่าทึ่งจริงๆ และน่าจะเป็นหนึ่งในคำอธิบายเชิงเทคนิคที่ยอดเยี่ยมที่สุดเท่าที่เคยอ่านมา พร้อมชื่นชมว่าอยู่ในระดับสูงสุด