Dialogues
Creer des popups de dialogue interactives avec des formulaires, des confirmations et des boutons multi-actions
Les dialogues sont des fenetres popup interactives qui apparaissent a l'ecran, permettant aux joueurs d'interagir avec des formulaires, des confirmations et des boutons d'action. Ils offrent une experience d'interface moderne allant au-dela des menus d'inventaire traditionnels.
Prerequis
Les dialogues necessitent Paper 1.21.7+.
Emplacement des fichiers
Les dialogues sont stockes dans le dossier plugins/zMenu/dialogs/. Chaque fichier YAML represente un dialogue.
plugins/zMenu/dialogs/
├── welcome.yml
├── confirmation.yml
├── server-links.yml
└── feedback-form.ymlTypes de dialogues
zMenu supporte tous les types de dialogues vanilla :
| Type | Description |
|---|---|
notice | Dialogue informatif simple avec un corps et des saisies optionnelles |
confirmation | Dialogue de confirmation Oui/Non |
multi_action | Plusieurs boutons d'action disposes en grille |
server_links | Affiche les liens du serveur sous forme de boutons cliquables |
dialog_list | Un hub qui liste d'autres dialogues, un bouton par dialogue |
Structure de base
name: "&6&lDialog Title"
external_title: "Window Title"
type: notice
can-close-with-escape: true
pause: false
after-action: CLOSE
body:
# Sections du contenu du corps...
inputs:
# Champs de saisie...Options de configuration
name
Le nom interne du dialogue, affiche avec la mise en forme des couleurs.
name: "&6&lWelcome Dialog"external_title
Le titre de la fenetre affiche dans l'en-tete du dialogue. external-title est aussi accepte. C'est egalement le libelle du bouton qui ouvre ce dialogue depuis une liste de dialogues. S'il est vide, rien n'est envoye et le client utilise le nom du dialogue.
external_title: "Server Information"type
Le type de dialogue. Voir Types de dialogues pour plus de details.
type: noticecan-close-with-escape
Permet aux joueurs de fermer le dialogue en appuyant sur Echap.
can-close-with-escape: truepause
Met le jeu en pause pendant que le dialogue est ouvert (comportement de type solo).
pause: falseafter-action
Ce qui se passe apres qu'une action est effectuee.
| Valeur | Description |
|---|---|
CLOSE | Ferme le dialogue |
PAUSE | Garde le dialogue ouvert |
NONE | Ne fait rien |
after-action: CLOSEContenu du corps
La section body definit le contenu qui apparait dans le dialogue. Vous pouvez combiner plusieurs types de contenu.
plain_message
Affiche des messages texte.
body:
welcome:
type: plain_message
messages:
- "&6&lWelcome to our server!"
- ""
- "&7Server IP: &fplay.example.com"
- "&7Discord: &fdiscord.gg/example"
width: 400item
Affiche un item avec une infobulle optionnelle.
body:
featured-item:
type: item
item:
material: DIAMOND_SWORD
name: "&b&lLegendary Sword"
lore:
- "&7A powerful weapon"
show-decoration: true
show-tooltip: true
width: 200
height: 150Champs de saisie
Les dialogues peuvent inclure des champs de saisie interactifs dans la section inputs.
dialog_text
Un champ de saisie de texte.
inputs:
feedback:
type: dialog_text
label: "&6Share your thoughts:"
width: 400
max-length: 200
multiline:
max-lines: 4Options :
| Option | Type | Description |
|---|---|---|
label | String | Label affiche au-dessus de la saisie |
width | Integer | Largeur du champ de saisie |
max-length | Integer | Nombre maximum de caracteres |
multiline.max-lines | Integer | Nombre de lignes pour la saisie multiligne |
dialog_boolean
Un interrupteur Oui/Non.
inputs:
subscribe:
type: dialog_boolean
label: "&eWould you like updates?"
text-true: "&a&lYES"
text-false: "&c&lNo"dialog_single_option
Une selection unique parmi plusieurs options.
inputs:
gamemode:
type: dialog_single_option
label: "&6Select your gamemode:"
options:
survival:
id: "survival"
display: "&2Survival"
creative:
id: "creative"
display: "&bCreative"
adventure:
id: "adventure"
display: "&6Adventure"dialog_number_range
Un curseur numerique.
inputs:
amount:
type: dialog_number_range
label: "&eSelect amount:"
start: 1
end: 64
step: 1Boutons dynamiques
Les boutons dynamiques generent plusieurs sections de corps ou saisies a partir d'un seul modele, repete sur une plage numerique. Ils sont utiles lorsque le nombre d'elements depend de donnees (un placeholder) ou lorsque vous devriez autrement copier/coller le meme bloc de nombreuses fois.
Les deux types dynamiques partagent ces options :
| Option | Type | Description |
|---|---|---|
start | Integer | Premier index, inclus. Compatible placeholders. |
end | Integer | Dernier index, inclus. Compatible placeholders. |
A l'interieur du modele repete, le placeholder %index% est remplace par le numero de l'iteration en cours.
dialog-dynamic-body-button
Place dans la section body:. Repete un element body: (par ex. dialog_plain_message, dialog_item).
body:
dynamic_message:
type: dialog-dynamic-body-button
start: 1
end: 5
body:
type: dialog_plain_message
messages:
- "&eThis is body section #%index%"
width: 300dialog-dynamic-input-button
Place dans la section inputs:. Repete un element input: (par ex. dialog_text, dialog_boolean). Chaque saisie generee a pour cle <button-name>_<index>, de sorte que sa valeur soumise est disponible via le placeholder %<button-name>_<index>%.
inputs:
# Si le joueur tape "Hello" dans le premier champ, %my_input_1% vaudra "Hello"
my_input:
type: dialog-dynamic-input-button
start: 1
end: 3
input:
type: dialog_text
label: "&6Enter value #%index%:"
width: 300
max-length: 50Consultez le fichier dialogs/dynamic-dialog-example.yml fourni pour un exemple complet.
Dialogue Notice
Un dialogue informatif simple avec des saisies optionnelles.
name: "&6&lServer Rules"
external_title: "Rules"
type: notice
can-close-with-escape: true
after-action: CLOSE
body:
rules:
type: plain_message
messages:
- "&c&lServer Rules"
- ""
- "&71. Be respectful to all players"
- "&72. No cheating or exploits"
- "&73. Follow staff instructions"
- "&74. Have fun!"
width: 350
inputs:
accept:
type: dialog_boolean
label: "&eI agree to the rules"
text-true: "&a&lAccept"
text-false: "&c&lDecline"Dialogue Confirmation
Un dialogue avec des boutons Oui et Non.
name: "&c&lConfirm Purchase"
external_title: "Confirmation"
type: confirmation
can-close-with-escape: true
after-action: CLOSE
body:
message:
type: plain_message
messages:
- "&7Are you sure you want to purchase"
- "&6Diamond Sword &7for &a$500&7?"
width: 300
confirmation:
yes-text: "&a&lConfirm Purchase"
yes-tooltip: "Click to confirm"
yes-width: 200
no-text: "&c&lCancel"
no-tooltip: "Click to cancel"
no-width: 200
yes-actions:
1:
success:
- type: console-command
commands:
- "give %player% diamond_sword 1"
- type: currency-withdraw
amount: 500
- type: message
messages:
- "&aPurchase successful!"
no-actions:
1:
success:
- type: message
messages:
- "&7Purchase cancelled."Options de confirmation
| Option | Description |
|---|---|
yes-text | Texte du bouton Oui |
yes-tooltip | Infobulle au survol du bouton Oui |
yes-width | Largeur du bouton Oui |
no-text | Texte du bouton Non |
no-tooltip | Infobulle au survol du bouton Non |
no-width | Largeur du bouton Non |
Dialogue Multi-Action
Un dialogue avec plusieurs boutons d'action disposes en grille.
name: "&6&lTeleport Menu"
external_title: "Teleport"
type: multi_action
can-close-with-escape: true
after-action: CLOSE
number-of-columns: 2
body:
header:
type: plain_message
messages:
- "&7Select a destination:"
width: 300
multi-actions:
spawn:
text: "&a&lSpawn"
tooltip: "&7Teleport to spawn"
width: 150
actions:
1:
success:
- type: close
- type: player-command
commands:
- "spawn"
- type: message
messages:
- "&aTeleporting to spawn..."
shop:
text: "&e&lShop"
tooltip: "&7Visit the shop"
width: 150
actions:
1:
success:
- type: close
- type: player-command
commands:
- "warp shop"
pvp:
text: "&c&lPvP Arena"
tooltip: "&7Enter the PvP arena"
width: 150
actions:
1:
success:
- type: close
- type: player-command
commands:
- "warp pvp"
home:
text: "&b&lHome"
tooltip: "&7Teleport home"
width: 150
actions:
1:
success:
- type: close
- type: player-command
commands:
- "home"Options Multi-Action
| Option | Description |
|---|---|
number-of-columns | Nombre de boutons par ligne |
multi-actions | Map des boutons d'action |
text | Texte du bouton |
tooltip | Infobulle du bouton |
width | Largeur du bouton |
actions | Actions executees au clic |
Dialogue Server Links
Affiche les liens du serveur sous forme de boutons cliquables.
name: "&6&lServer Links"
external_title: "Links"
type: server_links
can-close-with-escape: true
after-action: CLOSE
server-links:
text: "&6&lUseful Links"
tooltip: "&7Click to open"
width: 300
number-of-columns: 2
actions:
1:
success:
- type: message
messages:
- "&aLink opened!"Liste de dialogues
Un dialogue dialog_list est un hub : il affiche un bouton par dialogue liste sous dialogs:, chacun avec comme libelle le external-title de son dialogue (ou son nom s'il n'en a pas). Cliquer sur un bouton ouvre ce dialogue. Un exemple est genere dans dialogs/dialog_list-dialog.yml.
name: "&6&lServer Hub"
external-title: "&6Server hub"
type: dialog_list
can-close-with-escape: true
pause: false
after-action: CLOSE
number-of-columns: 2
button-width: 150
dialogs:
- "default-dialog" # dialogue zMenu, par nom de fichier ou nom
- "multi_action-dialog"
- dialog: "confirmation-dialog" # idem, ecrit sous forme de map
- registry-key: "minecraft:server_links" # dialogue vanilla ou de datapack
back-button:
enabled: true
label: "&7« Back"
tooltip: "&7Return to the server hub"
width: 150
exit-button:
label: "&cClose"
tooltip: "&7Close the server hub"
width: 150
actions:
1:
success:
- type: message
messages:
- "&7See you soon!"
body:
welcome:
type: dialog_plain_message
messages:
- "&7Welcome &f%player_name%&7, pick a section below."
width: 300Options de la liste de dialogues
| Option | Type | Defaut | Description |
|---|---|---|---|
dialogs | Liste | - | Les dialogues a lister. Chaque entree est un nom de dialogue zMenu (nom ou plugin:nom, aussi ecrit dialog: <nom>), ou un dialogue vanilla/datapack ecrit registry-key: <namespace:cle> |
number-of-columns | Entier | 2 | Nombre de boutons par ligne |
button-width | Entier | 150 | Largeur de chaque bouton (1-1024) |
back-button.enabled | Booleen | true | Ajoute un bouton retour aux dialogues listes |
back-button.label | Texte | Back | Libelle du bouton retour |
back-button.tooltip | Texte | vide | Infobulle du bouton retour |
back-button.width | Entier | 150 | Largeur du bouton retour (1-1024) |
exit-button | Section | aucun | Bouton optionnel en bas de la liste, aussi declenche par la touche Echap. Supporte label, tooltip, width et actions |
Bon a savoir :
- Bouton retour : le client ne revient pas a la liste quand un dialogue liste est ferme. Le bouton retour est ajoute aux dialogues listes qui n'ont pas leur propre bouton de sortie (
multi_action,server_linksetdialog_list) pour que les joueurs puissent revenir. Les dialoguesnoticeetconfirmationn'ont pas d'emplacement de sortie et restent inchanges. Pour ecrire votre propre bouton retour, donnez au dialogue unexit-buttonavec l'actiondialog. - Prerequis : les dialogues listes dont le joueur ne remplit pas l'
open-requirementsont masques. Le prerequis est verifie a l'ouverture de la liste, car le client ouvre les dialogues listes lui-meme, sans demander au serveur. - Imbrication : une liste peut contenir d'autres listes. La profondeur maximale est definie par
dialog-list-max-depthdansconfig.yml(4par defaut).
Options des boutons d'action
Les boutons d'action — les boutons Oui/Non d'une confirmation, un bouton de notice, chaque entree d'un multi_action, et le bouton de sortie de server_links — partagent un ensemble commun d'options.
type
Le type d'action effectuee lorsque le bouton est clique.
| Valeur | Description |
|---|---|
custom-click | (par defaut) Execute les actions: zMenu definies sur le bouton. |
static | Execute une action native du client (voir static-type ci-dessous), sans aller-retour serveur. |
static-type
Utilise uniquement lorsque type: static. L'action native du client a effectuer.
static-type | Champ requis | Description |
|---|---|---|
OPEN_URL | url | Ouvre une URL dans le navigateur du joueur |
OPEN_FILE | file | Ouvre un fichier local |
RUN_COMMAND | command | Execute une commande en tant que joueur |
SUGGEST_COMMAND | command | Pre-remplit la zone de chat avec une commande |
COPY_TO_CLIPBOARD | text | Copie du texte dans le presse-papiers |
multi-actions:
website:
text: "&bOur Website"
type: static
static-type: OPEN_URL
url: "https://example.com"usage-limit
Nombre maximum de fois que le bouton peut etre active (par defaut : illimite).
usage-limit: 1duration-limit
Un temps de recharge entre les activations. Soit un simple nombre (secondes), soit une section avec une unite de temps :
duration-limit: 5 # 5 secondesduration-limit:
value: 2
type: MINUTES # SECONDS, MILLISECONDS, MINUTES, HOURS, ...enable-placeholders
Active l'interpretation des placeholders pour le bouton. Accepte un booleen, ou une section pour l'activer par cle.
Compatibilite ascendante
La forme imbriquee (<key>.label, <key>.tooltip, <key>.width, <key>.actions, <key>.type) est la nouvelle disposition canonique, mais les anciennes cles plates (yes-text, notice.text, multi-actions.<key>.text, ...) fonctionnent toujours, de sorte que les fichiers de dialogue existants n'ont pas besoin d'etre reecrits.
Ouvrir des dialogues
Depuis les actions de bouton
Utilisez le type d'action dialog dans les boutons d'inventaire :
items:
open-dialog:
slot: 13
item:
material: BOOK
name: "&6Open Dialog"
actions:
- type: dialog
dialog: "welcome"Avec des arguments
Passez des arguments au dialogue :
actions:
- type: dialog
dialog: "confirmation"
arguments:
- "diamond_sword"
- "500"Depuis un plugin externe
Ouvrez un dialogue depuis un autre plugin :
actions:
- type: dialog
dialog: "my-dialog"
plugin: "MyPlugin"Exemples complets
Formulaire de retour
name: "&6&lFeedback Form"
external_title: "Share Your Feedback"
type: notice
can-close-with-escape: true
after-action: CLOSE
body:
header:
type: plain_message
messages:
- "&6&lWe Value Your Feedback!"
- ""
- "&7Please share your thoughts about the server."
width: 400
inputs:
rating:
type: dialog_single_option
label: "&eHow would you rate your experience?"
options:
excellent:
id: "5"
display: "&a⭐⭐⭐⭐⭐ Excellent"
good:
id: "4"
display: "&e⭐⭐⭐⭐ Good"
average:
id: "3"
display: "&6⭐⭐⭐ Average"
poor:
id: "2"
display: "&c⭐⭐ Poor"
comments:
type: dialog_text
label: "&7Additional comments:"
width: 400
max-length: 500
multiline:
max-lines: 5
subscribe:
type: dialog_boolean
label: "&eReceive updates about new features?"
text-true: "&aYes, keep me updated!"
text-false: "&7No thanks"Selection de kit
name: "&6&lSelect Your Kit"
external_title: "Kit Selection"
type: multi_action
can-close-with-escape: false
after-action: CLOSE
number-of-columns: 3
body:
info:
type: plain_message
messages:
- "&7Choose your starting kit wisely!"
- "&7This cannot be changed later."
width: 400
multi-actions:
warrior:
text: "&c&lWarrior"
tooltip: "&7Iron armor and sword"
width: 120
actions:
1:
success:
- type: console-command
commands:
- "kit warrior %player%"
- type: message
messages:
- "&aYou selected the Warrior kit!"
archer:
text: "&a&lArcher"
tooltip: "&7Leather armor and bow"
width: 120
actions:
1:
success:
- type: console-command
commands:
- "kit archer %player%"
- type: message
messages:
- "&aYou selected the Archer kit!"
mage:
text: "&5&lMage"
tooltip: "&7Robes and magic items"
width: 120
actions:
1:
success:
- type: console-command
commands:
- "kit mage %player%"
- type: message
messages:
- "&aYou selected the Mage kit!"Bonnes pratiques
- Gardez les dialogues cibles - Un seul objectif par dialogue
- Utilisez des labels clairs - Rendez les saisies faciles a comprendre
- Fournissez des infobulles - Aidez les joueurs a comprendre les actions des boutons
- Testez sur la version cible - Assurez-vous que Paper 1.21.4+ et PacketEvents sont installes
- Gerez tous les cas - Definissez des actions pour tous les choix possibles
- Utilisez les types appropries - Choisissez le bon type de dialogue pour votre cas d'usage
Prochaines etapes
- Decouvrez les Actions pour les comportements des boutons de dialogue
- Configurez les Exigences pour l'acces conditionnel aux dialogues
- Consultez les Inventaires pour les alternatives de menu traditionnelles