Creating menus

Define dialogs under menus in plugins/CustomMenu/config.yml. A menu needs at least one valid button.

Create an inline menu

This small example uses the same menu structure, message action and player placeholder as the supplied default configuration.

yaml
open-command:
  name: menu
  menu: main

menus:
  main:
    pause-menu: false
    title: "<gold>Server menu</gold>"
    after-action: close
    can-close-with-escape: true
    columns: 1
    buttons:
      welcome:
        label: "<green>Welcome</green>"
        actions:
          - "message: <gray>Hello, %player%!</gray>"

Open the dialog with /custommenu open main while testing. The player-facing command is /menu when open-command.name is menu. Renaming that command requires a restart.

Choose where the menu opens

Entry pointConfiguration or actionWhen changes apply
Inline menuopen-command.menu, /custommenu open <menu> or menu: <menu-id>Runtime menu layout and actions reload with /custommenu reload.
Pause screenpause-menu: trueRegistry layout changes require a server restart.
Quick Actionsquick-actions: trueRegistry layout changes require a server restart.

Pause-menu and Quick Actions are independent and can both be enabled. One pause-menu entry appears as a direct button; multiple entries are grouped by the client under Custom Options. Quick Actions has no default key binding: players set it in Options → Controls → Key Binds → Miscellaneous → Quick Actions.

Layout, body text and buttons

title sets the dialog heading, button-name labels its pause-screen entry, and columns sets the button grid. Add a body line as text or use a map containing item or sprite with optional text.

Buttons support label, optional tooltip and width, plus an actions list. Actions run from top to bottom. Read Actions & inputs for commands, messages, navigation and forms.

IDs and closing behavior

Menu and button IDs use lowercase [a-z0-9_.-]. Input keys use [a-zA-Z0-9_.-] and are case-sensitive. Match each %input_<key>% placeholder to its exact key.

after-action accepts close, none or wait_for_response. If you disable can-close-with-escape, keep a button with the close action so players can exit.

Sprites and custom glyphs

Use native Minecraft sprites for built-in icons. Optional ItemsAdder and Nexo integrations resolve resource-pack glyphs. The dedicated guides include exact supported tags and bootstrap timing constraints.

Test your changes

Reload and open the inline menu to test actions. Restart for pause/Quick Actions registry changes or a new command name. If a menu does not appear, check that it has a valid ID and at least one valid button. Quote YAML values that look like booleans; see Troubleshooting for more checks.