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
| Campo | Tipo | Por defecto | Notas |
|---|---|---|---|
isEnabled | bool | true | Los niveles deshabilitados se omiten durante la carga |
levelName | string | null | Nombre para mostrar en mensajes, marcadores y menús de NPC |
levelDescription | lista de strings | [] | Líneas mostradas en los menús de NPC. Soporta los placeholders $highscoreWave y $highscorePlayer |
worldName | string | null | Nombre de la carpeta de plantilla bajo plugins/EternalTD/worlds/ |
startLocation | lista de strings | null | Lista de ubicaciones serializadas donde aparecen los mobs |
endLocation | lista de strings | null | Lista de ubicaciones serializadas a las que caminan los mobs (las casillas "rojas") |
levelLocations | lista de strings | null | Cada casilla transitable de la cuadrícula del nivel, generada automáticamente cuando registras una selección de piso |
wavesConfigFile | string | requerido | Nombre del archivo de configuración de oleadas vinculado (waves/<name>.yml) |
waveCount | int | -1 | Conteo de oleadas en caché, actualmente informativo |
highscoreWave | int | 0 | Mejor oleada alcanzada en este nivel |
highscorePlayerName | string | "no one" | Nombre para mostrar del jugador que estableció la puntuación |
environment | enum | NORMAL | Entorno 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:
- EternalTD busca la carpeta de plantilla por
worldNameenplugins/EternalTD/worlds/. - 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. - El mundo clonado se carga como un mundo void temporal a través del
TemporaryWorldManagerde MagmaCore, por lo que la migración de Paper 26.1+ queda en cuarentena. - El jugador es teletransportado al nuevo mundo; un
InstanceProtectorinterno 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:
- Coloca una carpeta de mundo plantilla bajo
plugins/EternalTD/worlds/<worldName>/. - Crea o descarga un YAML de nivel correspondiente en
plugins/EternalTD/levels/. - Ejecuta
/etd reloady únete al mundo del nivel manualmente (o ábrelo en un jugador para configurarlo). - Usa
/etd selectfloory 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. - Ejecuta
/etd showselection <level>para confirmar que la selección se ve correcta. - Ejecuta
/etd register <level>para limpiar la selección. Ten en cuenta que en la compilación actual niregisternishowselectionpersisten realmente la región de piso — el ayudante que guardaríalevelLocations(LevelsConfigFields#addLevelLocations) está definido pero nunca es invocado por un comando. Actualmente tienes que escribirlevelLocationsen el YAML del nivel a mano si aún no está poblado por un paquete descargado. - 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 enstartLocation). - Sitúate sobre una casilla de fin y ejecuta
/etd register <level> end. Repítelo para cada casilla de fin (este comando sí persiste enendLocation). - 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.
| Campo | Tipo | Por defecto | Notas |
|---|---|---|---|
isEnabled | bool | true | Los NPCs deshabilitados se omiten |
levelIDs | lista de strings | requerido | Nombres de archivo de los niveles que ofrece este NPC |
location | string | null | Ubicación de spawn en el formato estándar worldName,x,y,z,yaw,pitch |
name | string | "Default Name" | Nombre para mostrar del NPC |
difficulty | string | "Difficulty: Not Set" | Etiqueta de dificultad mostrada sobre el NPC |
disguise | string | null | Descriptor de LibsDisguises (p. ej. custom:etd_tutorial_npc) |
customDisguiseData | string | null | Datos 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 defectoetd_spawn,0,65,0,0,0. Solo se usa cuando existe el mundoetd_spawn.manageSpawn— por defectotrue. 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.