Saltar al contenido principal

Niveles y mapas de EternalTD

Un "nivel" en EternalTD es una configuración YAML en plugins/EternalTD/levels/ emparejada con una carpeta de mundo plantilla en plugins/EternalTD/worlds/. Cuando un jugador se une, EternalTD clona el mundo plantilla en el contenedor de mundos del servidor y ejecuta la sesión en esa copia clonada.

Campos de configuración del nivel

CampoTipoPor defectoNotas
isEnabledbooltrueLos niveles deshabilitados se omiten durante la carga
levelNamestringnullNombre para mostrar en mensajes, marcadores y menús de NPC
levelDescriptionlista de strings[]Líneas mostradas en los menús de NPC. Soporta los placeholders $highscoreWave y $highscorePlayer
worldNamestringnullNombre de la carpeta de plantilla bajo plugins/EternalTD/worlds/
startLocationlista de stringsnullLista de ubicaciones serializadas donde aparecen los mobs
endLocationlista de stringsnullLista de ubicaciones serializadas a las que caminan los mobs (las casillas "rojas")
levelLocationslista de stringsnullCada casilla transitable de la cuadrícula del nivel, generada automáticamente cuando registras una selección de piso
wavesConfigFilestringrequeridoNombre del archivo de configuración de oleadas vinculado (waves/<name>.yml)
waveCountint-1Conteo de oleadas en caché, actualmente informativo
highscoreWaveint0Mejor oleada alcanzada en este nivel
highscorePlayerNamestring"no one"Nombre para mostrar del jugador que estableció la puntuación
environmentenumNORMALEntorno del mundo usado cuando se carga el mundo clonado

El tamaño de cuadrícula utilizado en todo momento es de 3 bloques por casilla lógica (constante GRID_SIZE en el código).

Formato de cadena de ubicación

Las ubicaciones en EternalTD se serializan como cadenas separadas por comas con el formato:

worldName,x,y,z,yaw,pitch

Normalmente no las escribes a mano — /etd selectfloor junto con los comandos register calculan y guardan estas ubicaciones por ti.

Ciclo de vida del mundo

Cuando un jugador se une a un nivel:

  1. EternalTD busca la carpeta de plantilla por worldName en plugins/EternalTD/worlds/.
  2. Elige el siguiente sufijo numérico libre (<worldName>_0, <worldName>_1, ...) y escribe el clon en el contenedor de mundos del servidor, limpiando antes cualquier copia obsoleta de diseño legado o moderno.
  3. El mundo clonado se carga como un mundo void temporal a través del TemporaryWorldManager de MagmaCore, por lo que la migración de Paper 26.1+ queda en cuarentena.
  4. El jugador es teletransportado al nuevo mundo; un InstanceProtector interno aplica las reglas de protección de EternalTD.

Cuando la sesión termina:

  • Cualquier jugador restante en el mundo clonado es teletransportado de vuelta a la ubicación de spawn de config.yml, o expulsado si no hay spawn configurado.
  • El mundo clonado se descarga y se elimina del disco (TemporaryWorldManager.permanentlyDeleteWorld).

Reglas de protección de instancia

Mientras un nivel está activo, el mundo clonado tiene estas reglas aplicadas:

  • Explosiones deshabilitadas
  • Flujo de líquidos deshabilitado
  • Elytra deshabilitado
  • Alternar vuelo prevenido
  • Fuego amigo prevenido
  • Aparición de mobs vanilla prevenida

Flujo de creación de mapas

