Pular para o conteúdo principal

Níveis e Mapas do EternalTD

Um "nível" no EternalTD é um config YAML em plugins/EternalTD/levels/ emparelhado com uma pasta de mundo template em plugins/EternalTD/worlds/. Quando um jogador entra, o EternalTD clona o mundo template para o contêiner de mundos do servidor e executa a sessão nessa cópia clonada.

Campos do Config do Nível

CampoTipoPadrãoNotas
isEnabledbooltrueNíveis desativados são ignorados durante o carregamento
levelNamestringnullNome de exibição mostrado em mensagens, scoreboards e menus de NPC
levelDescriptionlista de strings[]Linhas mostradas em menus de NPC. Suporta os placeholders $highscoreWave e $highscorePlayer
worldNamestringnullO nome da pasta template em plugins/EternalTD/worlds/
startLocationlista de stringsnullLista de localizações serializadas onde os mobs spawnam
endLocationlista de stringsnullLista de localizações serializadas para as quais os mobs caminham (as casas "vermelhas")
levelLocationslista de stringsnullToda casa de grade caminhável no nível, gerada automaticamente quando você registra uma seleção de piso
wavesConfigFilestringobrigatórioNome do arquivo de config de onda vinculado (waves/<name>.yml)
waveCountint-1Contagem de ondas em cache, atualmente informativa
highscoreWaveint0Melhor onda alcançada neste nível
highscorePlayerNamestring"no one"Nome de exibição do jogador que estabeleceu o recorde
environmentenumNORMALAmbiente de mundo usado quando o mundo clonado é carregado

O tamanho de grade usado em todo lugar é 3 blocos por casa lógica (constante GRID_SIZE no código).

Formato de String de Localização

As localizações no EternalTD são serializadas como strings separadas por vírgulas no formato:

worldName,x,y,z,yaw,pitch

Normalmente você não as escreve à mão — /etd selectfloor mais os comandos de registro computam e salvam tudo para você.

Ciclo de Vida do Mundo

Quando um jogador entra em um nível:

  1. O EternalTD procura a pasta template por worldName em plugins/EternalTD/worlds/.
  2. Ele escolhe o próximo sufixo numérico livre (<worldName>_0, <worldName>_1, ...) e grava o clone no contêiner de mundos do servidor, limpando quaisquer cópias antigas de layout legado ou moderno primeiro.
  3. O mundo clonado é carregado como um mundo temporário do tipo void através do TemporaryWorldManager do MagmaCore, então a migração do Paper 26.1+ fica em quarentena.
  4. O jogador é teletransportado para o novo mundo; um InstanceProtector interno aplica as regras de proteção do EternalTD.

Quando a sessão termina:

  • Quaisquer jogadores restantes no mundo clonado são teletransportados de volta para a localização de spawn do config.yml, ou expulsos se nenhum spawn estiver configurado.
  • O mundo clonado é descarregado e deletado do disco (TemporaryWorldManager.permanentlyDeleteWorld).

Regras de Proteção da Instância

Enquanto um nível está ativo, o mundo clonado tem estas regras aplicadas:

  • Explosões desabilitadas
  • Fluxo de líquidos desabilitado
  • Elytra desabilitado
  • Alternância de voo bloqueada
  • Fogo amigo bloqueado
  • Spawn de mobs do vanilla bloqueado

Fluxo de Autoria de Mapa

O fluxo atual de autoria de mapas usa as ferramentas dentro do jogo:

  1. Coloque uma pasta de mundo template em plugins/EternalTD/worlds/<worldName>/.
  2. Crie ou baixe um YAML de nível correspondente em plugins/EternalTD/levels/.
  3. Execute /etd reload e entre no mundo do nível manualmente (ou abra-o em single-player para configurar).
  4. Use /etd selectfloor e clique com os botões direito/esquerdo em dois cantos para marcar a área jogável, ou use /etd selectfloorcoordinates <x1> <y1> <z1> <x2> <y2> <z2> para fornecê-los diretamente.
  5. Execute /etd showselection <level> para confirmar que a seleção parece correta.
  6. Execute /etd register <level> para limpar a seleção. Note que, no build atual, nem register nem showselection de fato persistem a região de piso — o auxiliar que salvaria levelLocations (LevelsConfigFields#addLevelLocations) está definido mas nunca é invocado por um comando. Atualmente você precisa escrever levelLocations no YAML do nível à mão se ele ainda não estiver populado por um pacote baixado.
  7. Fique em pé em uma casa de spawn inicial e execute /etd register <level> start. Repita para cada casa inicial (este comando de fato persiste em startLocation).
  8. Fique em pé em uma casa final e execute /etd register <level> end. Repita para cada casa final (este comando de fato persiste em endLocation).
  9. Recarregue novamente e teste o nível entrando nele pelo menu do NPC ou por /etd join <level>.

Os comandos de seleção geram casas de grade usando:

size = abs(corner1 - corner2 + 1) / 3

Casas cujo bloco superior é ar (ou cujo bloco de piso é passável) são puladas, então blocos de piso precisam ser sólidos para uma casa se registrar como jogável.

Validação de Caminho

O EternalTD executa uma verificação de pathfinding A* sempre que uma torre é colocada. Se colocar a torre deixaria qualquer casa inicial sem um caminho caminhável até qualquer casa final, a colocação é rejeitada e o ouro não é gasto.

Inimigos aéreos usam um caminho separado que ignora completamente as torres e em vez disso segue o offset aéreo (4 blocos acima do caminho configurado).

NPCs e Menus de Nível

Configs de NPC em plugins/EternalTD/npcs/ vinculam NPCs aldeões a um ou mais níveis. Clicar com o botão direito no NPC abre um inventário de 9 slots listando cada nível como um vidro tingido verde rotulado com o nome e a descrição do nível.

CampoTipoPadrãoNotas
isEnabledbooltrueNPCs desativados são ignorados
levelIDslista de stringsobrigatórioNomes de arquivo dos níveis que este NPC oferece
locationstringnullLocalização de spawn no formato padrão worldName,x,y,z,yaw,pitch
namestring"Default Name"Nome de exibição do NPC
difficultystring"Difficulty: Not Set"Rótulo de dificuldade mostrado acima do NPC
disguisestringnullDescritor do LibsDisguises (ex.: custom:etd_tutorial_npc)
customDisguiseDatastringnullDados extras de comando do LibsDisguises — geralmente a string longa de skin de jogador

O aldeão é spawnado invulnerável, com IA desabilitada, persistente e marcado com a chave de namespace de NPC do EternalTD. Se o LibsDisguises estiver instalado e tanto disguise quanto customDisguiseData estiverem definidos, o aldeão é disfarçado no spawn.

Um armor stand flutuante com o rótulo difficulty é spawnado 2,3 blocos acima do NPC.

Comportamento de Spawn

O DefaultConfig controla como os jogadores são gerenciados no mundo do hub:

  • setupDone — flag que rastreia se a orientação de configuração de primeira vez foi concluída.
  • spawnLocations — padrão para etd_spawn,0,65,0,0,0. Usado somente quando o mundo etd_spawn existe.
  • manageSpawn — padrão true. Quando habilitado, jogadores que entram são teletransportados para a localização de spawn 1 tick após o login.
  • playerGuide — o texto do livro guia dentro do jogo.

Quando manageSpawn é true e o mundo de spawn está carregado, todo jogador que entra no servidor é teletransportado para spawnLocations.