La forme d’un arbre
Un progrès sans parent est une racine, et une racine obtient son propre onglet dans l’écran des progrès. Tout ce qui le désigne comme parent devient un nœud de cet onglet, et ces nœuds peuvent avoir leurs propres enfants. C’est tout le modèle d’arbre — il n’existe pas de notion séparée de chapitre ou de ligne de quête, seulement la filiation.
harbor:harbor_quest_1 (racine, onglet propre)
└─ harbor:harbor_hunt "parent": "harbor:harbor_quest_1"
└─ harbor:harbor_end "parent": "harbor:harbor_hunt"
Seule la racine porte un background, la texture répétée derrière l’onglet. En définir un sur un enfant ne fait rien, d’où l’intérêt d’un constructeur qui connaît la différence plutôt que d’un modèle figé.
Le déclencheur impossible, c’est tout l’intérêt
Chaque progrès a besoin d’au moins un critère, et un critère a besoin d’un déclencheur. Le vanilla en fournit beaucoup — tuer quelque chose, entrer quelque part, ramasser un objet — mais une vraie quête correspond rarement à un seul d’entre eux. « Livrer la lettre au capitaine du port » n’est pas un événement vanilla.
On utilise donc le déclencheur qui ne se déclenche jamais :
"criteria": {
"delivered": {
"trigger": "minecraft:impossible"
}
}
Rien dans le monde ne le complète. C’est vous qui le faites, depuis votre propre logique :
/advancement grant @s only harbor:harbor_quest_1
Cette commande se place là où la quête se conclut réellement : un bloc de commande près de la jetée, une fonction appelée depuis un échange de villageois, une vérification dans votre fonction tick. Le progrès cesse d’être un détecteur et devient un enregistrement : ce qui retient que ce joueur est allé jusque-là, survit aux redémarrages et conditionne la suite.
C’est le schéma sur lequel repose presque tout système de quêtes personnalisé d’un serveur vanilla.
Les récompenses, et celle qui surprend
Quatre types de récompenses peuvent être attachés à un progrès :
"rewards": {
"experience": 50,
"recipes": ["harbor:reinforced_block"],
"loot": ["harbor:quest_bundle"],
"function": "harbor:on_quest_complete"
}
La récompense function est la plus puissante, car elle transforme un progrès en point d’accroche : une fois complété, des commandes arbitraires s’exécutent. Donner un objet, lancer une bossbar, régler un scoreboard, ouvrir une porte.
La récompense recipes est celle qui surprend, et elle éclaire un mystère venu de l’autre bout du site : une recette personnalisée n’apparaît pas dans le livre tant que quelque chose ne la débloque pas, et c’est ce quelque chose. Le vanilla embarque un progrès caché pour chacune de ses recettes, qui ne fait rien d’autre. Si votre recette se fabrique mais n’apparaît jamais dans le livre, c’est ce fichier qui manque.
Tester sans jouer la quête
Deux commandes couvrent toute la boucle :
/advancement grant @s only harbor:harbor_quest_1
/advancement revoke @s only harbor:harbor_quest_1
Remplacez only par until, from ou through pour déplacer toute une branche d’un coup, ce qui épargne beaucoup de clics quand on teste une chaîne de cinq étapes. Le revoke permet de rejouer la même étape sans créer un nouveau monde.
Deux renommages qui cassent les anciens exemples
| Changement | Avant | Après |
|---|---|---|
| Dossier, en 1.21 | advancements/ | advancement/ |
| Icône, en 1.20.5 | {"item": "minecraft:map"} | {"id": "minecraft:map"} |
Le renommage de dossier est le plus vicieux des deux, comme pour les tables de butin : le pack se charge, s’affiche comme activé, et le progrès n’est simplement pas là. Le renommage de l’icône a au moins tendance à se plaindre dans le log.
Petites choses qui coûtent une soirée
- Un progrès sans
criteriaest invalide, même si vous ne l’attribuez que par commande. Donnez-lui un critèreimpossible. - Un
parentpointant vers un identifiant inexistant fait disparaître l’enfant au lieu de lever une erreur claire. hiddenne masque que jusqu’à obtention, et seulement si ce n’est pas une racine.- L’onglet n’apparaît pas du tout tant qu’aucun progrès qu’il contient n’est visible pour ce joueur.
Pour aller plus loin
Le constructeur de progrès écrit le fichier et la commande d’attribution correspondante, et sait quels champs appartiennent à une racine plutôt qu’à un enfant. Pour le conteneur, voyez le générateur de data packs ; pour donner à la quête quelque chose à remettre, le générateur de tables de butin et le générateur de recettes couvrent récompenses et déblocages.