Aller au contenu principal

Niveaux et cartes d'EternalTD

Un « niveau » dans EternalTD est une configuration YAML dans plugins/EternalTD/levels/ associée à un dossier de monde modèle dans plugins/EternalTD/worlds/. Lorsqu'un joueur rejoint, EternalTD clone le monde modèle dans le conteneur de mondes du serveur et exécute la session dans cette copie clonée.

Champs de configuration de niveau

ChampTypeDéfautNotes
isEnabledbooltrueLes niveaux désactivés sont ignorés lors du chargement
levelNamestringnullNom d'affichage présenté dans les messages, les tableaux de score et les menus NPC
levelDescriptionliste de chaînes[]Lignes affichées dans les menus NPC. Prend en charge les variables $highscoreWave et $highscorePlayer
worldNamestringnullNom du dossier modèle sous plugins/EternalTD/worlds/
startLocationliste de chaînesnullListe des emplacements sérialisés où les créatures apparaissent
endLocationliste de chaînesnullListe des emplacements sérialisés vers lesquels les créatures se dirigent (les tuiles « rouges »)
levelLocationsliste de chaînesnullChaque case de grille praticable dans le niveau, générée automatiquement lorsque vous enregistrez une sélection de sol
wavesConfigFilestringrequisNom de fichier de la configuration de vagues liée (waves/<name>.yml)
waveCountint-1Décompte de vagues mis en cache, actuellement informatif
highscoreWaveint0Meilleure vague atteinte sur ce niveau
highscorePlayerNamestring"no one"Nom d'affichage du joueur qui a établi le score
environmentenumNORMALEnvironnement de monde utilisé lors du chargement du monde cloné

La taille de grille utilisée partout est de 3 blocs par case logique (constante GRID_SIZE dans le code).

Format de chaîne d'emplacement

Les emplacements dans EternalTD sont sérialisés sous forme de chaînes séparées par des virgules de la forme :

worldName,x,y,z,yaw,pitch

Vous n'avez normalement pas à les écrire à la main — /etd selectfloor combiné aux commandes d'enregistrement les calcule et les enregistre pour vous.

Cycle de vie du monde

Lorsqu'un joueur rejoint un niveau :

  1. EternalTD recherche le dossier modèle par worldName dans plugins/EternalTD/worlds/.
  2. Il choisit le prochain suffixe numérique libre (<worldName>_0, <worldName>_1, ...) et écrit le clone dans le conteneur de mondes du serveur, en nettoyant au préalable toute copie obsolète au format ancien ou moderne.
  3. Le monde cloné est chargé en tant que monde vide temporaire via le TemporaryWorldManager de MagmaCore, afin que la migration Paper 26.1+ soit mise en quarantaine.
  4. Le joueur est téléporté dans le nouveau monde ; un InstanceProtector interne applique les règles de protection d'EternalTD.

Lorsque la session se termine :

  • Tous les joueurs restants dans le monde cloné sont téléportés vers l'emplacement de spawn défini dans config.yml, ou expulsés si aucun spawn n'est configuré.
  • Le monde cloné est déchargé et supprimé du disque (TemporaryWorldManager.permanentlyDeleteWorld).

Règles de protection d'instance

Pendant qu'un niveau est actif, les règles suivantes sont appliquées au monde cloné :

  • Explosions désactivées
  • Écoulement des liquides désactivé
  • Élytres désactivées
  • Activation du vol empêchée
  • Tir ami empêché
  • Apparition vanille des créatures empêchée

Flux de création de carte

