Saltar para o conteúdo principal

O que são masmorras modulares?

As masmorras modulares foram introduzidas no BetterStructures 2.0.0. Em vez de aparecerem como um único schematic fixo, são montadas dinamicamente a partir de módulos mais pequenos, construídos à mão. Os módulos podem formar masmorras com vários pisos e uma disposição diferente em cada geração.


Como são geradas as masmorras modulares​

  • Módulos Cada módulo tem dimensões configuráveis, frequentemente 16×16×16 blocos, embora alguns pacotes usem 32×16×32 ou outras dimensões. Os módulos têm pontos de ligação normalizados através de etiquetas nas suas faces, para se ligarem sem espaços nem sobreposições. As dimensões são definidas por moduleSizeXZ e moduleSizeY na configuração do gerador de módulos. Cada módulo pode conter corredores, salas, escadas ou espaços para encontros especiais.

  • Processo de geração Quando uma masmorra modular é gerada num novo chunk, o BetterStructures usa o algoritmo Wave Function Collapse (WFC) para montar proceduralmente os módulos disponíveis. Seleciona aleatoriamente módulos compatíveis, comparando as etiquetas das faces, e une-os numa masmorra completa. A duração depende do raio, do intervalo vertical, dos módulos disponíveis, das restrições e do desempenho do servidor. O cálculo da disposição é assíncrono; a colocação em fila partilha o tempo configurado por tick do servidor. Disposições grandes ou incompatíveis podem continuar a consumir muitos recursos ou não chegar a ser montadas.

  • Tamanho da masmorra O parâmetro de raio permite configurar diferentes tamanhos. Raios maiores produzem masmorras consideravelmente maiores, que podem estender-se por centenas de blocos. A maioria tem vários pisos, ligados por escadas ou passagens verticais. Estas ligações são definidas pelas entradas up e down do mapa borders: a face superior de um módulo liga-se ao módulo acima quando as etiquetas das faces opostas coincidem.


Variedade e integração de pacotes​

O catálogo inclui Dungeoneering Modules Free e Dungeoneering Modules Premium. O gerador de dungeoneering fornecido lista schematics iniciais dos dois pacotes. O catálogo inclui também Tommyknockers Modules Free e Tommyknockers Modules Premium, uma mina modular guardada por bosses do EliteMobs; o Premium requer o pacote Free. Instale os módulos e as dependências indicados pelo pacote, incluindo o conteúdo FreeMinecraftModels necessário. Adicionar módulos compatíveis amplia as disposições possíveis; instalar um schematic isolado não instala os modelos ou criaturas complementares.


Marcadores de entidades e recipientes​

A geração de módulos lê o texto frontal das placas e ignora linhas vazias. Escreva o marcador em minúsculas na primeira linha e os argumentos imediatamente abaixo. A correspondência distingue maiúsculas de minúsculas, exceto em [elitemobs]. A colocação modular remove todos os blocos de placa, incluindo placas decorativas e marcadores não suportados.

Etiqueta da placaLinhas adicionaisComportamento
[spawn]Tipo de entidade Bukkit na linha 2Gera uma entidade normal persistente, centrada no bloco da placa. Os mundos modulares dedicados também registam a localização como marcador de geração para integrações.
[chest]NenhumaColoca um baú e preenche-o usando treasureFile do gerador de módulos.
[trapped_chest]NenhumaColoca um baú armadilhado e preenche-o usando treasureFile do gerador de módulos.
[pool: poolname]NenhumaEscolhe um boss de um conjunto de geração do EliteMobs e gera-o centrado no bloco da placa. Em terreno existente, o boss é um boss regional do EliteMobs que aparece uma única vez. Num mundo modular dedicado, consulte a secção sobre conjuntos de geração para saber como são tratados os bosses normais e instanciados.
[elitemobs]Nome do ficheiro do boss do EliteMobs nas linhas seguintes, unidas sem separadoresApenas em módulos colocados em terreno existente (isWorldGeneration: false): gera um boss regional do EliteMobs que aparece uma única vez, centrado no bloco da placa. Os mundos modulares dedicados ignoram-no.
[barrel]NenhumaNum mundo modular dedicado, regista a localização de um barril para uma integração o materializar com spawnBarrels(). O marcador não coloca nem preenche o barril por si só.
[exit]Nomes dos componentes de subida e descida nas linhas 2 e 3, sem .schemRegista saídas num mundo modular dedicado. Uma integração tem de colocar os componentes de components/. Se faltar uma das linhas de argumentos, ambos os nomes passam a ser genericelevator_up e genericelevator_down.

