Écrans de dialogue : créer de vrais menus sans mod
Les dialogues de datapack offrent une véritable fenêtre avec champs de saisie et boutons. Voici la structure JSON, comment un bouton exécute une commande, et ce que cela change par rapport à l'astuce du menu-livre.
Les menus de serveur s'écrivaient autrefois avec des livres à pages cliquables, ou une interface de Coffre simulée avec des cadres. Les dialogues ont remplacé les deux par un véritable écran.
Ce qu'est un dialogue
Un fichier JSON dans un datapack qui décrit une fenêtre :
data/<namespace>/dialog/welcome.json
{
"type": "minecraft:notice",
"title": { "text": "Welcome" },
"body": [{ "type": "minecraft:plain_message",
"contents": { "text": "Pick a class to begin." } }],
"action": { "label": { "text": "Continue" } }
}
Puis /dialog show @p my_pack:welcome.
Les types
| Type | Forme |
|---|---|
notice | du texte plus un bouton de fermeture |
confirmation | oui / non, chacun avec sa propre action |
multi_action | une grille de boutons |
server_links | la liste de liens intégrée |
dialog_list | un menu qui ouvre d'autres dialogues |
multi_action est le cheval de trait — c'est le sélecteur de classe, la boutique, la liste de téléportation.
Les boutons exécutent des commandes
{ "label": { "text": "Warp to spawn" },
"action": { "type": "minecraft:run_command", "command": "/spawn" } }
Comme clickEvent dans le chat, cela s'exécute en tant que Joueur qui clique, à son niveau de permission. Un bouton appelant une commande réservée aux op ne fait rien pour un Joueur normal. La solution habituelle est un objectif trigger : le bouton exécute /trigger warp set 1 et une fonction périodique effectue la partie privilégiée.
Les champs de saisie
"inputs": [
{ "type": "minecraft:text", "key": "name", "label": { "text": "Your name" }, "max_length": 16 },
{ "type": "minecraft:boolean", "key": "pvp", "label": { "text": "Enable PvP" } },
{ "type": "minecraft:single_option", "key": "class", "label": { "text": "Class" }, "options": [
{ "id": "mage", "display": { "text": "Mage" } },
{ "id": "rogue", "display": { "text": "Rogue" } } ] }
]
Les valeurs parviennent à une commande via un bouton dont l'action est minecraft:dynamic/run_command : son template prend $(key) pour chaque champ. Un bouton run_command simple ne reçoit rien.
"action": {
"type": "minecraft:dynamic/run_command",
"template": "function my_pack:join {name:'$(name)',class:'$(class)'}"
}
La fonction appelée est alors une macro :
$say Welcome $(name), you chose $(class)
Le préfixe $ sur la ligne et $(key) pour la substitution, aux deux extrémités. C'est tout le mécanisme de liaison, et c'est ce qui rend les dialogues réellement utiles plutôt que décoratifs.
Pourquoi c'est mieux que l'astuce du livre
- C'est un écran, donc il suspend la saisie au lieu de rester dans l'historique du chat.
- Les champs de saisie existent vraiment. Un livre ne pouvait offrir que des liens.
- Aucun objet requis. Rien à perdre, à lâcher ou à dupliquer.
- Il se ferme proprement et ne peut pas être remonté.
Le seul point où les livres restent meilleurs, c'est la lecture longue — le corps d'un dialogue n'est pas un bon endroit pour trois pages de lore.
Styles de points de repère
Le même outil couvre les points de repère de la barre de localisation, dont les styles sont des ressources de pack de ressources (assets/<namespace>/waypoint_style/) contrôlant les sprites et les distances de fondu d'un Joueur ou d'une position suivis ; la couleur se définit séparément avec /waypoint modify <target> color. Utile pour les marqueurs d'équipe là où une barre de boss serait trop intrusive.
Créez des écrans de dialogue avec champs de saisie et boutons, et personnalisez les styles de points de repère, dans le Dialog Input & Waypoint Style Builder.