Tệp cấu trúc .nbt lưu chỉ mục bảng màu, không phải tên khối — đó là lý do tại sao nó lại nhỏ gọn đến vậy
Ba khóa chứa toàn bộ một công trình: kích thước, bảng màu và các khối. Mỗi khối là một số nguyên trỏ đến bảng màu, vì vậy một khối lượng đá 32³ chỉ tốn một chuỗi và 32.768 số.
Một tệp cấu trúc .nbt — thứ mà Khối cấu trúc lưu và một gói dữ liệu (datapack) vận chuyển — là một định dạng đơn giản hơn nhiều so với vẻ ngoài của nó. Mọi thứ một công trình cần đều nằm trong một vài khóa cấp cao nhất, và một quyết định thiết kế đã giải thích tại sao các tệp lại nhỏ gọn đến vậy.
Ba khóa mang theo công trình
size [x, y, z] — a list of exactly three integers
palette [ { Name, Properties } … ] — every DISTINCT block state, once
blocks [ { pos, state, nbt } … ] — one entry per placed block
palette chứa mỗi trạng thái khối riêng biệt chính xác một lần. Một mục nhập là một Name — ID khối, như minecraft:oak_stairs — cộng với một hợp chất Properties tùy chọn chứa trạng thái khối của nó, chẳng hạn như facing: north và half: bottom.
blocks không bao giờ lặp lại tên. Mỗi mục nhập mang một pos gồm ba số nguyên và một state, và state là một chỉ mục trong bảng màu, không phải ID khối. Cầu thang gỗ sồi quay về phía bắc là dữ liệu chuỗi một lần, và mỗi cái sau đó là một số nguyên nhỏ.
Đó là toàn bộ bí quyết. Một khối lượng Đá trơn 32 × 32 × 32 là một mục nhập bảng màu và 32.768 số chỉ mục — không phải 32.768 bản sao của từ minecraft:stone. Bảng màu phát triển theo số lượng thứ khác nhau bạn đã xây dựng, và danh sách khối phát triển theo kích thước bạn đã xây dựng. Đó là những con số rất khác nhau, và chỉ một trong số chúng thường lớn.
Hai hệ quả đáng để thiết kế xung quanh
Trạng thái khối nhân lên bảng màu của bạn, không phải danh sách khối của bạn. Cầu thang gỗ sồi không phải là một mục nhập bảng màu — chúng là một mục cho mỗi hướng bạn thực sự đã sử dụng. Quay bốn hướng, nửa trên và nửa dưới, thẳng và cả góc trong và góc ngoài: cùng một khối có thể chiếm hàng tá vị trí trong bảng màu. Vì vậy, một công trình nhiều chi tiết có bảng màu lớn và một công trình đơn giản thì không, bất kể kích thước.
Chỉ các khối đã đặt mới có một mục nhập. Danh sách khối là một danh sách, không phải một mảng 3D dày đặc, và một mục nhập không có ở đó thì đơn giản là không có ở đó — trình xem trên trang này điền lưới của nó bằng -1 và coi một tọa độ bị thiếu là không có gì được đặt. Một công trình rỗng thực sự rẻ hơn để lưu trữ so với một công trình đặc có cùng kích thước.
nbt là tùy chọn và theo từng khối
Mỗi mục nhập trong blocks có thể mang hợp chất nbt của riêng nó, và hầu hết thì không. Đây là nơi chứa nội dung của Rương, văn bản của biển báo, mob của bộ tạo và các mẫu của biểu ngữ — gắn liền với từng khối riêng lẻ chứ không phải với bảng màu.
Sự phân biệt này rất quan trọng: dữ liệu bảng màu được chia sẻ và dữ liệu khối thì không. Hai Rương là một mục nhập bảng màu, vì chúng có cùng trạng thái khối — nhưng mỗi Rương giữ kho đồ của riêng mình trong nbt của riêng nó. Thay đổi trạng thái khối và bạn chạm vào bảng màu; thay đổi những gì bên trong nó và bạn chạm vào một mục nhập trong danh sách khối.
Đọc từng lớp một
Trình xem ở đây cố tình là 2D. Để vẽ lớp y, nó duyệt danh sách khối, giữ các mục có pos[1] bằng y, và tra cứu state của mỗi mục trong bảng màu. Đó là toàn bộ thuật toán, và đáng để biết vì đó cũng là cách bạn tự kiểm tra một trong những tệp này: không có chỉ mục không gian nào để xây dựng và không có giải nén nào ngoài lớp bọc gzip. Định dạng là một danh sách phẳng mà bạn lọc.
Điều đó cũng có nghĩa là một tệp cấu trúc không cho bạn biết gì về vị trí của nó trong một thế giới. size là một hộp giới hạn và các giá trị pos là tương đối so với góc của nó. Vị trí là công việc của Khối cấu trúc, không phải của tệp.