Os marcadores [barrel] e [exit] só são processados com isWorldGeneration: true. Use isWorldGeneration: false para colocar masmorras em terreno existente; aí funcionam [spawn], [chest], [trapped_chest], [pool: poolname] e [elitemobs]. As placas de bosses em terreno existente precisam do EliteMobs ativo; sem ele, o BetterStructures regista um aviso por masmorra e não gera bosses. Os módulos não criam proteção de arena WorldGuard. Para barris de saque normais, coloque blocos de barril no módulo e configure o saque conforme descrito abaixo.

Conjuntos de geração​

As placas [pool: poolname] leem ficheiros de configuração na pasta spawn_pools/. Cada ficheiro é uma pequena configuração YAML com estes campos:

CampoPredefiniçãoDescrição
isEnabled—Não é lido. Os conjuntos de geração não têm opção de ativação.
poolStrings[]Lista de nomes de ficheiros de bosses EliteMobs elegíveis.
minLevel-1É guardado, mas não é lido.
maxLevel-1Nível atribuído aos bosses instanciados deste conjunto. Defina explicitamente um nível válido.

O processador requer EliteMobs e escolhe aleatoriamente um ficheiro de boss de poolStrings. Acrescenta o spawnPoolSuffix do gerador antes de .yml: o sufixo _hard seleciona poolname_hard.yml. Um gerador sem spawnPoolSuffix procura poolname.yml. Evite espaços no fim do nome do conjunto. Um ficheiro de conjunto em falta, uma lista poolStrings vazia ou um nome de ficheiro de boss que o EliteMobs não conheça regista um aviso e não gera nada para essa placa.

Num mundo modular dedicado, os bosses não instanciados aparecem durante a colocação. Os instanciados ficam em fila até uma integração chamar spawnInstancedEntities(). Cada um aparece com o maxLevel do conjunto e com um ID de dificuldade de instância do EliteMobs escolhido conforme a distância a que se encontra do ponto inicial da masmorra. A distância é o maior dos desvios em X e Z, medido em relação à largura da masmorra, (2 × radius − 1) × moduleSizeXZ: menos de um sexto dessa largura dá 2, menos de um terço dá 1 e qualquer posição mais afastada dá 0. useGradientLevels não afeta este cálculo.


Integrações de modelos e criaturas​

A colocação modular e a colocação de estruturas normais processam as placas de formas diferentes. A colocação modular só processa placas [elitemobs] em terreno existente, como indicado acima. As placas de estrutura [mythicmobs] e [custom], documentadas em Criar estruturas, não são processadas na colocação modular. Use os marcadores de módulo suportados acima e siga as instruções de dependências do pacote de conteúdo.

Um schematic não recria automaticamente entidades de modelos pertencentes a outros plugins. Instale os modelos e plugins complementares exigidos pelo pacote escolhido; não conte com a substituição automática de um boss ausente por um modelo decorativo.


Dimensões dos módulos​

O tamanho dos módulos é configurável, não fixo.

Cada gerador define as dimensões dos seus módulos através de:

  • moduleSizeXZ: largura e profundidade em blocos; defina explicitamente de acordo com o schematic.
  • moduleSizeY: altura em blocos; defina explicitamente de acordo com o schematic.

Tamanho comum: 16×16×16 blocos; configure-o explicitamente. Alternativa comum: 32×16×32 blocos, usada em alguns pacotes de conteúdo.

