4 điểm bởi GN⁺ 2024-03-04 | 1 bình luận | Chia sẻ qua WhatsApp

Suy nghĩ về một máy chủ Minecraft viết bằng Bash

  • Suy ngẫm về việc viết một máy chủ Minecraft bằng Bash.
  • Trước đây đã thử với giao thức Classic năm 2009, nhưng cảm thấy Bash có giới hạn trong việc phân tích dữ liệu nhị phân.
  • Đã nghĩ ra cách dùng readxxd để đọc dữ liệu và in ra bản dump hệ thập lục phân.
  • Bash bỏ qua byte null và không có cách nào để phát hiện chúng, nên dữ liệu có thể bị hỏng.

Đọc byte null trong Bash

  • Tìm ra cách dùng ddxxd để xử lý dữ liệu nhị phân có chứa byte null.
  • Với cách này, có thể thực hiện đối sánh mẫu, trích xuất dữ liệu, v.v.
  • Dùng ncat để lắng nghe trên cổng TCP mặc định của Minecraft và khi có kết nối đến thì chạy script shell chính (mc.sh).

Giao thức thực ra không tốt lắm

  • Điều đầu tiên cần triển khai để máy chủ Minecraft hoạt động là gói tin ping danh sách máy chủ.
  • Mô tả những khó khăn khi triển khai các kiểu dữ liệu như VarInts và VarLongs.
  • Triển khai số VarInt/VarLong bằng cách dùng phương thức mã hóa LEB128.
  • Gặp khó khăn khi triển khai số dấu phẩy động IEEE754 và đã giải quyết bằng awk.

Kiểu dữ liệu "Position"

  • Kiểu dữ liệu Position do Mojang tạo ra lưu tọa độ X, Y, Z trong một giá trị Long 64-bit.
  • Kiểu dữ liệu này có thể được triển khai khá dễ trong Bash.

Named Binary Tag

  • NBT là một định dạng giống JSON dành cho dữ liệu nhị phân do Mojang tạo ra.
  • Gần như đã hoàn thành việc triển khai bộ phân tích cú pháp NBT, nhưng do dùng thư mục dự án trên tmpfs và hệ thống bị sập nên mã nguồn đã bị mất.

Viết máy chủ thực tế

  • Sau phần toán học, tác giả đi đến phần thú vị là tạo ra máy chủ thực sự.
  • Để tham gia máy chủ, client phải hoàn tất quá trình bắt tay và gửi một vài gói tin.
  • Cấu trúc dữ liệu bên trong gói tin Join Game và Chunk là trở ngại lớn nhất.

Hệ thống "plugin"

  • Để máy chủ có thể làm nhiều thứ hơn ngoài các chunk đơn giản, tác giả tạo ra các hook là những hàm có thể override và thêm tùy chọn để máy chủ có thể nạp mã người dùng.
  • Nhờ đó có thể triển khai nhiều tính năng khác nhau, từ thay đổi diện mạo thế giới cho đến việc khiến người chơi phát ra tiếng tích tắc khi di chuyển chuột.

Những điểm kỳ lạ của Witchcraft

  • Bash có hạn chế trong việc xử lý số thập phân.
  • Multiplayer không hoạt động hoàn chỉnh.
  • Witchcraft là máy chủ đa luồng, nhưng dùng các thủ thuật hack để giao tiếp giữa các luồng.
  • Tốc độ trao đổi dữ liệu chậm.
  • Chỉ chạy được khi cài BusyBox mới nhất (1.35.0).

FAQ

  • Hỏi đáp về các câu hỏi như ID block đến từ đâu, nguồn gốc của cái tên "WitchCraft", v.v.

Tài nguyên

  • Cung cấp các liên kết tài nguyên như kho lưu trữ Witchcraft, tài liệu giao thức trên wiki.vg, v.v.

Ý kiến của GN⁺

  • Dự án này cho thấy sự sáng tạo và khả năng giải quyết vấn đề của nhà phát triển trong việc vượt qua các giới hạn của Bash.
  • Việc triển khai một máy chủ Minecraft bằng Bash có thể cực kỳ kém hiệu quả, nhưng cách tiếp cận mang tính thử nghiệm như vậy có thể giúp tìm ra những lời giải mới.
  • Không khuyến nghị áp dụng kỹ thuật này cho máy chủ game thực tế, nhưng nó có thể hữu ích để hiểu giới hạn của ngôn ngữ kịch bản và học cách vượt qua chúng.
  • Các bản triển khai máy chủ hiệu quả hơn với chức năng tương tự gồm có máy chủ Minecraft viết bằng Java hoặc C++.
  • Dự án này có thể là tài liệu học tập hữu ích để hiểu cách dùng Bash nhằm xử lý các giao thức mạng phức tạp.

1 bình luận

 
GN⁺ 2024-03-04
Ý kiến Hacker News
  • Trải nghiệm với máy chủ Minecraft có thể script

    Một người dùng có nhiều kinh nghiệm làm việc với máy chủ Minecraft có thể script cho Java và Bedrock (ScraM) đánh giá đây là điều rất ấn tượng. Họ muốn cho điểm cộng vì cách dùng từ "duckduckgoing" trong câu. Cuộc thảo luận này có 92 bình luận.

  • Hiểu về số mũ âm

    Họ nhắc rằng số mũ âm, tức 2^(-n), bằng 1/(2^n), và bày tỏ ngạc nhiên khi tác giả không nhớ ví dụ 2^-1 = 0.5 của chính mình mà phải nhờ đến awk. Họ gợi ý rằng nếu dùng thư viện ctypes.sh thì có thể truy cập libm, poll(), select() và những thứ tương tự từ bash.

  • Khen ngợi một trang web hacker đúng nghĩa

    Họ khen đây là một trang web hacker đúng nghĩa và rất tuyệt vời.

  • Tình yêu dành cho bash

    Họ nói mình yêu bash, yêu nó nhiều như vim và lua. Họ nhấn mạnh rằng đây là một binary đơn lẻ dưới 2MB, có năng lực hơn rất nhiều so với suy nghĩ của nhiều người. Họ đề cập rằng với shellcheck và các thói quen tốt, bash cũng có thể dễ đọc và an toàn. Nếu cần thêm chức năng, có thể bổ sung utility bằng C/C++ mà không cần dùng những cách phức tạp như FFI, đồng thời không phải kéo vào vô số phụ thuộc mơ hồ qua pip/npm.

  • Ngạc nhiên về lập trình bash

    Họ không quá giỏi lập trình bash, nhưng bày tỏ sự ngạc nhiên về việc nó thực sự mạnh đến mức nào.

  • Tò mò về việc viết máy chủ tùy chỉnh

    Họ tự hỏi liệu việc viết máy chủ tùy chỉnh cho các game thương mại có còn phổ biến hay không.

  • Lời khen dành cho Minecraft

    Họ đánh giá Minecraft là một trong những trò chơi vĩ đại nhất kể từ sau Quake.

  • Thán phục cách Minecraft được hiện thực

    Họ nói đã đọc nhiều bài viết về cách Minecraft được hiện thực, nhưng đây thực sự là điều đáng kinh ngạc và có lẽ là một trong những phần giải thích kỹ thuật hay nhất mà họ từng đọc. Họ khen nó ở đẳng cấp hàng đầu.