Rozszerzenie nie mówi, jaki jest format schematu — 31 z 33 plików .schematic było czyimś zgadywaniem
Pięć formatów, cztery różne sposoby pakowania bloków, a .schematic jest współdzielony przez dwa z nich. Węszenie w korzeniu NBT bije zaufanie do nazwy pliku — z policzonymi dowodami.
W obiegu jest pięć formatów schematów, a nazwa pliku to wskazówka, a nie fakt. Przeglądarka tutaj decyduje, czym jest plik, zaglądając do jego wnętrza, i ma ku temu mierzalny powód.
Pięć formatów, pięć rozszerzeń
| rozszerzenie | format |
|---|---|
.nbt | struktura vanilla |
.schem | Sponge |
.schematic | Sponge — domyślnie |
.litematic | Litematica |
.mcstructure | Bedrock |
Problemem jest wiersz .schematic. To rozszerzenie jest współdzielone przez klasyczny format MCEdit i format Sponge'a, a pliki bywają przemianowywane przez ludzi, którzy nie wiedzą albo nie dbają.
Policzone na prawdziwym korpusie: z 33 plików .schematic, 31 było MCEdit, jeden był strukturą vanilla, a jeden Litematiki. Zatem domyślne założenie rozszerzenia jest błędne dla niemal wszystkich z nich, a dwa pliki nie były .schematic w żadnym sensie — po prostu źle nazwane.
Rozwiązaniem jest zajrzenie do korzenia NBT i pozwolenie, by to, czym plik jest, wygrało z tym, jak się nazywa:
- klucz
Regions→ Litematica paletteorazblocks→ struktura vanilla- w przeciwnym razie test kształtu MCEdit, a potem powrót do rozszerzenia
Cztery sposoby pakowania tych samych bloków
Formaty nie różnią się kosmetycznie. Każdy przechowuje dane bloków w naprawdę odmienny sposób, a każdy wybór ma swoje konsekwencje:
Vanilla .nbt — lista. Jeden wpis na zapisaną pozycję, każdy wskazuje indeks palety. Powietrze jest przechowywane jak każdy inny blok; pomijana jest tylko pustka strukturalna (structure void), więc wydrążona budowla jest tania tylko wtedy, gdy jej wnętrze zostało opróżnione przed zapisem.
Sponge .schem — strumień varintów. Indeksy palety pakowane jako liczby całkowite o zmiennej szerokości: siedem bitów ładunku na bajt, wysoki bit ustawiony jako kontynuacja. Małe palety kosztują jeden bajt na blok; paleta powyżej 127 wpisów zaczyna kosztować dwa dla wysokich indeksów. Gęste, ale samoopisujące się.
MCEdit .schematic — płaska tablica bajtów. Jeden bajt na blok, więc maksymalnie 256 typów bloków — i właśnie dlatego ma opcjonalną tablicę poboczną AddBlocks dodającą cztery dodatkowe bity identyfikatora jako nibble na blok, dzięki czemu identyfikatory sięgają 4 095. To odziedziczony format numerycznych identyfikatorów sprzed stanów bloków: jego identyfikatory to liczby, rozwiązywane przez złożenie SchematicaMapping, gdy Schematica je zapisała, a w przeciwnym razie przez tabelę identyfikatorów vanilla 1.12.
Litematica .litematic — upakowane bitowo longi. Indeksy są pakowane po dokładnie max(2, bits needed for the palette) bity każdy, od najmłodszego bitu, a wpis może przekraczać granicę między dwoma longami. Paleta 5 wpisów używa 3 bitów na blok; paleta 300 wpisów używa 9.
Dolna granica 2 bitów ma znaczenie: nawet paleta dwóch bloków nie kompresuje się poniżej 2 bitów na wpis, więc monochromatyczna budowla nie jest tak mała, jak sugeruje matematyka.
Bedrock jest little-endian
.mcstructure jest wyjątkiem na niższym poziomie: Bedrock zapisuje NBT w little-endian, podczas gdy każdy format Java zapisuje w big-endian. To rozstrzyga się, zanim zacznie się jakiekolwiek parsowanie formatu — odczytaj bajty z niewłaściwą kolejnością bajtów, a nie dostaniesz błędnej struktury, tylko śmieci, które w ogóle się nie parsują.
Co to oznacza w praktyce
Jeśli schemat gdzieś się nie otwiera, pierwszym pytaniem nie jest „czy plik jest uszkodzony", lecz „czy ten plik jest tym, co mówi jego nazwa". .schematic ze strony do pobierania jest znacznie bardziej prawdopodobnie MCEdit niż Sponge, a narzędzie ufające rozszerzeniu odrzuci całkiem dobry plik.
A porównując dwa eksporty tej samej budowli, różnice w rozmiarze dotyczą głównie kodowania, a nie zawartości — opróżniony vanilla .nbt wydrążonej budowli i upakowany bitowo .litematic tego samego rozwiązują różne problemy.