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
| Champ | Type | Défaut | Notes |
|---|---|---|---|
isEnabled | bool | true | Les niveaux désactivés sont ignorés lors du chargement |
levelName | string | null | Nom d'affichage présenté dans les messages, les tableaux de score et les menus NPC |
levelDescription | liste de chaînes | [] | Lignes affichées dans les menus NPC. Prend en charge les variables $highscoreWave et $highscorePlayer |
worldName | string | null | Nom du dossier modèle sous plugins/EternalTD/worlds/ |
startLocation | liste de chaînes | null | Liste des emplacements sérialisés où les créatures apparaissent |
endLocation | liste de chaînes | null | Liste des emplacements sérialisés vers lesquels les créatures se dirigent (les tuiles « rouges ») |
levelLocations | liste de chaînes | null | Chaque case de grille praticable dans le niveau, générée automatiquement lorsque vous enregistrez une sélection de sol |
wavesConfigFile | string | requis | Nom de fichier de la configuration de vagues liée (waves/<name>.yml) |
waveCount | int | -1 | Décompte de vagues mis en cache, actuellement informatif |
highscoreWave | int | 0 | Meilleure vague atteinte sur ce niveau |
highscorePlayerName | string | "no one" | Nom d'affichage du joueur qui a établi le score |
environment | enum | NORMAL | Environnement 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 :
- EternalTD recherche le dossier modèle par
worldNamedansplugins/EternalTD/worlds/. - 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. - Le monde cloné est chargé en tant que monde vide temporaire via le
TemporaryWorldManagerde MagmaCore, afin que la migration Paper 26.1+ soit mise en quarantaine. - Le joueur est téléporté dans le nouveau monde ; un
InstanceProtectorinterne 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 :
- Placez un dossier de monde modèle sous
plugins/EternalTD/worlds/<worldName>/. - Créez ou téléchargez un YAML de niveau correspondant dans
plugins/EternalTD/levels/. - Exécutez
/etd reloadet rejoignez manuellement le monde du niveau (ou ouvrez-le en solo pour le configurer). - Utilisez
/etd selectflooret 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. - Exécutez
/etd showselection <level>pour confirmer que la sélection est correcte. - Exécutez
/etd register <level>pour effacer la sélection. Notez que dans la version actuelle, niregisternishowselectionne persistent réellement la région de sol — l'utilitaire qui sauvegarderaitlevelLocations(LevelsConfigFields#addLevelLocations) est défini mais n'est jamais invoqué par une commande. Vous devez actuellement écrirelevelLocationsdans le YAML de niveau à la main s'il n'est pas déjà rempli par un paquet téléchargé. - 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 dansstartLocation). - 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 dansendLocation). - 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.
| Champ | Type | Défaut | Notes |
|---|---|---|---|
isEnabled | bool | true | Les NPC désactivés sont ignorés |
levelIDs | liste de chaînes | requis | Noms de fichiers des niveaux que ce NPC propose |
location | string | null | Emplacement d'apparition au format standard worldName,x,y,z,yaw,pitch |
name | string | "Default Name" | Nom d'affichage du NPC |
difficulty | string | "Difficulty: Not Set" | Étiquette de difficulté affichée au-dessus du NPC |
disguise | string | null | Descripteur LibsDisguises (par exemple custom:etd_tutorial_npc) |
customDisguiseData | string | null | Donné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éfautetd_spawn,0,65,0,0,0. Utilisé uniquement lorsque le mondeetd_spawnexiste.manageSpawn— par défauttrue. 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.