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
moduleSizeXZemoduleSizeYna 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
upedowndo mapaborders: 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 placa | Linhas adicionais | Comportamento |
|---|---|---|
[spawn] | Tipo de entidade Bukkit na linha 2 | Gera 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] | Nenhuma | Coloca um baú e preenche-o usando treasureFile do gerador de módulos. |
[trapped_chest] | Nenhuma | Coloca um baú armadilhado e preenche-o usando treasureFile do gerador de módulos. |
[pool: poolname] | Nenhuma | Escolhe 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 separadores | Apenas 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] | Nenhuma | Num 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 .schem | Regista 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:
| Campo | Predefinição | Descriçã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 | -1 | Ní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:
- Consulte
moduleSizeXZemoduleSizeYna configuração do gerador. - Construa TODOS os módulos desse gerador com essas dimensões exatas.
- 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:
| Campo | Predefinição | Descrição |
|---|---|---|
isEnabled | true | Permite a seleção natural. O comando manual não verifica esta opção. |
radius | Definir explicitamente | Raio em células da grelha de módulos, cuja dimensão horizontal é moduleSizeXZ. A grelha reserva as células do limite exterior. |
edges | false | É 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). |
minChunkY | 0 | Índice vertical mínimo inclusivo da grelha de módulos, não uma coordenada Y de bloco do mundo. |
maxChunkY | 0 | Índice vertical máximo inclusivo da grelha de módulos. Inclua a camada 0 neste intervalo. |
moduleSizeXZ | Definir explicitamente | Largura e profundidade dos módulos em blocos. |
moduleSizeY | Definir explicitamente | Altura dos módulos em blocos. |
debug | false | Desenha blocos e texto de diagnóstico no mundo de destino. Use apenas numa área de geração descartável. |
useGradientLevels | false | É 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. |
isWorldGeneration | false | true cria um mundo vazio dedicado; false coloca no mundo existente. |
treasureFile | — | Ficheiro de configuração do saque dos baús da masmorra. |
generateLootInBarrels | true | Define se os barris nos módulos recebem saque. |
barrelTreasureFilename | treasure_barrel_food.yml | Ficheiro de configuração do saque dos barris da masmorra. |
validWorlds | vazio, todos os mundos | Lista de nomes de mundos onde a masmorra pode ser gerada. |
validWorldEnvironments | vazio, todos os ambientes | Lista 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. |
centerModuleAltitude | 0 | Coordenada 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:
| Campo | Predefinição | Descrição |
|---|---|---|
isEnabled | true | Ativa ou desativa o módulo. |
weight | 100 | Peso 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. |
repetitionPenalty | 0 | É 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. |
noRepeat | false | Exclui 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. |
enforceVerticalRotation | false | Exige rotações iguais no eixo Y entre módulos sobrepostos quando qualquer um ativa a opção. |
enforceHorizontalRotation | false | Exige rotações iguais no eixo Y entre vizinhos horizontais quando qualquer um ativa a opção. |
minY | -4 | Camada mínima inclusiva da grelha de módulos para selecionar candidatos. |
maxY | 20 | Camada máxima inclusiva da grelha de módulos para selecionar candidatos. |
biome | default | É guardado, mas não restringe a seleção de módulos. |
minecraftBiome | null | É 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. |
generateLootInBarrels | true | Define se os barris deste módulo recebem saque. |
barrelTreasureFilename | treasure_barrel_food.yml | Ficheiro 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. |
isAutomaticallyPlaced | true | Permite 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,_2e assim sucessivamente, escolhendo o primeiro sufixo cuja pasta ainda não exista. É um mundo vazio com ambienteNORMAL, 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.