El flujo actual de creación de mapas usa las herramientas dentro del juego:

  1. Coloca una carpeta de mundo plantilla bajo plugins/EternalTD/worlds/<worldName>/.
  2. Crea o descarga un YAML de nivel correspondiente en plugins/EternalTD/levels/.
  3. Ejecuta /etd reload y únete al mundo del nivel manualmente (o ábrelo en un jugador para configurarlo).
  4. Usa /etd selectfloor y haz clic derecho/izquierdo en dos esquinas para marcar el área de juego, o usa /etd selectfloorcoordinates <x1> <y1> <z1> <x2> <y2> <z2> para proporcionarlas directamente.
  5. Ejecuta /etd showselection <level> para confirmar que la selección se ve correcta.
  6. Ejecuta /etd register <level> para limpiar la selección. Ten en cuenta que en la compilación actual ni register ni showselection persisten realmente la región de piso — el ayudante que guardaría levelLocations (LevelsConfigFields#addLevelLocations) está definido pero nunca es invocado por un comando. Actualmente tienes que escribir levelLocations en el YAML del nivel a mano si aún no está poblado por un paquete descargado.
  7. Sitúate sobre una casilla de spawn de inicio y ejecuta /etd register <level> start. Repítelo para cada casilla de inicio (este comando sí persiste en startLocation).
  8. Sitúate sobre una casilla de fin y ejecuta /etd register <level> end. Repítelo para cada casilla de fin (este comando sí persiste en endLocation).
  9. Recarga de nuevo y prueba el nivel uniéndote a él a través del menú de NPC o /etd join <level>.

Los comandos de selección generan casillas de cuadrícula usando:

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

Las casillas cuyo bloque superior es aire (o cuyo bloque de suelo es atravesable) se omiten, por lo que los bloques de suelo deben ser sólidos para que una casilla se registre como jugable.

Validación de camino

EternalTD ejecuta una comprobación de pathfinding A* cada vez que se coloca una torre. Si colocar la torre dejaría cualquier casilla de inicio sin un camino transitable hasta cualquier casilla de fin, la colocación es rechazada y el oro no se gasta.

Los enemigos aéreos usan un camino separado que ignora las torres por completo y en su lugar siguen el desplazamiento aéreo (4 bloques por encima del camino configurado).

NPCs y menús de nivel

Las configuraciones de NPC en plugins/EternalTD/npcs/ vinculan NPCs aldeanos a uno o más niveles. Hacer clic derecho en el NPC abre un inventario de 9 slots que lista cada nivel como un panel de cristal teñido verde etiquetado con el nombre y la descripción del nivel.

CampoTipoPor defectoNotas
isEnabledbooltrueLos NPCs deshabilitados se omiten
levelIDslista de stringsrequeridoNombres de archivo de los niveles que ofrece este NPC
locationstringnullUbicación de spawn en el formato estándar worldName,x,y,z,yaw,pitch
namestring"Default Name"Nombre para mostrar del NPC
difficultystring"Difficulty: Not Set"Etiqueta de dificultad mostrada sobre el NPC
disguisestringnullDescriptor de LibsDisguises (p. ej. custom:etd_tutorial_npc)
customDisguiseDatastringnullDatos adicionales del comando de LibsDisguises — normalmente la cadena larga de skin de jugador

El aldeano se genera invulnerable, con IA deshabilitada, persistente y etiquetado con la NamespacedKey de NPC de EternalTD. Si LibsDisguises está instalado y tanto disguise como customDisguiseData están establecidos, el aldeano se disfraza al aparecer.

Un armor stand flotante con la etiqueta difficulty se genera 2.3 bloques por encima del NPC.

Comportamiento del spawn

DefaultConfig controla cómo se gestiona a los jugadores en el mundo del hub:

  • setupDone — flag que rastrea si la guía de configuración inicial se ha completado.
  • spawnLocations — por defecto etd_spawn,0,65,0,0,0. Solo se usa cuando existe el mundo etd_spawn.
  • manageSpawn — por defecto true. Cuando está activado, los jugadores que se unen son teletransportados a la ubicación de spawn 1 tick después de iniciar sesión.
  • playerGuide — el texto del libro guía dentro del juego.

Cuando manageSpawn es true y el mundo de spawn está cargado, cada jugador que se une al servidor es teletransportado a spawnLocations.