ملف هيكل .nbt يخزّن فهارس لوحة الألوان، لا أسماء الكتل — ولهذا هو صغير جدًا
ثلاثة مفاتيح تحمل بناءً كاملًا: size وpalette وblocks. كل كتلة هي عدد صحيح يشير إلى لوحة الألوان، لذا فإن حجمًا بمقاس 32³ من الحجر يكلّف نصًا واحدًا و32,768 مدخلًا صغيرًا — موضع وفهرس لكل منها، لا اسم أبدًا.
ملف هيكل .nbt — وهو ما تحفظه كتلة الهيكل وتشحنه حزمة البيانات — هو صيغة أبسط بكثير مما تبدو من الخارج. كل ما يحتاجه البناء يوجد في حفنة من المفاتيح في المستوى الأعلى، وقرار تصميمي واحد يفسّر سبب صغر هذه الملفات كما هي.
المفاتيح الثلاثة التي تحمل البناء
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 يحمل كل حالة كتلة مميزة مرة واحدة بالضبط. المدخل هو Name — معرّف الكتلة، مثل minecraft:oak_stairs — بالإضافة إلى مركّب Properties اختياري يحمل حالة الكتلة الخاصة به، مثل facing: north وhalf: bottom.
blocks لا يكرّر اسمًا أبدًا. كل مدخل يحمل pos من ثلاثة أعداد صحيحة وstate، وstate هو فهرس داخل لوحة الألوان، وليس معرّف كتلة. درج البلوط المتجه شمالًا هو بيانات خيط مرة واحدة، وكل واحد منها بعد ذلك هو عدد صحيح صغير.
هذه هي الحيلة كلها. حجم 32 × 32 × 32 من الحجر العادي هو مدخل واحد في لوحة الألوان و32,768 مدخل كتلة من موضع وفهرس — وليس 32,768 نسخة من كلمة minecraft:stone. تنمو لوحة الألوان بحسب عدد الأشياء المختلفة التي بنيت بها، وتنمو قائمة الكتل بحسب حجم ما بنيته. هذان رقمان مختلفان تمامًا، وواحد منهما فقط هو الكبير عادةً.
نتيجتان تستحقان التصميم حولهما
حالات الكتلة تضاعف لوحة الألوان، لا قائمة الكتل. درج البلوط ليس مدخلًا واحدًا في لوحة الألوان — بل مدخل لكل اتجاه استخدمته فعلًا. أربعة اتجاهات، والنصف العلوي والسفلي، والمستقيم والزوايا الداخلية والخارجية: يمكن للكتلة نفسها أن تشغل دستة خانات في لوحة الألوان. لذا فإن بناءً غنيًا بالتفاصيل له لوحة ألوان كبيرة، والبناء البسيط ليس كذلك، بغض النظر عن الحجم.
المواضع المحفوظة فقط هي التي تحصل على مدخل. قائمة الكتل هي قائمة، وليست مصفوفة ثلاثية الأبعاد كثيفة، والمدخل غير الموجود ببساطة غير موجود — ويملأ العارض في هذه الصفحة شبكته بـ-1 ويتعامل مع الإحداثي المفقود كأن شيئًا لم يُوضع. لكن كتلة الهيكل تحفظ الهواء مثل أي كتلة أخرى؛ فقط فراغ الهيكل يُستبعد. البناء المجوّف يكون أرخص في التخزين فقط إذا ملأت داخله بفراغ الهيكل قبل الحفظ.
nbt لكل كتلة واختياري
كل مدخل في blocks قد يحمل مركّب nbt الخاص به، ومعظمها لا يفعل. هنا تكمن محتويات الصندوق، ونص اللافتة، وكائن مولّد الوحوش، وأنماط الراية — مرتبطة بالكتلة الفردية بدلًا من لوحة الألوان.
التمييز مهم: بيانات لوحة الألوان مشتركة وبيانات الكتلة ليست كذلك. صندوقان هما مدخل واحد في لوحة الألوان، لأنهما نفس حالة الكتلة — لكن كل واحد يحتفظ بمخزونه الخاص في nbt الخاص به. غيّر حالة الكتلة تلمس لوحة الألوان؛ غيّر ما بداخلها تلمس مدخلًا واحدًا في قائمة الكتل.
قراءة طبقة واحدة في كل مرة
العارض هنا ثنائي الأبعاد عن قصد. لرسم الطبقة y فإنه يمر على قائمة الكتل، ويحتفظ بالمدخلات التي يساوي pos[1] فيها y، ويبحث عن state لكل واحد منها في لوحة الألوان. هذه هي الخوارزمية كلها، ويستحق معرفتها لأنها أيضًا الطريقة التي ستفحص بها أحد هذه الملفات بنفسك: لا يوجد فهرس مكاني لبنائه ولا فك ضغط يتجاوز غلاف gzip. الصيغة هي قائمة مسطحة تقوم بتصفيتها.
وهو ما يعني أيضًا أن ملف الهيكل لا يخبرك بشيء عن مكان انتمائه في العالم. size هو مربع إحاطة وقيم pos نسبية إلى زاويته. التموضع هو شأن كتلة الهيكل، وليس شأن الملف.