Dungeons geradas
Uma dungeon gerada não tem mundo modelo. Você constrói pequenas salas uma vez, descreve como elas se conectam, e um gerador monta um novo layout a cada run: de uma sala inicial, passando por salas normais, de tesouro e secretas, até a sala do chefe.
Dungeons fixas e geradas compartilham as mesmas runs, menus, baús, NPCs, mobs, eventos e facts. O que muda é de onde vêm as salas.
As peças
| Peça | Entry | O que é |
|---|---|---|
| Tipo de porta | Dungeon Connector Type | O tamanho da abertura de uma porta, o bloco que veda uma porta não usada e quais tipos podem ser unidos. |
| Sala | Dungeon Room Template | Uma estrutura salva (uma estrutura .nbt do Paper guardada como artifact) com sua categoria, portas e marcadores. |
| Pool | Dungeon Room Pool | Uma lista ponderada de modelos de sala. |
| Gerador | Dungeon Generator | As regras: quais pools, quantas salas, a que profundidade fica o chefe, com que frequência um caminho se ramifica. |
| Affix | Dungeon Affix | Um modificador da run sorteado ao acaso, como "mobs rápidos". |
| Dungeon | Dungeon Instance | O campo generator dela a transforma em uma dungeon gerada. |
Construa uma, passo a passo
- Tipos de porta. Adicione pelo menos um Dungeon Connector Type. Defina
widtheheight(3 por 3 por padrão), osealBlockque fecha uma porta não usada (minecraft:stone_brickspor padrão) e, se você tiver vários tipos,compatibleWith. Um tipo sempre pode ser unido a ele mesmo. - Salas. Para cada sala, adicione um Dungeon Room Template e use o editor no jogo para capturar seus blocos e colocar suas portas e marcadores. Escolha a
categorydela. - Pools. Adicione um Dungeon Room Pool para as salas iniciais, um para as salas de chefe, um (ou mais) para as outras salas e, opcionalmente, um para corredores. Um pool de início, de chefe ou de corredor contém apenas modelos dessa categoria. Um pool normal pode misturar modelos
NORMAL,TREASUREeSECRET. - Gerador. Adicione um Dungeon Generator e defina
startPool,bossPool, opcionalmentecorridorPool, enormalPoolscom um peso cada. - Dungeon. Na sua Dungeon Instance, defina
generator. DeixetemplateWorldvazio: uma dungeon gerada não tem mundo modelo. O isolamento deve serAUTOouWORLD_PER_RUN. - Lógica do jogo. Use os triggers
onEntereonCleardos modelos de sala, os marcadores TRIGGER, os eventos de sala, as entries Dungeon Mob Spawn nos marcadores MOB, e termine a run com Dungeon Complete.
Se os pools e modelos não conseguem formar uma dungeon, o lançamento é recusado e o log do servidor diz por quê (por exemplo, um pool sem nenhuma sala inicial, ou um modelo sem uma captura legível). O campo messages do gerador guarda os motivos reportados a você, o autor. O jogador vê apenas um texto curto tirado dos snippets content.dungeon_generated.refusal.setup (os pools e modelos não conseguem formar uma dungeon) e content.dungeon_generated.refusal.paste (as salas não puderam ser coladas), que você pode editar no painel web. Nada é cobrado nesses casos. A linha que anuncia os affixes de uma run é o snippet content.dungeon_generated.affix.announcement.
Categorias de sala
A category de um modelo de sala diz que papel ele pode ter.
| Categoria | Papel |
|---|---|
START | A run começa aqui. Uma por dungeon. Deve conter um marcador SPAWN. |
NORMAL | Uma sala comum. |
TREASURE | Sempre em um ramo, nunca no caminho até o chefe. |
CORRIDOR | Inserido entre duas salas que não podem se tocar diretamente. |
SECRET | Sempre um beco sem saída. |
BOSS | A última sala. Uma por dungeon. |
As salas são unidas porta a porta, então uma sala sem portas só pode ser um START sem saída. Uma porta com required ativado deve ser unida a outra sala: um modelo que não consegue preencher todas as suas portas obrigatórias nunca é usado. Uma porta pela qual ninguém passou é fechada com o sealBlock do seu tipo.
Marcadores
Um marcador é um ponto de interesse dentro de uma sala. Cada um tem um kind:
| Tipo | O que faz | Campo a preencher |
|---|---|---|
SPAWN | Onde os jogadores aparecem quando a run começa. Apenas o primeiro SPAWN da sala inicial é usado. | nenhum |
CHEST | Um baú de loot é colocado aqui. A posição e o yaw dele substituem a localização da entry. Um baú nomeado por um marcador é sempre colocado, mesmo que a entry dele esteja em manualMode. | chest: um Dungeon Loot Chest |
TRIGGER | Os triggers são disparados para o jogador que chega à sala. | triggers |
NPC | Um Dungeon NPC Instance fica aqui, exibido aos membros da run. | npc |
MOB | Um Dungeon Mob Spawn faz seus mobs aparecerem aqui, na primeira vez que um membro da run entra na sala. | mob |
O yaw de um marcador vira um baú (ele fica voltado de volta para o yaw) e um NPC (ele olha na direção dele). O marcador é vinculado à sua entry pela posição dele na lista markers.
Salas em jogo
Quando um jogador entra em uma sala de uma dungeon gerada, os triggers onEnter do modelo dela disparam, depois os triggers dos marcadores TRIGGER e os mobs dos marcadores MOB. Com enterOnce ativado (o padrão para modelos), eles disparam apenas na primeira vez que cada jogador entra na sala em uma run.
Os triggers onClear disparam uma vez por run quando uma action Dungeon Clear Room é executada enquanto o jogador está na sala. A plataforma nunca decide sozinha que uma sala foi limpa: você decide, por exemplo a partir do evento de morte de mob quando o último monstro morre.
Os triggers de uma sala leem estes valores do contexto (com um interaction_context_variable):
| Chave | Valor |
|---|---|
RUN_ID | Id da run. |
SEED | Seed da dungeon, em decimal. |
ROOM | Número da sala: 0 é a sala inicial, depois na ordem em que o gerador as posicionou. |
ROOM_TEMPLATE | Id da entry do modelo de sala. |
DIFFICULTY | O difficulty do gerador. |
POSITION | O bloco do marcador para um marcador TRIGGER, caso contrário a posição do jogador. |
Os triggers de um affix leem apenas RUN_ID, SEED e DIFFICULTY. Uma dungeon fixa não fornece nenhuma dessas chaves.
Seeds, affixes e dificuldade
A mesma seed sempre gera a mesma dungeon, então um layout pode ser repetido. Uma nova seed é sorteada a cada run. A seed é salva com a run, então um reload reconstrói a mesma dungeon em memória. Se ela não puder ser reconstruída, a run é fechada na inicialização em vez de ser adotada com salas que ninguém conhece.
Os affixes são sorteados depois do layout, a partir dos affixes do gerador pelo seu weight, affixCount deles sem repetição. O sorteio segue a seed, mas nunca altera o layout. Seus modifiers e triggers se aplicam a cada membro quando a run começa.
difficulty é apenas um número entregue aos seus triggers pelo contexto: ele não altera o layout por si só.
Ajustes do gerador que importam
| Campo | Padrão | Notas |
|---|---|---|
minRooms, maxRooms | 6, 10 | Total de salas incluindo início e chefe, excluindo corredores. Intervalo permitido: 2 a 256. |
minBossDepth | 3 | O chefe fica a pelo menos esta quantidade de passos do início. |
branchRatePercent | 40 | Chance, em porcentagem, de uma sala além do caminho principal abrir um ramo lateral. |
quotas | nenhum | Limites no número de salas NORMAL, TREASURE e SECRET. Uma categoria sem limite é ilimitada. |
trialBudget, replans | 20000, 5 | O quanto a busca tenta antes de falhar. O trial budget vezes (replans + 1) deve ficar dentro de 5 000 000. |
baseY | 64 | Altura do piso da sala inicial no mundo da run. |
roomsPerTick | 4 | Salas coladas por tick do servidor. Menor mantém os ticks curtos; maior é mais rápido. |
pasteTimeoutSeconds | 120 | Passado esse tempo, o lançamento é cancelado, o custo devolvido e o mundo descartado. |
naturalSpawning | desativado | Monstros e animais surgem sozinhos no mundo da run. Desativado por padrão. |
verticalMargin | 1.0 | Blocos adicionados acima do teto e abaixo do piso de cada sala ao decidir se um jogador está dentro. |
paster | STRUCTURE | Usa a API de estruturas do Paper: nenhum outro plugin é necessário. |
Um modelo de sala tem no máximo 256 blocos em cada lado, com no máximo 64 portas e 1024 marcadores.
O editor no jogo
Abra um Dungeon Room Template no painel web e clique no editor de conteúdo do campo artifactId. Você recebe um conjunto de ferramentas na sua hotbar:
| Ferramenta | Uso |
|---|---|
| Varinha de cantos | Clique esquerdo em um bloco para o canto A, clique direito em um bloco para o canto B. |
| Captura | Salva os blocos da caixa como a estrutura do modelo. |
| Ferramenta de porta | Clique direito em um bloco de uma parede para adicionar uma porta (o bloco é o centro inferior da abertura). Clique esquerdo para remover as portas ali. |
| Tipo de porta | Clique direito para o próximo tipo de conector, clique esquerdo para o anterior. |
| Alternar obrigatória | Alterna se as próximas portas são obrigatórias. |
| Ferramenta de marcador | Clique direito em um bloco para adicionar um marcador na frente dele. Clique esquerdo para remover os marcadores ali. |
| Tipo de marcador | Clique direito para o próximo tipo, clique esquerdo para o anterior. |
| Salvar | Grava as portas e os marcadores na entry. |
Uma boss bar mostra o tamanho da caixa, o número de portas e marcadores e se você tem trabalho não salvo. O tamanho da sala é lido da estrutura salva, nunca digitado. Você deve criar e publicar pelo menos um tipo de conector antes de poder adicionar uma porta.
As capturas ignoram entidades por padrão, porque uma entidade viva altera a sala a cada captura e volta como um mob solto em cada cópia. Esses comportamentos e todos os textos do editor são snippets do Typewriter em content.dungeon_room_template., então você pode alterá-los ou traduzi-los no painel web:
| Snippet | Padrão | Significado |
|---|---|---|
capture.include_entities | false | Se uma captura salva as entidades da caixa. |
capture.max_volume | 262144 | O máximo de blocos que uma captura lê. Ela é lida em um único tick do servidor: uma caixa muito grande segura esse tick. |
capture.timeout_seconds | 30 | Segundos de espera por uma captura antes de desistir. |
sound.confirm | entity.experience_orb.pickup | Som após uma captura ou um salvamento. Vazio: nenhum. |
Limites e boas práticas
- As dungeons geradas usam apenas
WORLD_PER_RUN: cada run cria um mundo e o apaga depois. - O editor das salas fixas (nós) tem seus próprios snippets em
content.dungeon_room.(mensagensnode.*,save.*,editor.*, ferramentastool.add,tool.remove,tool.save). - Construa as salas de modo que duas portas unidas do mesmo tipo se alinhem. Uma largura de abertura par tem o bloco extra no x ou z mais alto do modelo. O gerador desliza uma sala em um bloco quando uma abertura par exige.
- A dungeon inteira deve caber entre o bloco mais baixo e o mais alto do mundo, contando a partir de
baseY. - Não conte com um número fixo de salas: use marcadores e eventos em vez de números de sala.