Para criadores de módulos:

  1. Consulte moduleSizeXZ e moduleSizeY na configuração do gerador.
  2. Construa TODOS os módulos desse gerador com essas dimensões exatas.
  3. Verifique as dimensões reais do schematic e os pontos de ligação; o gerador não valida a geometria por si.

Definir dimensões personalizadas:

No ficheiro de configuração do gerador de módulos:

moduleSizeXZ: 32  # Width and depth
moduleSizeY: 16 # Height

Nota: todos os módulos de um gerador têm de usar as mesmas dimensões. Não pode misturar módulos de 16×16×16 e 32×16×32 no mesmo sistema de masmorras.


Campos de configuração do gerador de módulos​

Além de moduleSizeXZ e moduleSizeY, o gerador suporta os seguintes campos:

CampoPredefiniçãoDescrição
isEnabledtruePermite a seleção natural. O comando manual não verifica esta opção.
radiusDefinir explicitamenteRaio em células da grelha de módulos, cuja dimensão horizontal é moduleSizeXZ. A grelha reserva as células do limite exterior.
edgesfalseÉ guardado, mas o gerador atual não o lê. As extremidades usam etiquetas world_border.
startModule—Lista de ficheiros .schem iniciais. Um é escolhido ao acaso, com rotação 0, na posição da grelha (0, 0, 0).
minChunkY0Índice vertical mínimo inclusivo da grelha de módulos, não uma coordenada Y de bloco do mundo.
maxChunkY0Índice vertical máximo inclusivo da grelha de módulos. Inclua a camada 0 neste intervalo.
moduleSizeXZDefinir explicitamenteLargura e profundidade dos módulos em blocos.
moduleSizeYDefinir explicitamenteAltura dos módulos em blocos.
debugfalseDesenha blocos e texto de diagnóstico no mundo de destino. Use apenas numa área de geração descartável.
useGradientLevelsfalseÉ guardado, mas o cálculo atual dos conjuntos de geração não o lê.
spawnPoolSuffix—Sufixo dos nomes dos conjuntos de geração. Omita-o ou defina "" para nenhum.
isWorldGenerationfalsetrue cria um mundo vazio dedicado; false coloca no mundo existente.
treasureFile—Ficheiro de configuração do saque dos baús da masmorra.
generateLootInBarrelstrueDefine se os barris nos módulos recebem saque.
barrelTreasureFilenametreasure_barrel_food.ymlFicheiro de configuração do saque dos barris da masmorra.
validWorldsvazio, todos os mundosLista de nomes de mundos onde a masmorra pode ser gerada.
validWorldEnvironmentsvazio, todos os ambientesLista de ambientes permitidos: NORMAL, NETHER, THE_END, CUSTOM. O gerador de dungeoneering fornecido inclui explicitamente [NORMAL, CUSTOM], pelo que as masmorras são inicialmente geradas apenas em mundos do tipo Overworld. Veja abaixo o comportamento quando a chave está ausente.
centerModuleAltitude0Coordenada Y inicial da geração natural em terreno existente. A camada 0 fica deslocada para cima metade de moduleSizeY. A colocação manual num mundo existente começa na posição do jogador; num mundo dedicado começa em (0, 0, 0).

As chaves ausentes usam o valor atual do campo na definição do gerador. Os geradores pré-fabricados inicializam esses valores para o seu conteúdo. Um gerador escrito à mão começa com 0 em radius, moduleSizeXZ e moduleSizeY; esses zeros também podem ser escritos no ficheiro. Não assuma que uma dimensão ausente se torna 16. A ausência de validWorlds e validWorldEnvironments não impõe restrições, pelo que não limita o gerador a NORMAL e CUSTOM. Parta de um gerador completo que funcione e defina explicitamente o raio, as dimensões, os módulos iniciais e as restrições de mundos.


Campos de configuração de cada módulo​

Cada módulo pode definir estes campos:

