BSP Protection y filtraciones

¿Qué es un archivo BSP? Header, lumps y pakfile explicados

Un archivo BSP es el formato de mapa compilado de Source Engine. Así está construido: header, lumps, entity lump y pakfile, y con qué herramientas abrirlo.

Un archivo BSP es la versión compilada y lista para jugar de un mapa de Source Engine y, por tanto, de Garry's Mod. Se genera cuando los compiladores toman el archivo VMF editable del editor Hammer y calculan la geometría, la visibilidad y la iluminación. El archivo contiene casi todo lo que un servidor y sus jugadores necesitan para cargar el mapa: geometría, entities, lightmaps y, a menudo, texturas, modelos y sonidos incrustados.

Qué significa BSP y cómo se crea el archivo

BSP significa Binary Space Partitioning. Es una técnica que divide el espacio de un mapa en un árbol de regiones más pequeñas. El motor usa ese árbol para decidir con rapidez qué es visible y con qué choca un jugador.

Un mapa lo construyes en Hammer como archivo VMF. Es un archivo de texto que puedes seguir editando cuando quieras. La compilación ejecuta tres programas seguidos: VBSP crea la geometría y las entities, VVIS calcula la visibilidad y VRAD calcula la luz. El artículo VBSP, VVIS y VRAD explicados repasa los tres pasos en detalle. El resultado es un único archivo binario con la extensión .bsp, optimizado para cargarse, no para editarse.

La estructura: header y lumps

Todo BSP empieza con un header. Contiene:

  • el identificador VBSP, que indica a las herramientas que se trata de un mapa de Source
  • el número de versión del formato (normalmente 20 en Garry's Mod)
  • un directorio con 64 entradas, la tabla de lumps
  • la revisión del mapa, es decir, cuántas veces se guardó el VMF antes de compilar

Un lump es un bloque de datos con una tarea fija. Para cada bloque, la tabla de lumps indica en qué punto del archivo empieza y cuánto ocupa. No se usan los 64 huecos. Los grupos más importantes:

LumpContenido
EntitiesLista en texto de todas las entities y sus propiedades
Planes, nodes, leafsEl árbol BSP que organiza el mapa en el espacio
Vertices, edges, facesLas superficies visibles
Brushes, brush sidesLos brushes, usados entre otras cosas para la colisión
Texinfo, texdataQué superficie lleva qué material
VisibilityLos datos de visibilidad calculados por VVIS
LightingLos lightmaps calculados por VRAD
Datos de displacementSuperficies de terreno deformadas
Game lumpTodos los prop_static, entre otras cosas
PakfileUn contenedor de archivos incrustado

Si una entrada de la tabla es incorrecta, por ejemplo porque un bloque se pasa del final del archivo, el archivo está dañado. Pasa, por ejemplo, con subidas interrumpidas.

El entity lump: texto plano dentro de un archivo binario

El entity lump es texto corriente. Cada entity es un bloque entre llaves formado por pares de clave y valor:

{
"classname" "info_player_start"
"origin" "0 0 64"
"angles" "0 90 0"
}

La primera entity es siempre worldspawn, que guarda los ajustes básicos del mapa, como el nombre del skybox. Después vienen las point entities, como spawns, luces y lógica, y las brush entities, como puertas y triggers. Las conexiones entre entities (inputs y outputs) también se guardan aquí como texto.

Algunas entities no están en el entity lump porque el compilador las absorbe: los prop_static, por ejemplo, acaban en el game lump, y los func_detail pasan a formar parte de la geometría del mundo.

Como el lump es texto plano, cualquiera puede leerlo con herramientas sencillas. Eso afecta a los nombres y a la lógica de tu mapa, y afecta a la seguridad: una entity lua_run ejecuta código Lua en el servidor, mientras que point_servercommand, que lanza comandos de consola en otros juegos Source, está desactivada en Garry's Mod. Antes de poner en tu servidor un mapa de otra persona, merece la pena echar un vistazo a esta sección.

El pakfile: contenido custom dentro del mapa

El lump pakfile es un archivo ZIP dentro del BSP. Guarda los archivos que el mapa trae consigo: materiales, texturas, modelos, sonidos. Al cargar, el motor los trata como si estuvieran en la carpeta del juego. El motor también escribe en él, por ejemplo las texturas de cubemap que crea buildcubemaps.

El pakfile se llena con la herramienta BSPZIP de Valve o con utilidades como Pakrat, VIDE o CompilePal. El artículo Empaquetar contenido custom en un BSP enseña cómo hacerlo.

Todo lo que hay en el pakfile se entrega a todos los jugadores. Eso afecta al tamaño del archivo, y significa que los archivos empaquetados por error pasan a ser públicos.

Cómo abrir un archivo BSP

  • Hammer no abre archivos BSP, solo VMF. Para el camino de vuelta necesitas un decompiler como BSPSource. Descompilar un BSP, explicado describe qué obtienes con eso.
  • Ver el pakfile: VIDE, Pakrat o GCFScape muestran los archivos incrustados.
  • Leer las entities: un editor de entities como Entspy o, si no hay otra cosa, un editor de texto o hexadecimal muestran el entity lump.
  • Comprobaciones automáticas: el Map Scanner de bspmarket.de comprueba la coherencia del header, la tabla de lumps y los offsets, encuentra entities de riesgo y lista los archivos del pakfile.

Por qué la estructura importa para buscar errores y para proteger

Muchos problemas típicos se pueden atribuir a una parte concreta del archivo. Si un material no está ni en la carpeta del juego ni en el pakfile, ves el conocido patrón de cuadros. Si un lump supera un límite del motor, la compilación falla o el mapa no carga. Si sabes qué sección se encarga de qué, encuentras la causa más rápido.

Para proteger un mapa hay una propiedad decisiva: el motor tiene que poder leer el archivo, y todo jugador que entra en tu servidor lo recibe. Por eso un BSP no contiene nada que siga siendo secreto mucho tiempo. Las medidas de protección actúan sobre la estructura. Un fingerprint hace rastreable una copia, y la ofuscación reduce la información que solo le sirve a un editor. Proteger tu mapa de GMod de filtraciones da la visión general.

Preguntas frecuentes

¿Puedo abrir un archivo BSP directamente en Hammer?

No. Hammer trabaja con archivos VMF. Un BSP hay que descompilarlo antes, y el resultado es una reconstrucción, no el archivo de trabajo original.

¿Está cifrado un archivo BSP?

No. El formato es bien conocido y lo leen muchas herramientas. El entity lump es texto plano y el pakfile es un archivo ZIP. Según la wiki de Valve, GMod también carga mapas cuyos lumps y cuyo contenido del pakfile están comprimidos con LZMA; eso es compresión, no cifrado.

¿Por qué ocupa tanto mi archivo BSP?

Normalmente por los lightmaps, que una compilación para LDR y HDR guarda dos veces, y por el pakfile con sus texturas, modelos, sonidos y cubemaps incrustados. La tabla de lumps muestra qué bloque domina, y el listado del pakfile, qué archivos ocupan el espacio.

¿Qué versión de BSP usa Garry's Mod?

Los mapas hechos con las herramientas de compilación habituales para Garry's Mod llevan la versión 20. El número está en el header, justo después del identificador. Según la wiki de Valve, el motor de GMod también lee la versión 21. Otros juegos de Source usan en algunos casos versiones distintas, y ni siquiera los mapas con el mismo número son intercambiables sin más entre juegos.