Le flux actuel de création de carte utilise l'outillage en jeu :

  1. Placez un dossier de monde modèle sous plugins/EternalTD/worlds/<worldName>/.
  2. Créez ou téléchargez un YAML de niveau correspondant dans plugins/EternalTD/levels/.
  3. Exécutez /etd reload et rejoignez manuellement le monde du niveau (ou ouvrez-le en solo pour le configurer).
  4. Utilisez /etd selectfloor et cliquez-droit/cliquez-gauche sur deux coins pour marquer la zone de jeu, ou utilisez /etd selectfloorcoordinates <x1> <y1> <z1> <x2> <y2> <z2> pour les fournir directement.
  5. Exécutez /etd showselection <level> pour confirmer que la sélection est correcte.
  6. Exécutez /etd register <level> pour effacer la sélection. Notez que dans la version actuelle, ni register ni showselection ne persistent réellement la région de sol — l'utilitaire qui sauvegarderait levelLocations (LevelsConfigFields#addLevelLocations) est défini mais n'est jamais invoqué par une commande. Vous devez actuellement écrire levelLocations dans le YAML de niveau à la main s'il n'est pas déjà rempli par un paquet téléchargé.
  7. Placez-vous sur une tuile de spawn de départ et exécutez /etd register <level> start. Répétez pour chaque tuile de départ (cette commande persiste bien dans startLocation).
  8. Placez-vous sur une tuile d'arrivée et exécutez /etd register <level> end. Répétez pour chaque tuile d'arrivée (cette commande persiste bien dans endLocation).
  9. Rechargez à nouveau et testez le niveau en le rejoignant via le menu NPC ou /etd join <level>.

Les commandes de sélection génèrent les cases de grille selon :

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

Les cases dont le bloc supérieur est de l'air (ou dont le bloc de sol est traversable) sont ignorées, donc les blocs de sol doivent être solides pour qu'une case soit enregistrée comme jouable.

Validation du chemin

EternalTD lance une vérification de pathfinding A* à chaque placement d'une tour. Si placer la tour laisserait une tuile de départ sans chemin praticable vers une tuile d'arrivée, le placement est refusé et l'or n'est pas dépensé.

Les ennemis aériens utilisent un chemin séparé qui ignore entièrement les tours et suit à la place le décalage aérien (4 blocs au-dessus du chemin configuré).

NPC et menus de niveau

Les configurations de NPC dans plugins/EternalTD/npcs/ lient des NPC villageois à un ou plusieurs niveaux. Un clic droit sur le NPC ouvre un inventaire de 9 emplacements listant chaque niveau sous forme d'un panneau de verre teinté vert étiqueté avec le nom et la description du niveau.

ChampTypeDéfautNotes
isEnabledbooltrueLes NPC désactivés sont ignorés
levelIDsliste de chaînesrequisNoms de fichiers des niveaux que ce NPC propose
locationstringnullEmplacement d'apparition au format standard worldName,x,y,z,yaw,pitch
namestring"Default Name"Nom d'affichage du NPC
difficultystring"Difficulty: Not Set"Étiquette de difficulté affichée au-dessus du NPC
disguisestringnullDescripteur LibsDisguises (par exemple custom:etd_tutorial_npc)
customDisguiseDatastringnullDonnées de commande LibsDisguises supplémentaires — généralement la longue chaîne de skin de joueur

Le villageois apparaît invulnérable, avec l'IA désactivée, persistant, et marqué avec la clé d'espace de noms NPC d'EternalTD. Si LibsDisguises est installé et que disguise et customDisguiseData sont tous deux définis, le villageois est déguisé à l'apparition.

Un armor stand flottant portant l'étiquette de difficulty apparaît 2,3 blocs au-dessus du NPC.

Comportement de spawn

DefaultConfig contrôle la façon dont les joueurs sont gérés dans le monde hub :

  • setupDone — indicateur suivant si les conseils de configuration initiale ont été complétés.
  • spawnLocations — par défaut etd_spawn,0,65,0,0,0. Utilisé uniquement lorsque le monde etd_spawn existe.
  • manageSpawn — par défaut true. Lorsqu'activé, les joueurs qui rejoignent sont téléportés à l'emplacement de spawn 1 tick après la connexion.
  • playerGuide — le texte du livre guide en jeu.

Lorsque manageSpawn est true et que le monde de spawn est chargé, chaque joueur qui rejoint le serveur est téléporté vers spawnLocations.