Plik struktury .nbt przechowuje indeksy palety, a nie nazwy bloków — dlatego jest tak mały
Cała konstrukcja mieści się w trzech kluczach: rozmiarze, palecie i blokach. Każdy blok to liczba całkowita wskazująca na paletę, więc 32³ objętości kamienia kosztuje jeden ciąg znaków i 32 768 liczb.
Plik struktury .nbt — czyli to, co zapisuje Blok struktur i dostarcza datapack — ma znacznie prostszy format, niż mogłoby się wydawać. Wszystko, czego potrzebuje konstrukcja, znajduje się w kilku kluczach najwyższego poziomu, a jedna decyzja projektowa wyjaśnia, dlaczego pliki są tak małe.
Trzy klucze, które przechowują konstrukcję
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 przechowuje każdy odrębny stan bloku dokładnie raz. Wpis to Name — identyfikator bloku, taki jak minecraft:oak_stairs — plus opcjonalny złożony obiekt Properties zawierający jego stan bloku, taki jak facing: north i half: bottom.
blocks nigdy nie powtarza nazwy. Każdy wpis zawiera pos trzech liczb całkowitych i state, a state to indeks w palecie, a nie identyfikator bloku. Dębowe schody skierowane na północ to dane tekstowe raz, a każdy kolejny to mała liczba całkowita.
To cała sztuczka. Objętość 32 × 32 × 32 zwykłego Kamienia to jeden wpis palety i 32 768 numerów indeksów — a nie 32 768 kopii słowa minecraft:stone. Paleta rośnie wraz z liczbą różnych rzeczy, z których zbudowałeś, a lista bloków rośnie wraz z tym, jak dużo zbudowałeś. To bardzo różne liczby, a tylko jedna z nich jest zazwyczaj duża.
Dwie konsekwencje, które warto uwzględnić w projekcie
Stany bloków mnożą twoją paletę, a nie listę bloków. Dębowe schody to nie jeden wpis palety — to jeden na każdą faktycznie używaną orientację. Skierowane na cztery strony, górna i dolna połowa, proste oraz oba wewnętrzne i zewnętrzne narożniki: ten sam blok może zajmować kilkanaście miejsc w palecie. Zatem szczegółowa konstrukcja ma dużą paletę, a prosta nie, niezależnie od rozmiaru.
Tylko umieszczone bloki otrzymują wpis. Lista bloków to lista, a nie gęsta tablica 3D, a wpis, którego nie ma, po prostu nie istnieje — przeglądarka na tej stronie wypełnia swoją siatkę -1 i traktuje brakującą współrzędną jako nic nieumieszczonego. Pusta konstrukcja jest naprawdę tańsza w przechowywaniu niż solidna o tych samych wymiarach.
nbt jest na blok i opcjonalne
Każdy wpis w blocks może zawierać własny złożony obiekt nbt, a większość tego nie robi. To tutaj znajdują się zawartość Skrzyni, tekst tabliczki, mob spawner'a i wzory banera — przypisane do pojedynczego bloku, a nie do palety.
Rozróżnienie ma znaczenie: dane palety są współdzielone, a dane bloków nie. Dwie Skrzynie to jeden wpis palety, ponieważ mają ten sam stan bloku — ale każda zachowuje swój własny ekwipunek w swoim własnym nbt. Zmiana stanu bloku dotyka palety; zmiana tego, co jest w środku, dotyka jednego wpisu na liście bloków.
Czytanie warstwa po warstwie
Przeglądarka tutaj jest celowo 2D. Aby narysować warstwę y, przechodzi przez listę bloków, zachowuje wpisy, których pos[1] jest równe y, i wyszukuje state każdego z nich w palecie. To cały algorytm i warto go znać, ponieważ w ten sposób sam byś sprawdził jeden z tych plików: nie ma indeksu przestrzennego do zbudowania ani dekompresji poza opakowaniem gzip. Format to płaska lista, którą filtrujesz.
Co również oznacza, że plik struktury nic nie mówi o tym, gdzie należy do świata. size to ramka ograniczająca, a wartości pos są względne do jej narożnika. Umieszczenie jest sprawą Bloku struktur, a nie pliku.