¿Qué son las mazmorras modulares?
Las mazmorras modulares son un sistema de mazmorras introducido en BetterStructures 2.0.0 y posterior. En lugar de generarse como un único schematic fijo, las mazmorras modulares se ensamblan dinámicamente a partir de módulos más pequeños y hechos a mano. Los módulos pueden formar mazmorras de varios pisos con una distribución distinta en cada generación.
Cómo se generan las mazmorras modulares
-
Módulos Cada módulo se construye con un tamaño configurable (a menudo 16x16x16 bloques, aunque algunos paquetes usan 32x16x32 u otras dimensiones). Los módulos tienen puntos de conexión estandarizados mediante un sistema de etiquetas de borde para unirse sin huecos ni superposiciones. Las dimensiones de la mazmorra se establecen con
moduleSizeXZymoduleSizeYen la configuración del generador de módulos. Los módulos pueden contener pasillos, habitaciones, escaleras o espacios especiales de encuentro. -
Proceso de generación Cuando una mazmorra modular se genera en un nuevo chunk, BetterStructures usa un algoritmo Wave Function Collapse (WFC) para ensamblar proceduralmente módulos del pool disponible. El sistema selecciona aleatoriamente módulos compatibles basándose en la coincidencia de etiquetas de borde y los "cose" juntos en una mazmorra completa. El tiempo depende del radio, el rango vertical, los módulos disponibles, las restricciones y el rendimiento del servidor. El cálculo del diseño es asíncrono; el pegado en cola comparte el tiempo configurado por tick del servidor. Los diseños grandes o incompatibles pueden seguir consumiendo muchos recursos o no llegar a ensamblarse.
-
Tamaño de la mazmorra Las mazmorras pueden configurarse para generarse en varios tamaños usando el parámetro de radio. Valores de radio más grandes crean mazmorras significativamente más grandes que pueden abarcar cientos de bloques. La mayoría de las mazmorras incluyen múltiples pisos, conectados a través de módulos de escaleras o pozos verticales. Las conexiones verticales entre pisos se logran a través de las entradas
up/downdel mapa de etiquetas de bordebordersde un módulo: la cara superior de un módulo se une a un vecino que está encima cuando sus etiquetas de borde opuestas coinciden.
Variedad e integración de paquetes
El catálogo incluye Dungeoneering Modules Free y Dungeoneering Modules Premium. El generador de dungeoneering distribuido enumera esquemas iniciales de ambos paquetes. El catálogo también incluye Tommyknockers Modules Free y Tommyknockers Modules Premium, una mina modular custodiada por jefes de EliteMobs; Premium requiere el paquete Free. Instala los módulos y las dependencias indicadas por el paquete, incluido el contenido de FreeMinecraftModels necesario. Añadir módulos compatibles amplía las distribuciones disponibles; instalar un esquema por sí solo no instala su contenido complementario de modelos o mobs.
Marcadores de entidades y contenedores
La generación de módulos lee el texto frontal de los carteles y descarta las líneas vacías. Escribe el marcador en minúsculas en la primera línea y sus argumentos justo debajo. La coincidencia distingue mayúsculas y minúsculas, salvo en [elitemobs]. El pegado modular elimina todos los bloques de cartel, incluidos los decorativos y los marcadores no compatibles.
| Etiqueta del cartel | Líneas adicionales | Comportamiento |
|---|---|---|
[spawn] | Tipo de entidad de Bukkit en la línea 2 | Genera una entidad vanilla persistente centrada en el bloque del cartel. Los mundos modulares dedicados también registran la posición como marcador de aparición para integraciones. |
[chest] | Ninguna | Coloca un cofre y lo llena con el treasureFile del generador de módulos. |
[trapped_chest] | Ninguna | Coloca un cofre trampa y lo llena con el treasureFile del generador de módulos. |
[pool: poolname] | Ninguna | Elige un jefe de un grupo de aparición de EliteMobs y lo genera centrado en el bloque del cartel. En terreno existente, el jefe es un jefe regional de EliteMobs de un solo uso. En un mundo modular dedicado, consulta la sección de grupos de aparición para ver cómo se tratan los jefes normales e instanciados. |
[elitemobs] | Nombre de archivo del jefe de EliteMobs en las líneas siguientes, unidas sin separadores | Solo en módulos pegados en terreno existente (isWorldGeneration: false): genera un jefe regional de EliteMobs de un solo uso centrado en el bloque del cartel. Los mundos modulares dedicados lo ignoran. |
[barrel] | Ninguna | En un mundo modular dedicado, registra una posición de barril para que una integración lo materialice mediante spawnBarrels(). No coloca ni llena un barril por sí mismo. |
[exit] | Nombres de componentes superior e inferior en las líneas 2 y 3, sin .schem | Registra salidas en un mundo modular dedicado. Una integración debe colocar los componentes de components/. Si falta cualquiera de las dos líneas de argumentos, ambos nombres pasan a ser genericelevator_up y genericelevator_down. |
Los marcadores [barrel] y [exit] solo se procesan con isWorldGeneration: true. Usa isWorldGeneration: false para pegar mazmorras en terreno existente; ahí funcionan [spawn], [chest], [trapped_chest], [pool: poolname] y [elitemobs]. Los carteles de jefes en terreno existente necesitan EliteMobs activado; sin él, BetterStructures registra una advertencia por mazmorra y no genera ningún jefe. Los módulos no crean protección de arena de WorldGuard. Para barriles de botín normales, coloca bloques de barril reales en el módulo y configura su botín como se explica más abajo.
Grupos de aparición
Los carteles [pool: poolname] leen de archivos de configuración de pool de spawn en la carpeta spawn_pools/. Cada archivo de pool de spawn es una pequeña configuración YAML con estos campos:
| Campo | Predeterminado | Descripción |
|---|---|---|
isEnabled | — | No se lee. Los grupos de aparición no tienen interruptor de activación. |
poolStrings | [] | Lista de nombres de archivo de jefes de EliteMobs elegibles para este pool |
minLevel | -1 | Se guarda, pero no se lee. |
maxLevel | -1 | Nivel que reciben los jefes instanciados de este grupo. Establece un nivel válido explícito. |
El procesador requiere EliteMobs y elige al azar un archivo de jefe de poolStrings. Añade el spawnPoolSuffix del generador antes de .yml: el sufijo _hard selecciona poolname_hard.yml. Un generador sin spawnPoolSuffix busca poolname.yml. Evita espacios al final del nombre del grupo. Si falta el archivo del grupo, la lista poolStrings está vacía o EliteMobs no conoce el nombre de archivo del jefe, se registra una advertencia y ese cartel no genera nada.
En un mundo modular dedicado, los jefes no instanciados aparecen durante el pegado. Los instanciados quedan en cola hasta que una integración llama a spawnInstancedEntities(). Cada uno aparece con el maxLevel del grupo y con un ID de dificultad de instancia de EliteMobs elegido según lo lejos que esté del punto de inicio de la mazmorra. La distancia es el mayor de los desplazamientos en X y Z, medido respecto al ancho de la mazmorra, (2 × radius − 1) × moduleSizeXZ: menos de un sexto de ese ancho da 2, menos de un tercio da 1 y cualquier distancia mayor da 0. useGradientLevels no influye en esto.
Integraciones de modelos y mobs
El pegado modular y el pegado de estructuras normales usan procesadores de carteles distintos. El pegado modular procesa los carteles [elitemobs] solo en terreno existente, como se indica arriba. El pegado modular no procesa los carteles de estructura [mythicmobs] y [custom] documentados en Crear estructuras. Usa los marcadores de módulo compatibles indicados arriba y sigue las instrucciones sobre dependencias del paquete.
Un esquema no recrea por sí solo cualquier entidad de modelo gestionada por un plugin. Instala el contenido de modelos y los plugins complementarios que requiera tu paquete; no dependas de que un jefe ausente se convierta automáticamente en un modelo decorativo.
Dimensiones del módulo
Importante: El tamaño del módulo es configurable, no fijo.
Cada generador de módulos define su tamaño de módulo estándar usando:
moduleSizeXZ: ancho y profundidad en bloques (establécelo explícitamente para que coincida con el esquema)moduleSizeY: altura en bloques (establécela explícitamente para que coincida con el esquema)
Tamaño habitual: 16×16×16 bloques; configúralo explícitamente Alternativa común: 32×16×32 bloques (usado en algunos paquetes de contenido)
Para creadores de módulos:
- Revisa tu configuración de generador para los valores de
moduleSizeXZymoduleSizeY - Construye TODOS los módulos para ese generador con estas dimensiones exactas
- Comprueba que las dimensiones reales del esquema y los puntos de conexión coinciden; el generador no valida su geometría por ti
Configurar dimensiones personalizadas: En tu archivo de configuración del generador de módulos:
moduleSizeXZ: 32 # Width and depth
moduleSizeY: 16 # Height
Nota: Todos los módulos en un generador deben usar las mismas dimensiones. No puedes mezclar módulos de 16×16×16 y 32×16×32 en el mismo sistema de mazmorra.
Campos de configuración del generador de módulos
Además de moduleSizeXZ y moduleSizeY, la configuración del generador de módulos soporta los siguientes campos:
| Campo | Predeterminado | Descripción |
|---|---|---|
isEnabled | true | Permite la selección natural. El comando manual no comprueba este interruptor. |
radius | Escríbelo explícitamente | Radio en celdas de la cuadrícula modular, cuyo tamaño horizontal es moduleSizeXZ. La retícula reserva las celdas del límite exterior. |
edges | false | Se guarda, pero el generador actual no lo lee. Los bordes usan etiquetas world_border. |
startModule | — | Lista de archivos .schem iniciales. Se elige uno al azar, con rotación 0, en la posición de cuadrícula (0, 0, 0). |
minChunkY | 0 | Índice vertical mínimo inclusivo de la cuadrícula modular, no una coordenada Y de bloque del mundo. |
maxChunkY | 0 | Índice vertical máximo inclusivo de la cuadrícula modular. Incluye la capa 0 en este intervalo. |
moduleSizeXZ | Escríbelo explícitamente | Ancho y profundidad de los módulos en bloques |
moduleSizeY | Escríbelo explícitamente | Altura de los módulos en bloques |
debug | false | Dibuja bloques y texto de diagnóstico en el mundo de destino. Úsalo solo en una zona de generación desechable. |
useGradientLevels | false | Se guarda, pero el cálculo actual de los grupos de aparición no lo lee. |
spawnPoolSuffix | — | Sufijo añadido a los nombres de grupos de aparición. Omítelo o usa "" para no añadir ninguno. |
isWorldGeneration | false | true crea un mundo vacío dedicado; false pega en el mundo existente. |
treasureFile | — | Archivo de configuración de tesoro para los cofres de esta mazmorra |
generateLootInBarrels | true | Si los barriles de los módulos deben llenarse con botín |
barrelTreasureFilename | treasure_barrel_food.yml | Archivo de configuración de tesoro usado para llenar los barriles de esta mazmorra |
validWorlds | vacío (todos los mundos) | Lista de nombres de mundos válidos donde la mazmorra puede generarse |
validWorldEnvironments | vacío (todos los entornos) | Lista de entornos de mundo válidos (NORMAL, NETHER, THE_END, CUSTOM). El generador de dungeoneering distribuido viene explícitamente con [NORMAL, CUSTOM], así que de fábrica las mazmorras solo se generan en mundos de tipo overworld. Consulta la nota de abajo para saber qué ocurre cuando falta la clave. |
centerModuleAltitude | 0 | Coordenada Y inicial de la generación natural en terreno existente. La capa 0 queda desplazada hacia arriba la mitad de moduleSizeY. La colocación manual en un mundo existente empieza en la posición del jugador; un mundo dedicado empieza en (0, 0, 0). |
Las claves ausentes usan el valor actual del campo en la definición del generador. Los generadores predefinidos inicializan esos valores para su contenido. Un generador escrito a mano empieza con 0 en radius, moduleSizeXZ y moduleSizeY; esos ceros también pueden escribirse en el archivo. No supongas que un tamaño ausente se convierte en 16. La ausencia de validWorlds y validWorldEnvironments no impone restricciones, por lo que no limita el generador a NORMAL/CUSTOM. Parte de un generador completo que funcione y establece explícitamente el radio, las dimensiones, los módulos iniciales y las restricciones de mundos.
Campos de configuración por módulo
Cada módulo individual puede definir los siguientes campos de configuración:
| Campo | Predeterminado | Descripción |
|---|---|---|
isEnabled | true | Si este módulo está habilitado |
weight | 100 | Peso de selección para este módulo durante la generación. Un valor negativo o no finito registra una advertencia y se convierte en 0, lo que saca al módulo de la selección. |
repetitionPenalty | 0 | Se suma al peso por cada módulo adyacente ya elegido con el mismo nombre de esquema. Los valores positivos favorecen la repetición; los negativos la reducen. Mantén positivo el peso resultante. |
noRepeat | false | Excluye este candidato junto a un módulo ya elegido con la misma identidad de configuración, incluidos los clones. No limita su aparición a una por mazmorra. |
enforceVerticalRotation | false | Exige la misma rotación sobre el eje Y entre módulos situados uno encima del otro si cualquiera lo activa. |
enforceHorizontalRotation | false | Exige la misma rotación sobre el eje Y entre vecinos horizontales si cualquiera lo activa. |
minY | -4 | Capa mínima inclusiva de la cuadrícula modular para seleccionar candidatos. |
maxY | 20 | Capa máxima inclusiva de la cuadrícula modular para seleccionar candidatos. |
biome | default | Se guarda, pero no restringe la selección de módulos. |
minecraftBiome | null | Se guarda, pero no restringe la selección de módulos. |
treasureFile | — | Se carga como configuración del módulo, pero los cofres de marcadores del pegado modular actual usan el treasureFile del generador de módulos. |
generateLootInBarrels | true | Si los barriles de este módulo deben llenarse con botín |
barrelTreasureFilename | treasure_barrel_food.yml | Archivo de configuración de tesoro usado para llenar los barriles de este módulo |
borders | — | Mapa de etiquetas de borde que define la compatibilidad de conexión |
cloneConfig | — | Clonar configuración desde otro archivo de configuración de módulo |
compoundModule | — | Se guarda, pero el generador actual no lo usa para ensamblar módulos compuestos. |
isAutomaticallyPlaced | true | Permite la selección ordinaria de candidatos. Un módulo inicial configurado omite este filtro. |
Define las seis entradas de borders: north, south, east, west, up y down, cada una con una lista de etiquetas. Las etiquetas ordinarias deben coincidir exactamente, incluidas mayúsculas y minúsculas. Por ejemplo, corridor coincide con corridor; no-mirror_corridor coincide con corridor, pero no puede conectarse a otro no-mirror_corridor. Cada módulo recibe cuatro rotaciones sobre el eje Y: 0, 90, 180 y 270 grados.
nothing permite un vecino vacío. world_border identifica los módulos del anillo horizontal exterior que admite colocación; cada cara orientada hacia fuera debe contener solo etiquetas world_border. Usa nothing para cerrar los límites superior e inferior. Un radio de 5 permite hasta 9 × 9 celdas horizontales de módulos y deja vacío el límite que las rodea. Estas reglas filtran los candidatos ordinarios; el módulo inicial se coloca directamente, por lo que su configuración y geometría deben ser adecuadas para el origen.
Nota sobre cloneConfig: apúntalo al nombre .yml de otro módulo para leer de ese archivo todos los ajustes clonados. Cuando se encuentra el destino, BetterStructures elimina del archivo local las claves redundantes: treasureFile, barrelTreasureFilename, generateLootInBarrels, borders, minY, maxY, weight, repetitionPenalty, los dos interruptores de rotación, noRepeat, las seis claves *IsPassable e isAutomaticallyPlaced. isEnabled, biome, minecraftBiome, cloneConfig y compoundModule permanecen en el archivo. La búsqueda del módulo compuesto durante la ejecución también sigue el destino del clon. Si el archivo indicado no existe, se ignora el clonado con una advertencia y el módulo conserva sus propios valores.
También verás northIsPassable, southIsPassable, eastIsPassable, westIsPassable, upIsPassable y downIsPassable escritos en las configuraciones de módulo generadas. Su valor por defecto es true y nada en el generador los lee: cambiarlos no tiene ningún efecto. Usa borders en su lugar.
No crees ciclos de cloneConfig. Un ciclo como a.yml -> b.yml -> a.yml detiene la carga de módulos con un error "Cyclic module clone configuration" que nombra la cadena.
Generar una mazmorra manualmente con /bs generateModules
/bs generateModules <ModuleGeneratorsConfigFile.yml> ejecuta un generador de módulos bajo demanda en lugar de esperar a que aparezca uno durante la generación del mundo. El autocompletado lista todos los archivos de generador de módulos cargados.
Lo que ocurre depende del ajuste isWorldGeneration del generador:
isWorldGeneration: true- BetterStructures crea un mundo nuevo para la mazmorra. Su nombre es el del archivo del generador con_0,_1,_2... añadido, usando el primer sufijo cuya carpeta no exista. Es un mundo vacío con entornoNORMAL, sin mantener los chunks de aparición en memoria y con el autoguardado desactivado. El comando pone al jugador en modo espectador, pero no lo teletransporta al nuevo mundo.isWorldGeneration: false- la generación ocurre en el mundo en el que estás.
Una barra de jefe muestra el ensamblaje del diseño y desaparece cuando el pegado entra en cola. El mensaje de ensamblaje no significa que los bloques o entidades hayan terminado de pegarse. Si no está instalado ningún esquema inicial configurado, la generación se detiene; un módulo inicial desactivado también puede cancelarla porque su contenedor no está disponible.
El comando requiere un jugador con betterstructures.generatemodules y se rechaza durante una recarga de contenido. La generación manual omite las comprobaciones naturales, incluidos la activación del generador, las restricciones de mundos y la protección de la superficie ocupada. Elige el destino con cuidado.
Dónde se guardan los archivos de módulo
Los módulos van en plugins/BetterStructures/modules, que se analiza de forma recursiva: un paquete de contenido puede mantener sus archivos .schem en subcarpetas y las configuraciones .yml correspondientes se generan junto a ellos.
Los nombres de esquemas deben ser únicos en todo el árbol de modules. Los duplicados o un esquema ilegible interrumpen la carga de módulos. Los esquemas se leen antes de comprobar isEnabled, por lo que desactivar un módulo no evita el fallo de un archivo corrupto. La carpeta de un paquete de contenido con isEnabled: false se omite por completo, así que sus módulos no se leen ni se cargan.
Colocación y protección de mazmorras naturales
La generación natural comprueba toda la superficie configurada. Omite la colocación si se solapa con el radio de protección configurado alrededor de (0, 0), una región de WorldGuard con nombre o chunks generados que no se hayan observado recientemente como nuevos. Justo antes de poner el pegado en cola vuelve a comprobar WorldGuard y rechaza la ejecución si un chunk inicialmente sin generar se ha generado desde entonces. Es una comprobación del estado de los chunks, no de bloques colocados por jugadores ni de otros plugins de protección. Crear un chunk nuevo junto a una base antigua no hace apta toda la superficie.
Mantén isWorldGeneration: false en los generadores seleccionados de forma natural. El selector natural no excluye los que tienen true; ese ajuste sigue creando un mundo aparte en vez de pegar en el terreno comprobado.
Los bloques, entidades de bloque, botín, entidades y marcadores comparten el tiempo configurado para el pegado. WorldGenerationFinishEvent se emite tras un pegado correcto en un mundo dedicado y su procesamiento posterior inmediato. No significa que una integración haya colocado salidas o generado los jefes instanciados en cola. Las construcciones grandes pueden necesitar varios ticks después del cálculo del diseño.
Prioridad del botín de módulos
Los cofres y cofres trampa de marcadores usan el treasureFile del generador de módulos. Para los bloques de barril reales, tanto el generador como el módulo deben permitir generateLootInBarrels. Un barrelTreasureFilename no vacío del módulo tiene prioridad sobre el valor del generador; los archivos de módulo generados usan treasure_barrel_food.yml por defecto. Tanto los cofres como los barriles emiten el evento cancelable ChestFillEvent antes de aplicar sus instantáneas de inventario.
Usa marcadores de cofre para generar su botín. El pegado modular actual no conserva los inventarios de cofres normales, cofres trampa ni barriles del esquema. Los bloques de barrera se omiten; los marcadores de bedrock se convierten en piedra solo si el destino no es sólido. El aire excava interiores en mundos existentes y se omite en mundos vacíos dedicados.
Las entidades guardadas en un módulo, como soportes para armaduras, cuadros y marcos, se pegan con él. Los cuadros y marcos giran con la rotación del módulo para seguir fijados a su pared.