Que sont les donjons modulaires ?
Les donjons modulaires sont un système de donjons introduit dans BetterStructures 2.0.0 et versions ultérieures. Au lieu d'apparaître comme un seul schematic fixe, les donjons modulaires sont assemblés dynamiquement à partir de petits modules façonnés à la main. Les modules peuvent former des donjons à plusieurs étages dont l'agencement change à chaque génération.
Comment les donjons modulaires sont-ils générés ?
-
Modules Chaque module est construit selon une taille configurable, souvent 16x16x16 blocs ; certains packs utilisent 32x16x32 ou d'autres dimensions. Les modules possèdent des points de connexion standardisés grâce à un système de balises de bordure, pour s'assembler sans espaces ni chevauchements. Les dimensions d'un donjon sont définies par
moduleSizeXZetmoduleSizeYdans la configuration du générateur de modules. Les modules peuvent contenir des couloirs, des salles, des escaliers ou des espaces d'affrontement spéciaux. -
Processus de génération Lorsqu'un donjon modulaire se génère dans un nouveau chunk, BetterStructures utilise un algorithme Wave Function Collapse (WFC) pour assembler procéduralement les modules à partir du pool disponible. Le système sélectionne aléatoirement des modules compatibles en se basant sur la correspondance des balises de bordure et les « coud » ensemble pour former un donjon complet. La durée dépend du rayon, de la plage verticale, des modules disponibles, des contraintes et des performances du serveur. Le calcul de l'agencement est asynchrone ; le collage en file d'attente partage le budget de temps configuré par tick du serveur. Les agencements vastes ou incompatibles peuvent rester coûteux ou échouer à s'assembler.
-
Taille du donjon Les donjons peuvent être configurés pour se générer à différentes tailles à l'aide du paramètre de rayon. Des valeurs de rayon plus grandes créent des donjons nettement plus grands, pouvant s'étendre sur des centaines de blocs. La plupart des donjons comprennent plusieurs étages, reliés par des modules d'escalier ou des puits verticaux. Les connexions verticales entre les étages sont réalisées via les entrées
up/downde la carte de balises de bordurebordersd'un module : la face supérieure d'un module se connecte à un voisin situé au-dessus lorsque leurs balises de bordure opposées correspondent.
Variété et intégration des packs
Le catalogue comprend Dungeoneering Modules Free et Dungeoneering Modules Premium. Le générateur de dungeoneering fourni répertorie des schematics de départ des deux packs. Le catalogue comprend aussi Tommyknockers Modules Free et Tommyknockers Modules Premium, une mine modulaire gardée par des boss EliteMobs ; le pack Premium nécessite le pack Free. Installez les modules et les dépendances indiqués par le pack, notamment le contenu FreeMinecraftModels requis. Ajouter des modules compatibles élargit les agencements possibles ; installer un schematic seul n'installe pas ses modèles ou créatures complémentaires.
Marqueurs d'entités et de conteneurs
La génération des modules lit le texte avant des panneaux et ignore les lignes vides. Écrivez le marqueur en minuscules sur la première ligne et ses arguments juste en dessous. La reconnaissance distingue majuscules et minuscules, sauf pour [elitemobs]. Le collage modulaire supprime tous les blocs de panneau, y compris les panneaux décoratifs et les marqueurs non pris en charge.
| Balise de panneau | Lignes supplémentaires | Comportement |
|---|---|---|
[spawn] | Type d'entité Bukkit sur la ligne 2 | Fait apparaître une entité vanilla persistante, centrée sur le bloc du panneau. Les mondes modulaires dédiés enregistrent également cet emplacement comme marqueur d'apparition pour les intégrations. |
[chest] | Aucune | Place un coffre et le remplit avec le treasureFile du générateur de modules. |
[trapped_chest] | Aucune | Place un coffre piégé et le remplit avec le treasureFile du générateur de modules. |
[pool: poolname] | Aucune | Choisit un boss dans un pool d'apparition EliteMobs et le fait apparaître centré sur le bloc du panneau. Dans un terrain existant, le boss est un boss régional EliteMobs à usage unique. Pour un monde modulaire dédié, consultez la section sur les pools d'apparition pour savoir comment les boss ordinaires et instanciés sont gérés. |
[elitemobs] | Nom de fichier du boss EliteMobs sur les lignes suivantes, assemblées sans séparateur | Uniquement dans les modules collés dans un terrain existant (isWorldGeneration: false) : fait apparaître un boss régional EliteMobs à usage unique, centré sur le bloc du panneau. Les mondes modulaires dédiés l'ignorent. |
[barrel] | Aucune | Dans un monde modulaire dédié, enregistre un emplacement de tonneau qu'une intégration peut matérialiser avec spawnBarrels(). Ce marqueur ne place ni ne remplit lui-même de tonneau. |
[exit] | Noms des composants haut et bas sur les lignes 2 et 3, sans .schem | Enregistre des sorties dans un monde modulaire dédié. Une intégration doit placer les composants de components/. Si l'une des lignes d'arguments manque, les deux noms deviennent genericelevator_up et genericelevator_down. |
Les marqueurs [barrel] et [exit] ne sont traités qu'avec isWorldGeneration: true. Utilisez isWorldGeneration: false pour coller des donjons dans un terrain existant ; [spawn], [chest], [trapped_chest], [pool: poolname] et [elitemobs] y fonctionnent. Dans un terrain existant, les panneaux de boss nécessitent qu'EliteMobs soit activé ; sans lui, BetterStructures consigne un avertissement par donjon et ne fait apparaître aucun boss. Les modules ne créent pas de protection d'arène WorldGuard. Pour des tonneaux de butin ordinaires, placez de vrais blocs de tonneau dans le module et configurez leur butin comme indiqué plus bas.
Pools d'apparition
Les panneaux [pool: poolname] lisent les fichiers de configuration de pools d'apparition dans le dossier spawn_pools/. Chaque fichier de pool d'apparition est une petite configuration YAML comportant ces champs :
| Champ | Par défaut | Description |
|---|---|---|
isEnabled | — | Non lu. Les pools d'apparition n'ont pas d'interrupteur d'activation. |
poolStrings | [] | Liste des noms de fichiers de boss EliteMobs éligibles pour ce pool |
minLevel | -1 | Enregistré mais non lu. |
maxLevel | -1 | Niveau attribué aux boss instanciés issus de ce pool. Définissez explicitement un niveau valide. |
Le gestionnaire nécessite EliteMobs et choisit aléatoirement un fichier de boss dans poolStrings. Il ajoute le spawnPoolSuffix du générateur avant .yml : le suffixe _hard sélectionne poolname_hard.yml. Un générateur sans spawnPoolSuffix cherche poolname.yml. Évitez les espaces à la fin du nom du pool. Un fichier de pool manquant, une liste poolStrings vide ou un nom de fichier de boss inconnu d'EliteMobs consigne un avertissement et ne fait rien apparaître pour ce panneau.
Dans un monde modulaire dédié, les boss non instanciés apparaissent pendant le collage. Les boss instanciés restent en attente jusqu'à ce qu'une intégration appelle spawnInstancedEntities(). Chacun apparaît au maxLevel du pool, avec un identifiant de difficulté d'instance EliteMobs choisi selon sa distance au point de départ du donjon. Cette distance est le plus grand des décalages en X et en Z, rapporté à la largeur du donjon, (2 × radius − 1) × moduleSizeXZ : moins d'un sixième de cette largeur donne 2, moins d'un tiers donne 1, et au-delà on obtient 0. useGradientLevels n'a aucun effet sur ce calcul.
Intégrations de modèles et de créatures
Le collage modulaire et celui des structures ordinaires utilisent des gestionnaires de panneaux différents. Le collage modulaire ne traite les panneaux [elitemobs] que dans un terrain existant, comme indiqué ci-dessus. Les panneaux de structure [mythicmobs] et [custom] décrits dans Créer des structures ne sont pas traités par le collage modulaire. Utilisez les marqueurs de modules présentés ci-dessus et respectez les dépendances indiquées par le pack de contenu.
Un schematic ne recrée pas à lui seul les entités de modèles gérées par n'importe quel plugin. Installez les modèles et les plugins complémentaires exigés par votre pack ; un boss manquant ne devient pas automatiquement un modèle décoratif.
Dimensions des modules
Important : la taille des modules est configurable, pas fixe.
Chaque générateur de modules définit sa taille de module standard à l'aide de :
moduleSizeXZ: largeur et profondeur en blocs, à définir explicitement selon le schematicmoduleSizeY: hauteur en blocs, à définir explicitement selon le schematic
Taille courante : 16×16×16 blocs, à configurer explicitement Alternative courante : 32×16×32 blocs (utilisée dans certains packs de contenu)
Pour les créateurs de modules :
- Vérifiez la valeur de
moduleSizeXZetmoduleSizeYdans la configuration de votre générateur - Construisez TOUS les modules de ce générateur en respectant exactement ces dimensions
- Vérifiez les dimensions réelles du schematic et ses points de connexion ; le générateur ne valide pas leur géométrie à votre place
Définir des dimensions personnalisées : Dans votre fichier de configuration du générateur de modules :
moduleSizeXZ: 32 # Width and depth
moduleSizeY: 16 # Height
Remarque : tous les modules d'un générateur doivent utiliser les mêmes dimensions. Vous ne pouvez pas mélanger des modules 16×16×16 et 32×16×32 dans le même système de donjon.
Champs de configuration du générateur de modules
Au-delà de moduleSizeXZ et moduleSizeY, la configuration du générateur de modules prend en charge les champs suivants :
| Champ | Par défaut | Description |
|---|---|---|
isEnabled | true | Autorise la sélection naturelle. La commande manuelle ne vérifie pas ce paramètre. |
radius | À définir explicitement | Rayon en cellules de la grille de modules, dont la taille horizontale est moduleSizeXZ. Les cellules de la limite extérieure sont réservées par le treillis. |
edges | false | Enregistré mais non lu par le générateur actuel. Les bordures utilisent les balises world_border. |
startModule | — | Liste de fichiers .schem de départ. L'un est choisi au hasard, avec une rotation de 0, à la position de grille (0, 0, 0). |
minChunkY | 0 | Indice vertical minimal inclus de la grille de modules, pas une coordonnée Y de bloc du monde. |
maxChunkY | 0 | Indice vertical maximal inclus de la grille de modules. Incluez la couche 0 dans cette plage. |
moduleSizeXZ | À définir explicitement | Largeur et profondeur des modules en blocs |
moduleSizeY | À définir explicitement | Hauteur des modules en blocs |
debug | false | Dessine des blocs et du texte de diagnostic dans le monde cible. À utiliser uniquement dans une zone de génération jetable. |
useGradientLevels | false | Enregistré mais non lu par le calcul actuel des pools d'apparition. |
spawnPoolSuffix | — | Suffixe ajouté aux noms de pools. Omettez-le ou définissez "" pour n'en utiliser aucun. |
isWorldGeneration | false | true crée un monde vide dédié ; false colle dans le monde existant. |
treasureFile | — | Fichier de configuration de trésor pour les coffres de ce donjon |
generateLootInBarrels | true | Si les tonneaux des modules doivent être remplis de butin |
barrelTreasureFilename | treasure_barrel_food.yml | Fichier de configuration de trésor utilisé pour remplir les tonneaux de ce donjon |
validWorlds | vide (tous les mondes) | Liste des noms de mondes valides où le donjon peut se générer |
validWorldEnvironments | vide (tous les environnements) | Liste des environnements de monde valides (NORMAL, NETHER, THE_END, CUSTOM). Le générateur de donjons livré avec le plugin embarque explicitement [NORMAL, CUSTOM] : par défaut, les donjons ne se génèrent donc que dans les mondes de type overworld. Voir la remarque ci-dessous pour ce qui se passe quand la clé est absente. |
centerModuleAltitude | 0 | Coordonnée Y de départ en génération naturelle dans le terrain existant. La couche 0 est décalée vers le haut de la moitié de moduleSizeY. Le placement manuel dans un monde existant part de la position du joueur ; dans un monde dédié, il part de (0, 0, 0). |
Les clés absentes utilisent la valeur actuelle du champ dans la définition du générateur. Les générateurs prédéfinis initialisent ces valeurs pour leur propre contenu. Un générateur écrit à la main commence avec 0 pour radius, moduleSizeXZ et moduleSizeY ; ces zéros peuvent aussi être écrits dans le fichier. Ne supposez pas qu'une taille absente devient 16. L'absence de validWorlds et de validWorldEnvironments n'impose aucune restriction et ne limite donc pas le générateur à NORMAL/CUSTOM. Partez d'un générateur complet et fonctionnel, puis définissez explicitement le rayon, les dimensions, les modules de départ et les restrictions de mondes.
Champs de configuration par module
Chaque module individuel peut définir les champs de configuration suivants :
| Champ | Par défaut | Description |
|---|---|---|
isEnabled | true | Si ce module est activé |
weight | 100 | Poids de sélection de ce module pendant la génération. Une valeur négative ou non finie consigne un avertissement et devient 0, ce qui retire le module de la sélection. |
repetitionPenalty | 0 | Ajouté au poids pour chaque module adjacent déjà choisi ayant le même nom de schematic. Les valeurs positives favorisent la répétition ; les négatives la réduisent. Gardez un poids final positif. |
noRepeat | false | Exclut ce candidat à côté d'un module choisi ayant la même identité de configuration, clones compris. Ne limite pas le module à une occurrence par donjon. |
enforceVerticalRotation | false | Exige des rotations identiques autour de l'axe Y entre modules superposés si l'un des deux active ce paramètre. |
enforceHorizontalRotation | false | Exige des rotations identiques autour de l'axe Y entre voisins horizontaux si l'un des deux active ce paramètre. |
minY | -4 | Couche minimale incluse de la grille de modules pour sélectionner les candidats. |
maxY | 20 | Couche maximale incluse de la grille de modules pour sélectionner les candidats. |
biome | default | Enregistré mais sans effet sur la sélection des modules. |
minecraftBiome | null | Enregistré mais sans effet sur la sélection des modules. |
treasureFile | — | Chargé dans la configuration du module, mais les coffres créés par des marqueurs utilisent actuellement le treasureFile du générateur de modules lors du collage modulaire. |
generateLootInBarrels | true | Si les tonneaux de ce module doivent être remplis de butin |
barrelTreasureFilename | treasure_barrel_food.yml | Fichier de configuration de trésor utilisé pour remplir les tonneaux de ce module |
borders | — | Carte de balises de bordure définissant la compatibilité de connexion |
cloneConfig | — | Clone les paramètres depuis un autre fichier de configuration de module |
compoundModule | — | Enregistré mais non utilisé par le générateur actuel pour assembler des modules composés. |
isAutomaticallyPlaced | true | Autorise la sélection ordinaire des candidats. Un module de départ configuré contourne ce filtre. |
Définissez les six entrées de borders : north, south, east, west, up et down, chacune contenant une liste de balises. Les balises ordinaires doivent correspondre exactement, y compris la casse. Ainsi, corridor correspond à corridor ; no-mirror_corridor correspond à corridor, mais pas à un autre no-mirror_corridor. Chaque module reçoit quatre rotations autour de l'axe Y : 0, 90, 180 et 270 degrés.
nothing autorise un voisin vide. world_border désigne les modules de l'anneau horizontal extérieur où le placement est permis ; chaque face tournée vers l'extérieur doit contenir uniquement des balises world_border. Utilisez nothing pour fermer les limites supérieure et inférieure. Un rayon de 5 permet jusqu'à 9 × 9 cellules horizontales de modules, entourées d'une limite vide. Ces règles filtrent les candidats ordinaires ; le module initial est placé directement, sa configuration et sa géométrie doivent donc convenir à l'origine.
Pour cloneConfig, indiquez le nom du fichier .yml d'un autre module : les paramètres clonés seront lus dans ce fichier plutôt que dans celui du module. Lorsque la cible est trouvée, BetterStructures supprime les clés devenues redondantes du fichier de ce module sur le disque : treasureFile, barrelTreasureFilename, generateLootInBarrels, borders, minY, maxY, weight, repetitionPenalty, les deux paramètres de rotation, noRepeat, les six clés *IsPassable et isAutomaticallyPlaced. isEnabled, biome, minecraftBiome, cloneConfig et compoundModule restent dans le fichier. La recherche du module composé à l'exécution suit elle aussi la cible du clonage. Si le fichier indiqué n'existe pas, le clonage est ignoré avec un avertissement et le module conserve ses propres valeurs.
Vous verrez également northIsPassable, southIsPassable, eastIsPassable, westIsPassable, upIsPassable et downIsPassable écrits dans les configurations de modules générées. Ils valent true par défaut et rien dans le générateur ne les lit — les modifier n'a aucun effet. Utilisez borders à la place.
Ne créez pas de cycle de cloneConfig. Un cycle tel que a.yml -> b.yml -> a.yml interrompt le chargement des modules avec une erreur « Cyclic module clone configuration » qui indique la chaîne concernée.
Générer un donjon manuellement avec /bs generateModules
/bs generateModules <ModuleGeneratorsConfigFile.yml> exécute un générateur de modules à la demande, au lieu d'attendre qu'un donjon apparaisse pendant la génération du monde. La complétion par tabulation liste chaque fichier de générateur de modules chargé.
Ce qui se passe dépend du paramètre isWorldGeneration du générateur :
isWorldGeneration: true- BetterStructures crée un nouveau monde pour le donjon. Son nom reprend celui du fichier du générateur avec_0,_1,_2... ajouté, en choisissant le premier suffixe dont le dossier n'existe pas. C'est un monde vide en environnementNORMAL, sans conservation des chunks de spawn en mémoire et sans sauvegarde automatique. La commande passe le joueur en mode spectateur, mais ne le téléporte pas dans ce monde.isWorldGeneration: false- la génération a lieu dans le monde où vous vous trouvez.
Une barre de boss suit l'assemblage de l'agencement et disparaît dès que le collage est mis en file d'attente. Le message d'assemblage ne signifie pas que les blocs ou entités ont fini d'être collés. Si aucun schematic de départ configuré n'est installé, la génération s'arrête ; un module de départ désactivé peut aussi provoquer une annulation, car son conteneur n'est pas disponible.
La commande nécessite un joueur ayant betterstructures.generatemodules et est refusée pendant un rechargement de contenu. La génération manuelle contourne les contrôles du placement naturel, notamment l'activation du générateur, les restrictions de mondes et la protection de l'emprise. Choisissez soigneusement la destination.
Où se trouvent les fichiers de modules ?
Les modules se placent dans plugins/BetterStructures/modules, qui est analysé récursivement — un paquet de contenu peut conserver ses fichiers .schem dans des sous-dossiers, et les configurations .yml correspondantes sont générées à côté d'eux.
Les noms de schematics doivent être uniques dans toute l'arborescence modules. Les doublons ou un schematic illisible interrompent le chargement des modules. Les schematics sont lus avant la vérification de isEnabled : désactiver un module ne permet donc pas de contourner un fichier corrompu. Le dossier d'un paquet de contenu ayant isEnabled: false est entièrement ignoré : ses modules ne sont ni lus ni chargés.
Placement naturel et protection des donjons
La génération naturelle vérifie toute l'emprise configurée. Le placement est ignoré si elle chevauche le rayon de protection configuré autour de (0, 0), une région WorldGuard nommée ou des chunks générés qui n'ont pas été récemment observés comme nouveaux. Juste avant de mettre le collage en file d'attente, le système vérifie de nouveau WorldGuard et rejette la génération si un chunk initialement non généré l'a été entre-temps. Il s'agit d'un contrôle de l'état des chunks, pas d'une recherche de blocs construits par les joueurs ni d'autres plugins de protection. Créer un nouveau chunk près d'une ancienne base ne rend pas toute l'emprise admissible.
Gardez isWorldGeneration: false pour les générateurs sélectionnés naturellement. Le sélecteur naturel n'exclut pas ceux qui ont true ; ce paramètre crée tout de même un monde séparé au lieu de coller dans le terrain vérifié.
Les blocs, entités de bloc, objets de butin, entités et marqueurs partagent le budget de temps du collage. WorldGenerationFinishEvent est émis après un collage réussi dans un monde dédié et son traitement complémentaire immédiat. Cela ne signifie pas qu'une intégration a placé les sorties ou fait apparaître les boss instanciés en attente. Les grandes constructions peuvent nécessiter plusieurs ticks après le calcul de l'agencement.
Priorité des paramètres de butin des modules
Les coffres et coffres piégés créés par des marqueurs utilisent le treasureFile du générateur de modules. Pour les vrais blocs de tonneau, generateLootInBarrels doit être activé à la fois dans le générateur et dans le module. Un barrelTreasureFilename non vide dans le module est prioritaire sur la valeur du générateur ; les fichiers de modules générés utilisent treasure_barrel_food.yml par défaut. Le remplissage des coffres comme des tonneaux émet l'événement annulable ChestFillEvent avant d'appliquer les instantanés d'inventaire.
Utilisez des marqueurs de coffre pour générer leur butin. Le collage modulaire actuel ne conserve pas les inventaires des coffres ordinaires, coffres piégés et tonneaux du schematic. Les blocs de barrière sont ignorés ; les marqueurs de bedrock deviennent de la pierre uniquement si le bloc cible n'est pas solide. L'air creuse les intérieurs dans les mondes existants et est ignoré dans les mondes vides dédiés.
Les entités enregistrées dans un module, comme les supports d'armure, les tableaux et les cadres, sont collées avec lui. Les tableaux et les cadres suivent la rotation du module afin de rester fixés à leur mur.