Rehberler / Komutlar ve Veriler
Bir .nbt yapısı blok adlarını değil, palet indekslerini saklar — bu yüzden bu kadar küçüktür
Üç anahtar tüm bir yapıyı barındırır: size, palette ve blocks. Her blok, palette içinde bir noktaya işaret eden bir tam sayıdır; bu yüzden 32³ boyutunda bir taş hacmi bir dize ve 32.768 küçük girdiye mal olur — her biri bir konum ve bir indeks, asla bir ad değil.
Bir .nbt yapı dosyası — bir yapı bloğunun kaydettiği ve bir veri paketinin taşıdığı şey — dışarıdan göründüğünden çok daha basit bir formattır. Bir yapının ihtiyaç duyduğu her şey birkaç üst düzey anahtarda bulunur ve tek bir tasarım kararı dosyaların neden bu kadar küçük olduğunu açıklar.
Yapıyı taşıyan üç anahtar
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 her farklı blok durumunu tam olarak bir kez tutar. Bir girdi bir Name'tür — minecraft:oak_stairs gibi blok kimliği — artı blok durumunu tutan isteğe bağlı bir Properties bileşiği, örneğin facing: north ve half: bottom.
blocks bir adı asla tekrarlamaz. Her girdi üç tam sayıdan oluşan bir pos ve bir state taşır ve state bir blok kimliği değil, palette içinde bir indekstir. Kuzeye bakan meşe merdiven bir kez dize verisidir ve sonrasındaki her biri küçük bir tam sayıdır.
Bütün hile bu. 32 × 32 × 32 boyutunda düz bir taş hacmi bir palet girdisi ve bir konum artı bir indeksten oluşan 32.768 blok girdisidir — minecraft:stone kelimesinin 32.768 kopyası değil. Palet, kaç farklı şeyle inşa ettiğinize göre büyür ve blok listesi ne kadar büyük inşa ettiğinize göre büyür. Bunlar çok farklı sayılardır ve genellikle yalnızca biri büyüktür.
Tasarım yapmaya değer iki sonuç
Blok durumları blok listenizi değil, paletinizi çoğaltır. Meşe merdiven bir palet girdisi değildir — gerçekte kullandığınız her yönelim için birdir. Dört yöne bakma, üst ve alt yarı, düz ve hem iç hem dış köşeler: aynı blok bir düzine palet yuvasını doldurabilir. Bu yüzden detay ağırlıklı bir yapının paleti büyüktür, sade bir yapınınki değildir; boyuttan bağımsız olarak.
Yalnızca kaydedilen konumlar bir girdi alır. Blok listesi yoğun bir 3B dizi değil, bir listedir ve orada olmayan bir girdi basitçe orada değildir — bu sayfadaki görüntüleyici ızgarasını -1 ile doldurur ve eksik bir koordinatı yerleştirilmemiş hiçbir şey olarak işler. Ancak bir yapı bloğu havayı da diğer bloklar gibi kaydeder; yalnızca yapı boşluğu dışarıda bırakılır. İçi boş bir yapıyı depolamak yalnızca kaydetmeden önce içini yapı boşluğu ile doldurursanız daha ucuzdur.
nbt blok başına ve isteğe bağlıdır
blocks içindeki her girdi kendi nbt bileşiğini taşıyabilir ve çoğu taşımaz. Bir sandığın içeriği, bir tabelanın metni, bir canavar oluşturucunun yaratığı ve bir flamanın desenleri burada bulunur — palete değil, tek tek bloğa bağlı olarak.
Ayrım önemlidir: palet verisi paylaşılır ve blok verisi paylaşılmaz. İki sandık bir palet girdisidir, çünkü aynı blok durumundadırlar — ancak her biri kendi envanterini kendi nbt içinde tutar. Blok durumunu değiştirin, palette dokunursunuz; içindekini değiştirin, blok listesindeki bir girdiye dokunursunuz.
Bir seferde bir katman okumak
Buradaki görüntüleyici kasıtlı olarak 2B'dir. y katmanını çizmek için blok listesini dolaşır, pos[1] değeri y'ye eşit olan girdileri tutar ve her birinin state değerini palette arar. Bütün algoritma budur ve bilmeye değerdir çünkü bu dosyalardan birini kendiniz de bu şekilde incelersiniz: oluşturulacak uzamsal indeks yoktur ve gzip sarmalayıcısının ötesinde açma işlemi yoktur. Format, filtrelediğiniz düz bir listedir.
Bu aynı zamanda bir yapı dosyasının size bir dünyada nereye ait olduğu hakkında hiçbir şey söylemediği anlamına gelir. size bir sınırlayıcı kutudur ve pos değerleri köşesine göredir. Yerleştirme yapı bloğunun işidir, dosyanın değil.