ملفات الهياكل بصيغة .nbt تخزن مؤشرات لوحة الألوان لا أسماء الكتل — وهذا سر صغر حجمها
ثلاثة مفاتيح تحمل بناءً كاملاً: الحجم، لوحة الألوان، والكتل. كل كتلة هي عدد صحيح يشير إلى لوحة الألوان، لذا فإن حجم 32³ من الحجر يكلف خيطًا واحدًا و32,768 رقمًا.
ملف هيكل .nbt — وهو ما يحفظه Structure Block ويشحنه حزمة البيانات (datapack) — هو تنسيق أبسط بكثير مما يبدو عليه من الخارج. كل ما يحتاجه البناء موجود في عدد قليل من المفاتيح العليا، ويفسر قرار تصميم واحد سبب صغر حجم الملفات.
المفاتيح الثلاثة التي تحمل البناء
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 اختياري يحمل حالة الكتلة (blockstate) الخاصة بها، مثل facing: north و half: bottom.
blocks لا يكرر اسمًا أبدًا. كل مدخل يحمل pos من ثلاثة أعداد صحيحة و state، و state هو مؤشر إلى لوحة الألوان (palette)، وليس معرف كتلة. درج البلوط (Oak Stairs) المتجه شمالًا هو بيانات خيط (string data) مرة واحدة، وكل واحد منها بعد ذلك هو عدد صحيح صغير.
هذه هي الحيلة بأكملها. حجم 32 × 32 × 32 من الحجر العادي هو مدخل واحد في لوحة الألوان و32,768 رقم مؤشر — وليس 32,768 نسخة من كلمة minecraft:stone. تنمو لوحة الألوان مع عدد الأشياء المختلفة التي بنيتها بها، وتنمو قائمة الكتل مع حجم ما بنيته. هذه أرقام مختلفة جدًا، وعادة ما يكون واحد منها فقط كبيرًا.
نتيجتان تستحقان التصميم حولهما
حالات الكتل تضاعف لوحة الألوان لديك، وليس قائمة الكتل. درج البلوط ليس مدخلًا واحدًا في لوحة الألوان — بل هو مدخل واحد لكل اتجاه استخدمته فعليًا. مواجهة أربعة اتجاهات، نصف علوي وسفلي، مستقيم وزوايا داخلية وخارجية: يمكن لنفس الكتلة أن تشغل عشرات من خانات لوحة الألوان. لذا فإن البناء الغني بالتفاصيل يحتوي على لوحة ألوان كبيرة، بينما البناء البسيط لا يحتوي على ذلك، بغض النظر عن الحجم.
الكتل الموضوعة فقط تحصل على مدخل. قائمة الكتل هي قائمة، وليست مصفوفة ثلاثية الأبعاد كثيفة، والمدخل غير الموجود ببساطة غير موجود — العارض في هذه الصفحة يملأ شبكته بـ -1 ويعامل الإحداثي المفقود على أنه لا يوجد شيء موضوع. البناء المجوف أرخص حقًا في التخزين من البناء الصلب بنفس الأبعاد.
nbt هو لكل كتلة واختياري
قد يحمل كل مدخل في blocks مركب nbt الخاص به، ومعظمها لا يحمل. هذا هو المكان الذي تعيش فيه محتويات الصندوق (Chest)، ونص اللافتة (sign)، ووحش المولد (spawner)، وأنماط الراية (banner) — مرتبطة بالكتلة الفردية بدلاً من لوحة الألوان.
التمييز مهم: بيانات لوحة الألوان مشتركة وبيانات الكتل ليست كذلك. صندوقان هما مدخل واحد في لوحة الألوان، لأنهما نفس حالة الكتلة — لكن كل منهما يحتفظ بمخزونه الخاص في nbt الخاص به. غيّر حالة الكتلة وتلمس لوحة الألوان؛ غيّر ما بداخلها وتلمس مدخلًا واحدًا في قائمة الكتل.
قراءة طبقة في كل مرة
العارض هنا ثنائي الأبعاد عمدًا. لرسم الطبقة y، فإنه يتتبع قائمة الكتل، ويحتفظ بالمدخلات التي يكون فيها pos[1] مساويًا لـ y، ويبحث عن state لكل منها في لوحة الألوان. هذه هي الخوارزمية بأكملها، ومن الجدير معرفتها لأنها أيضًا الطريقة التي ستفحص بها أحد هذه الملفات بنفسك: لا يوجد مؤشر مكاني للبناء ولا فك ضغط يتجاوز غلاف gzip. التنسيق هو قائمة مسطحة تقوم بتصفيتها.
وهذا يعني أيضًا أن ملف الهيكل لا يخبرك شيئًا عن مكان وجوده في العالم. size هو صندوق إحاطة (bounding box) وقيم pos نسبية لزاويته. التنسيب هو شأن Structure Block، وليس شأن الملف.