Solucionar errores

Solucionar el error de leak del mapa: "leaked" al compilar en Hammer

Solucionar un leak del mapa: qué significa el aviso "leaked" de VBSP, cómo encontrar el hueco con el pointfile y por qué una skybox gigante no es la solución.

El mensaje **** leaked **** significa que el interior de tu mapa no está sellado frente al vacío: existe un camino desde una entity hasta el exterior. En Hammer, carga el pointfile con Map → Load Pointfile, sigue la línea roja hasta el hueco y ciérralo con un world brush sólido.

Qué es un leak en la geometría del mapa

VBSP tiene que saber qué es interior y qué es exterior. Para averiguarlo, la herramienta llena el mapa de aire, por así decirlo, partiendo de las entities. Todo lo que ese relleno alcanza cuenta como interior. El resto es vacío y se descarta. Si el relleno llega al vacío, deja de haber un interior definido y en el log aparece algo así:

**** leaked ****
Entity info_player_start (128.00 -64.00 32.00) leaked!

La entity que se nombra ahí no suele ser la causa, salvo que ella misma esté fuera del mapa. Solo es el punto de partida desde el que VBSP encontró la salida.

Las consecuencias van mucho más allá de esa línea. VBSP no escribe el archivo de portales, así que VVIS no puede calcular la visibilidad. Sin datos de visibilidad, VRAD solo trabaja con luz directa. El mapa suele cargar igualmente, pero rinde mal y queda mal iluminado. Cómo dependen entre sí las tres herramientas lo explica el artículo sobre VBSP, VVIS y VRAD.

Encontrar el leak: carga el pointfile y sigue la línea roja

  1. Compila el mapa. Cuando hay un leak, VBSP crea junto al VMF un archivo con la extensión .lin. Ese es el pointfile.
  2. En Hammer, elige Map → Load Pointfile y confirma el archivo que te propone.
  3. Aparece una línea roja en las vistas 2D y en la vista 3D. Empieza en la entity del log y termina en el vacío.
  4. Sigue la línea en la vista 3D hasta el punto en el que atraviesa la envolvente exterior. Ahí está el hueco.
  5. Cierra el hueco, quita la línea con Map → Unload Pointfile y vuelve a compilar.

VBSP solo informa de un camino cada vez. Si el mapa tiene varios puntos sin sellar, repite el proceso hasta que el mensaje desaparezca. Con View → Go to Coordinates puedes saltar directamente a las coordenadas del log.

Causas típicas

CausaCómo reconocerlaSolución
Hueco entre dos brushesLa línea pasa por una rendija estrecha, a menudo en esquinas o paredes inclinadasAlinea los brushes a la rejilla hasta que cierren a ras
La pared exterior es func_detail u otra brush entityLa línea atraviesa una pared que parece cerradaSelecciona el brush y devuélvelo al mundo con Ctrl+Shift+W
Displacement como límite exteriorLa línea sale por el terreno, hacia abajo o hacia un ladoPon detrás un world brush sólido con tools/toolsnodraw
Entity fuera del mapaEl log nombra una entity con coordenadas en el vacíoBorra la entity o muévela dentro del mapa
Brush dañadoMap → Check for Problems (Alt+P) informa de un sólido no válidoRepara el brush o constrúyelo de nuevo

Hay dos detalles que se pasan por alto con facilidad. Primero, solo los world brushes sellan un mapa. Todo lo que está ligado a una entity, como func_detail, func_brush o una puerta, deja pasar a VBSP por ese punto. Lo mismo ocurre con los displacements y los modelos. Segundo, de una entity lo que cuenta es su origen. Un prop puede estar completamente a la vista dentro del mapa mientras su origen queda detrás de la pared, en el vacío.

Por qué una skybox gigante alrededor del mapa no es la solución

Una gran caja hueca alrededor de todo el mapa hace desaparecer el mensaje, porque la salida termina ahora en la pared de la caja. El problema real sigue ahí y vuelve con otra forma:

  • Todo el espacio entre el mapa y la caja cuenta como interior. VBSP lo divide en visleafs y VVIS tiene que procesar cada uno de ellos. El tiempo de compilación se dispara.
  • Normalmente VBSP elimina todas las caras que dan al vacío. Con la caja, las caras exteriores y traseras de tu geometría se conservan, se iluminan y se renderizan en el juego.
  • El cálculo de visibilidad consigue mucho menos, porque zonas que de otro modo estarían separadas se ven entre sí a través del espacio exterior. La tasa de fotogramas cae.

Así que coloca brushes de skybox solo donde de verdad se vea el cielo y mantenlos pegados al mapa.

Evitar los leaks desde el principio

  • Construye la envolvente exterior con world brushes grandes y sencillos, alineados a la rejilla. Los detalles van delante como func_detail.
  • Pon un brush sólido con tools/toolsnodraw debajo y detrás de cada displacement.
  • Compila a menudo. Un leak que aparece justo después de un cambio se acota enseguida.
  • En mapas grandes, usa la herramienta cordon para compilar solo una parte y acotar la zona.

Si en el log hay más mensajes además del leak, muchas veces son errores derivados. Puedes pegar un compile log en el Map Scanner. Detecta causas raíz, errores derivados y las soluciones adecuadas en logs de VBSP, VVIS y VRAD. También puedes consultar mensajes concretos en la base de datos de errores. El artículo sobre cómo leer un compile log te enseña a interpretar un log por tu cuenta.

Preguntas frecuentes

¿Qué significa "leaked" al compilar?

Que el interior del mapa no está completamente rodeado de world brushes sólidos. VBSP ha encontrado un camino desde una entity hasta el vacío. Mientras siga así, faltan los datos de visibilidad y la iluminación completa.

¿Dónde encuentro el pointfile en Hammer?

En el menú Map, en Load Pointfile. El archivo con la extensión .lin está en la misma carpeta que tu VMF y tiene el mismo nombre. Solo se crea cuando VBSP ha encontrado realmente un leak.

¿Puedo jugar igualmente un mapa que tiene un leak?

Muchas veces sí, pero tiene poco sentido. Sin datos de visibilidad el motor renderiza mucho más de lo necesario y la iluminación se reduce a la luz directa. Un mapa con un leak no está listo para publicarse.

¿Sella func_detail un mapa?

No. func_detail es una brush entity y se ignora al sellar. Las paredes, los suelos y los techos que cierran el mapa hacia fuera tienen que ser world brushes normales.