CampoPredefiniçãoDescrição
isEnabledtrueAtiva ou desativa o módulo.
weight100Peso de seleção durante a geração. Um valor negativo ou não finito regista um aviso e passa a 0, o que retira o módulo da seleção.
repetitionPenalty0É somado ao peso por cada módulo adjacente já escolhido com o mesmo nome de schematic. Valores positivos favorecem a repetição; negativos reduzem-na. Mantenha o peso final positivo.
noRepeatfalseExclui este candidato junto de um módulo escolhido com a mesma identidade de configuração, incluindo clones. Não limita a uma ocorrência por masmorra.
enforceVerticalRotationfalseExige rotações iguais no eixo Y entre módulos sobrepostos quando qualquer um ativa a opção.
enforceHorizontalRotationfalseExige rotações iguais no eixo Y entre vizinhos horizontais quando qualquer um ativa a opção.
minY-4Camada mínima inclusiva da grelha de módulos para selecionar candidatos.
maxY20Camada máxima inclusiva da grelha de módulos para selecionar candidatos.
biomedefaultÉ guardado, mas não restringe a seleção de módulos.
minecraftBiomenullÉ guardado, mas não restringe a seleção de módulos.
treasureFile—É carregado como configuração do módulo, mas os baús marcados na colocação modular atual usam treasureFile do gerador de módulos.
generateLootInBarrelstrueDefine se os barris deste módulo recebem saque.
barrelTreasureFilenametreasure_barrel_food.ymlFicheiro de configuração do saque dos barris deste módulo.
borders—Mapa de etiquetas das faces que define a compatibilidade das ligações.
cloneConfig—Copia as definições de outro ficheiro de configuração de módulo.
compoundModule—É guardado, mas o gerador atual não o usa para montar módulos compostos.
isAutomaticallyPlacedtruePermite a seleção normal de candidatos. Um módulo inicial configurado ignora este filtro.

Defina as seis entradas de borders: north, south, east, west, up e down, cada uma com uma lista de etiquetas. As etiquetas normais têm de coincidir exatamente, incluindo maiúsculas e minúsculas. Por exemplo, corridor coincide com corridor; no-mirror_corridor coincide com corridor, mas não pode ligar-se a outro no-mirror_corridor. Cada módulo recebe quatro rotações no eixo Y: 0, 90, 180 e 270 graus.

nothing permite um vizinho vazio. world_border identifica módulos para o anel horizontal exterior onde é possível colocar módulos; cada face virada para fora tem de conter apenas etiquetas world_border. Use nothing para fechar os limites superior e inferior. Um raio de 5 permite até 9 × 9 células horizontais de módulos, rodeadas por um limite vazio. Estas regras filtram os candidatos normais; o módulo inicial é colocado diretamente, pelo que a sua configuração e geometria têm de ser adequadas à origem.

Em cloneConfig, indique o nome do ficheiro .yml de outro módulo. Este módulo passa a ler todas as definições clonadas desse ficheiro. Quando o destino existe, o BetterStructures apaga do ficheiro deste módulo as chaves redundantes: treasureFile, barrelTreasureFilename, generateLootInBarrels, borders, minY, maxY, weight, repetitionPenalty, as duas opções de rotação, noRepeat, as seis chaves *IsPassable e isAutomaticallyPlaced. Permanecem no ficheiro isEnabled, biome, minecraftBiome, cloneConfig e compoundModule. A pesquisa de módulos compostos em execução também segue o destino do clone. Se o ficheiro indicado não existir, a clonagem é ignorada com um aviso e o módulo mantém os seus próprios valores.

Também encontrará northIsPassable, southIsPassable, eastIsPassable, westIsPassable, upIsPassable e downIsPassable nas configurações geradas. O valor predefinido é true, mas o gerador não lê estes campos: alterá-los não produz efeito. Use borders.

Não crie ciclos de cloneConfig. Um ciclo como a.yml -> b.yml -> a.yml interrompe o carregamento de módulos com um erro "Cyclic module clone configuration" que indica a cadeia.


Gerar uma masmorra manualmente com /bs generateModules​

/bs generateModules <ModuleGeneratorsConfigFile.yml> executa um gerador de módulos quando desejar, sem esperar pela geração natural do mundo. O preenchimento com Tab lista todos os ficheiros de geradores de módulos carregados.

