Plik .nbt przechowuje indeksy palety, a nie nazwy bloków — dlatego jest tak mały
Trzy klucze mieszczą całą budowlę: size, palette i blocks. Każdy blok to liczba całkowita wskazująca na paletę, więc obszar 32³ z kamienia kosztuje jeden ciąg znaków i 32 768 małych wpisów — po jednej pozycji i indeksie, nigdy nazwie.
Plik struktury .nbt — to, co zapisuje Blok struktur i co dostarcza datapack — jest znacznie prostszym formatem, niż wygląda z zewnątrz. Wszystko, czego potrzebuje budowla, mieści się w garści kluczy najwyższego poziomu, a jedna decyzja projektowa wyjaśnia, dlaczego pliki są tak małe, jak są.
Trzy klucze, które niosą budowlę
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 komponent Properties przechowują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 oraz state, a state to indeks do palety, nie identyfikator bloku. Dębowe schody skierowane na północ to dane ciągu znaków raz, a każde kolejne to mała liczba całkowita.
Na tym polega cały trik. Obszar 32 × 32 × 32 z samego kamienia to jeden wpis palety i 32 768 wpisów bloków, po jednej pozycji i indeksie — a nie 32 768 kopii słowa minecraft:stone. Paleta rośnie wraz z tym, ile różnych rzeczy zbudowałeś, a lista bloków rośnie wraz z tym, jak dużą rzecz zbudowałeś. To bardzo różne liczby i zwykle tylko jedna z nich jest duża.
Dwie konsekwencje warte uwzględnienia w projektowaniu
Stany bloków mnożą twoją paletę, a nie listę bloków. Dębowe schody to nie jeden wpis palety — to jeden wpis na każdą orientację, której faktycznie użyłeś. Cztery kierunki, górna i dolna połowa, proste oraz oba narożniki wewnętrzne i zewnętrzne: ten sam blok może zajmować kilkanaście slotów palety. Tak więc budowla pełna detali ma dużą paletę, a prosta nie, niezależnie od rozmiaru.
Tylko zapisane pozycje dostają wpis. Lista bloków to lista, 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 niepostawionego. Ale Blok struktur zapisuje powietrze jak każdy inny blok; pomijana jest tylko Pustka strukturalna. Pusta w środku budowla jest tańsza w zapisie tylko wtedy, gdy wypełnisz jej wnętrze Pustką strukturalną przed zapisem.
nbt jest przypisany do bloku i opcjonalny
Każdy wpis w blocks może nieść własny komponent nbt, a większość go nie ma. To tutaj mieszczą się zawartość Skrzyni, tekst tabliczki, mob z spawnera i wzory banera — przypisane do pojedynczego bloku, a nie do palety.
To rozróżnienie ma znaczenie: dane palety są współdzielone, a dane bloku nie. Dwie Skrzynie to jeden wpis palety, bo są tym samym stanem bloku — ale każda trzyma własny ekwipunek we własnym nbt. Zmieniasz stan bloku i dotykasz palety; zmieniasz to, co jest w środku, i dotykasz jednego wpisu na liście bloków.
Odczytywanie warstwa po warstwie
Przeglądarka tutaj jest celowo dwuwymiarowa. Aby narysować warstwę y, przechodzi przez listę bloków, zachowuje wpisy, których pos[1] równa się y, i wyszukuje state każdego z nich w palecie. To cały algorytm i warto go znać, bo w ten sam sposób samodzielnie przejrzysz 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 oznacza też, że plik struktury nie mówi nic o tym, gdzie należy go umieścić w świecie. size to obszar ograniczający, a wartości pos są względne wobec jego narożnika. Umiejscowienie to sprawa Bloku struktur, a nie pliku.