La extensión no te dice el formato del schematic — 31 de 33 archivos .schematic eran la suposición de otro
Cinco formatos, cuatro maneras distintas de empaquetar bloques, y .schematic lo comparten dos de ellos. Olfatear la raíz NBT gana a fiarse del nombre del archivo, con evidencia contada.
Hay cinco formatos de schematic en circulación, y el nombre del archivo es una pista, no un hecho. El visor que nos ocupa decide qué es un archivo mirando dentro de él, y hay una razón medida para eso.
Cinco formatos, cinco extensiones
| extensión | formato |
|---|---|
.nbt | estructura vanilla |
.schem | Sponge |
.schematic | Sponge — por defecto |
.litematic | Litematica |
.mcstructure | Bedrock |
La fila problemática es .schematic. Esa extensión la comparten el formato MCEdit clásico y el de Sponge, y los archivos los renombra gente que no lo sabe o no le importa.
Contado sobre un corpus real: de 33 archivos .schematic, 31 eran MCEdit, uno era una estructura vanilla y uno era un Litematica. Así que la suposición por defecto de la extensión falla en casi todos, y dos archivos no eran .schematic en ningún sentido — solo estaban mal nombrados.
La solución es olfatear la raíz NBT y dejar que lo que el archivo es gane a como se llama:
- una clave
Regions→ Litematica paletteyblocks→ estructura vanilla- en caso contrario, la prueba de forma de MCEdit, y luego recurrir a la extensión
Cuatro maneras de empaquetar los mismos bloques
Los formatos no difieren en lo cosmético. Cada uno guarda los datos de bloques de una forma genuinamente distinta, y cada elección tiene una consecuencia:
Vanilla .nbt — una lista. Una entrada por cada posición guardada, cada una indicando un índice de paleta. El aire se guarda como cualquier otro bloque; solo se omite el vacío estructural (Structure Void), así que una construcción hueca solo sale barata si su interior se vació antes de guardar.
Sponge .schem — un flujo de varints. Índices de paleta empaquetados como enteros de ancho variable: siete bits de carga útil por byte, con el bit alto activado para continuar. Las paletas pequeñas cuestan un byte por bloque; una paleta de más de 127 entradas empieza a costar dos para los índices altos. Denso, pero autodescriptivo.
MCEdit .schematic — un array plano de bytes. Un byte por bloque, así que 256 tipos de bloque como máximo — que es exactamente por lo que tiene un side-array AddBlocks opcional que añade cuatro bits más de id como un nibble por bloque, con lo que los ids llegan a 4.095. Este es un formato heredado de ids numéricos, de antes de los estados de bloque: sus ids son números, resueltos mediante un compuesto SchematicaMapping cuando Schematica escribió uno, y mediante la tabla de ids vanilla de la 1.12 en caso contrario.
Litematica .litematic — longs empaquetados en bits. Los índices se empaquetan a exactamente max(2, bits needed for the palette) bits cada uno, empezando por el bit menos significativo, y una entrada puede quedar a caballo entre dos longs. Una paleta de 5 entradas usa 3 bits por bloque; una de 300 usa 9.
El suelo de 2 bits importa: ni siquiera una paleta de dos bloques comprime por debajo de 2 bits por entrada, así que una construcción monocroma no es tan pequeña como sugieren las matemáticas.
Bedrock es little-endian
.mcstructure es la excepción a un nivel más bajo: Bedrock escribe NBT little-endian donde todos los formatos de Java escriben big-endian. Eso se decide antes de que ocurra cualquier análisis del formato — lee los bytes con el endianness equivocado y no obtienes una estructura incorrecta, obtienes basura que directamente no se puede analizar.
Qué significa esto en la práctica
Si un schematic no abre en algún sitio, la primera pregunta no es "¿está corrupto el archivo?" sino "¿es este archivo lo que dice su nombre?". Un .schematic de una página de descargas tiene muchas más probabilidades de ser MCEdit que Sponge, y una herramienta que se fía de la extensión rechazará un archivo perfectamente válido.
Y al comparar dos exportaciones de la misma construcción, las diferencias de tamaño tienen que ver sobre todo con la codificación y no con el contenido — un .nbt vanilla con vacíos de una construcción hueca y un .litematic empaquetado en bits de lo mismo están resolviendo problemas distintos.