O resultado depende de isWorldGeneration:

  • isWorldGeneration: true: o BetterStructures cria um mundo novo para a masmorra. Usa o nome do ficheiro do gerador com _0, _1, _2 e assim sucessivamente, escolhendo o primeiro sufixo cuja pasta ainda não exista. É um mundo vazio com ambiente NORMAL, sem manter os chunks do ponto inicial em memória e com gravação automática desativada. O comando coloca o jogador em modo espectador, mas não o teletransporta para o novo mundo.
  • isWorldGeneration: false: a geração ocorre no mundo onde se encontra.

Uma barra de boss acompanha a montagem da disposição e desaparece quando a colocação entra em fila. A mensagem de montagem não significa que os blocos ou entidades já tenham sido colocados. Se nenhum schematic inicial configurado estiver instalado, a geração termina; um módulo inicial desativado também pode causar o cancelamento por o seu contentor não estar disponível.

O comando requer um jogador com betterstructures.generatemodules e é recusado durante um recarregamento de conteúdo. A geração manual ignora as verificações naturais, incluindo a ativação do gerador, as restrições de mundos e a proteção da área ocupada. Escolha o destino com cuidado.

Localização dos ficheiros de módulos​

Os módulos ficam em plugins/BetterStructures/modules. A pesquisa é recursiva: um pacote pode guardar os seus ficheiros .schem em subpastas, e as configurações .yml correspondentes são geradas junto deles.

Os nomes dos schematics têm de ser únicos em toda a árvore modules. Nomes duplicados ou um schematic ilegível interrompem o carregamento de módulos. Os schematics são lidos antes de verificar isEnabled; desativar um módulo não contorna um ficheiro danificado. A pasta de um pacote de conteúdo com isEnabled: false é totalmente ignorada, pelo que os seus módulos não são lidos nem carregados.

Colocação natural e proteção das masmorras​

A geração natural verifica toda a área configurada. A colocação é ignorada se houver sobreposição com o raio de proteção configurado à volta das coordenadas (0, 0), uma região WorldGuard com nome ou chunks gerados que não tenham sido observados recentemente como novos. Imediatamente antes de colocar a operação em fila, volta a verificar WorldGuard e rejeita a execução se um chunk inicialmente por gerar tiver sido gerado entretanto. Verifica o estado dos chunks, não os blocos construídos por jogadores nem outros plugins de proteção. Criar um chunk novo ao lado de uma base antiga não torna toda a área elegível.

Mantenha isWorldGeneration: false nos geradores selecionados naturalmente. O seletor natural não exclui geradores com true; essa opção continua a criar um mundo separado em vez de colocar no terreno verificado.

Os blocos, entidades de bloco, saque, entidades e marcadores partilham o tempo configurado para a colocação. WorldGenerationFinishEvent é emitido após uma colocação bem-sucedida num mundo dedicado e o pós-processamento imediato. Não significa que uma integração tenha colocado saídas ou gerado os bosses instanciados em fila. Construções grandes podem precisar de vários ticks após o cálculo da disposição.

Precedência do saque dos módulos​

Os baús e baús armadilhados marcados usam treasureFile do gerador de módulos. Para os blocos de barril, tanto o gerador como o módulo têm de permitir generateLootInBarrels. Um barrelTreasureFilename não vazio no módulo prevalece sobre o valor do gerador; os ficheiros de módulo gerados usam treasure_barrel_food.yml por predefinição. O preenchimento de baús e barris emite o evento cancelável ChestFillEvent antes de aplicar o conteúdo ao inventário.

Use marcadores de baú para gerar o respetivo saque. A colocação modular atual não preserva os inventários dos baús normais, baús armadilhados e barris do schematic. Os blocos de barreira são ignorados; os marcadores de bedrock tornam-se pedra apenas quando o destino não é sólido. O ar escava interiores nos mundos existentes e é ignorado nos mundos vazios dedicados.

As entidades guardadas num módulo, como suportes de armadura, pinturas e molduras, são colocadas com ele. As pinturas e molduras rodam com a rotação do módulo para continuarem presas à parede.