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
read và xxd để đọ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
dd và xxd để 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
Ý kiến Hacker News
Trải nghiệm với máy chủ Minecraft có thể script
Hiểu về số mũ âm
Khen ngợi một trang web hacker đúng nghĩa
Tình yêu dành cho bash
Ngạc nhiên về lập trình bash
Tò mò về việc viết máy chủ tùy chỉnh
Lời khen dành cho Minecraft
Thán phục cách Minecraft được hiện thực