MC Toolkit

Hướng dẫn / Lệnh & dữ liệu

Tệp .nbt lưu chỉ mục bảng palette, không lưu tên khối — đó là lý do nó nhỏ đến vậy

Ba khóa chứa trọn một công trình: size, palette và blocks. Mỗi khối là một số nguyên trỏ vào palette, nên một khối đá 32³ chỉ tốn một chuỗi và 32.768 mục nhỏ — mỗi mục gồm một vị trí và một chỉ mục, chứ không bao giờ là tên.

Một tệp cấu trúc .nbt — thứ mà Khối cấu trúc lưu lại và một datapack phát hành kèm — 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à chỉ một quyết định thiết kế giải thích được vì sao các tệp này lại nhỏ đến thế.

Ba khóa chứa trọn 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 lưu mỗi trạng thái khối riêng biệt đúng một lần. Một mục là một Name — id khối, chẳng hạn minecraft:oak_stairs — cộng thêm một hợp chất Properties tùy chọn chứa blockstate của nó, ví dụ facing: north và half: bottom.

blocks không bao giờ lặp lại một cái tên. Mỗi mục mang một pos gồm ba số nguyên và một state, và state là một chỉ mục vào palette, không phải id khối. Cầu thang gỗ sồi hướng bắc là dữ liệu chuỗi một lần, và mọi khối như thế sau đó chỉ là một số nguyên nhỏ.

Đó là toàn bộ mẹo. Một khối 32 × 32 × 32 toàn Đá là một mục palette và 32.768 mục khối, mỗi mục gồm một vị trí cộng một chỉ mục — chứ không phải 32.768 bản sao của chữ minecraft:stone. Palette lớn lên theo số thứ khác nhau mà bạn đã xây, còn danh sách khối lớn lên theo độ lớn công trình bạn đã xây. Đó là hai con số rất khác nhau, và thường chỉ một trong hai là lớn.

Hai hệ quả đáng để tính đến khi thiết kế

Blockstate làm palette phình ra, chứ không làm danh sách khối phình ra. Cầu thang gỗ sồi không phải một mục palette — chúng là một mục cho mỗi hướng bạn thực sự dùng. Bốn hướng quay, nửa trên và nửa dưới, loại thẳng và cả hai loại góc trong lẫn góc ngoài: cùng một khối có thể chiếm cả chục ô palette. Vậy nên một công trình nhiều chi tiết có palette lớn còn công trình đơn giản thì không, bất kể kích thước.

Chỉ những vị trí được lưu mới có mục. Danh sách khối là một danh sách, không phải một mảng 3D đặc, và một mục không có thì đơn giản là không có — trình xem trên trang này lấp lưới của nó bằng -1 và coi tọa độ thiếu là không có gì được đặt. Nhưng Khối cấu trúc lưu cả không khí như mọi khối khác; chỉ cấu trúc trống là bị bỏ qua. Một công trình rỗng ruột chỉ rẻ hơn khi lưu nếu bạn lấp phần bên trong bằng cấu trúc trống trước khi lưu.

nbt là theo từng khối và tùy chọn

Mỗi mục trong blocks có thể mang hợp chất nbt riêng, và hầu hết đều không. Đây là nơi chứa nội dung của Rương, văn bản của biển, sinh vật của lồng triệu hồi và hoa văn của cờ — gắn với từng khối riêng lẻ chứ không gắn với palette.

Sự phân biệt này quan trọng: dữ liệu palette được chia sẻ còn dữ liệu khối thì không. Hai cái Rương là một mục palette, vì chúng cùng trạng thái khối — nhưng mỗi cái giữ kho đồ riêng trong nbt của chính nó. Đổi trạng thái khối là bạn động vào palette; đổi thứ bên trong nó là bạn động vào một mục trong danh sách khối.

Đọc từng lớp một

Trình xem ở đây cố tình chỉ 2D. Để vẽ lớp y, nó duyệt danh sách khối, giữ lại những mục có pos[1] bằng y, rồi tra state của từng mục trong palette. Toàn bộ thuật toán chỉ có thế, và đáng để biết vì đó cũng chính 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 cần dựng và không có giải nén nào ngoài lớp bọc gzip. Định dạng này là một danh sách phẳng mà bạn lọc.

Điều đó cũng có nghĩa một tệp cấu trúc không cho bạn biết gì về việc nó thuộc về đâu trong thế giới. size là một hộp bao và các giá trị pos là tương đối so với góc của nó. Việc đặt vị trí là chuyện của Khối cấu trúc, không phải của tệp.

Công cụ cấu trúc & component NBT →

Hướng dẫn khác

Xem tất cả →