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
| Campo | Tipo | Padrão | Notas |
|---|---|---|---|
isEnabled | bool | true | Níveis desativados são ignorados durante o carregamento |
levelName | string | null | Nome de exibição mostrado em mensagens, scoreboards e menus de NPC |
levelDescription | lista de strings | [] | Linhas mostradas em menus de NPC. Suporta os placeholders $highscoreWave e $highscorePlayer |
worldName | string | null | O nome da pasta template em plugins/EternalTD/worlds/ |
startLocation | lista de strings | null | Lista de localizações serializadas onde os mobs spawnam |
endLocation | lista de strings | null | Lista de localizações serializadas para as quais os mobs caminham (as casas "vermelhas") |
levelLocations | lista de strings | null | Toda casa de grade caminhável no nível, gerada automaticamente quando você registra uma seleção de piso |
wavesConfigFile | string | obrigatório | Nome do arquivo de config de onda vinculado (waves/<name>.yml) |
waveCount | int | -1 | Contagem de ondas em cache, atualmente informativa |
highscoreWave | int | 0 | Melhor onda alcançada neste nível |
highscorePlayerName | string | "no one" | Nome de exibição do jogador que estabeleceu o recorde |
environment | enum | NORMAL | Ambiente 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:
- O EternalTD procura a pasta template por
worldNameemplugins/EternalTD/worlds/. - 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. - O mundo clonado é carregado como um mundo temporário do tipo void através do
TemporaryWorldManagerdo MagmaCore, então a migração do Paper 26.1+ fica em quarentena. - O jogador é teletransportado para o novo mundo; um
InstanceProtectorinterno 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:
- Coloque uma pasta de mundo template em
plugins/EternalTD/worlds/<worldName>/. - Crie ou baixe um YAML de nível correspondente em
plugins/EternalTD/levels/. - Execute
/etd reloade entre no mundo do nível manualmente (ou abra-o em single-player para configurar). - Use
/etd selectfloore 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. - Execute
/etd showselection <level>para confirmar que a seleção parece correta. - Execute
/etd register <level>para limpar a seleção. Note que, no build atual, nemregisternemshowselectionde fato persistem a região de piso — o auxiliar que salvarialevelLocations(LevelsConfigFields#addLevelLocations) está definido mas nunca é invocado por um comando. Atualmente você precisa escreverlevelLocationsno YAML do nível à mão se ele ainda não estiver populado por um pacote baixado. - 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 emstartLocation). - Fique em pé em uma casa final e execute
/etd register <level> end. Repita para cada casa final (este comando de fato persiste emendLocation). - 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.
| Campo | Tipo | Padrão | Notas |
|---|---|---|---|
isEnabled | bool | true | NPCs desativados são ignorados |
levelIDs | lista de strings | obrigatório | Nomes de arquivo dos níveis que este NPC oferece |
location | string | null | Localização de spawn no formato padrão worldName,x,y,z,yaw,pitch |
name | string | "Default Name" | Nome de exibição do NPC |
difficulty | string | "Difficulty: Not Set" | Rótulo de dificuldade mostrado acima do NPC |
disguise | string | null | Descritor do LibsDisguises (ex.: custom:etd_tutorial_npc) |
customDisguiseData | string | null | Dados 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 paraetd_spawn,0,65,0,0,0. Usado somente quando o mundoetd_spawnexiste.manageSpawn— padrãotrue. 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.