Menus & Actions

How to author BusyHub GUI menus and the action strings that drive nearly every trigger in the plugin — compass menu clicks, portal entry, launch pads, and more.


Menu files

Every file under menus/ (e.g. menus/main.yml) defines one GUI, referenced by filename (without .yml) from compass.menu or a [MENU] action.

yaml
title: "&8Server Selector"
rows: 3          # 1-6, clamped

items:
  survival:
    slot: 11      # 0-based, must fit rows * 9
    material: GRASS_BLOCK
    name: "&a&lSurvival"
    lore:
      - "&7Click to join Survival"
    actions:
      - "[BUNGEE] survival"

  close:
    slot: 22
    material: BARRIER
    name: "&c&lClose"
    lore: []
    close-on-click: true
  • The key under items (survival, close, ...) is just an identifier for your own reference — the actual placement comes from slot.
  • close-on-click: true closes the inventory after running the item's actions. There is no "fill remaining slots" convention — every slot you want filled needs an explicit entry.
  • texture: on a PLAYER_HEAD item takes a base64-encoded Mojang skin payload ({"textures":{"SKIN":{"url":"..."}}}, then base64), not a raw texture URL. If you have a raw textures.minecraft.net URL, wrap it in that JSON shape and base64-encode the whole thing before pasting it in.
  • Clicking any slot in a BusyHub menu is fully consumed — players can never drag items into or out of one.

Action syntax

Actions are strings shaped [IDENTIFIER] data, used in menu items' actions: lists, and via /busyhub portal addaction / /busyhub pad addaction. Every list runs top to bottom.

Identifier Example Behavior
BUNGEE [BUNGEE] survival Sends a BungeeCord Connect plugin message for the given server. Velocity's Bungee-compatibility mode understands the same channel. Logs a warning and no-ops if the BungeeCord channel isn't registered (e.g. no proxy) or no server name is given.
VELOCITY [VELOCITY] survival Identical to BUNGEE — just delegates to it. Provided so config authors can use whichever name matches their proxy.
WARP [WARP] parkour Teleports the player to the named EssentialsX warp. Reads the location directly from Essentials, so the player needs no essentials.warp permission and no teleport delay or cooldown applies. Logs a warning and no-ops if EssentialsX isn't installed or the warp doesn't exist.
MENU [MENU] socials Opens another BusyHub menu by name.
MESSAGE [MESSAGE] &aWelcome, %player%! Sends a chat message. Parsed as MiniMessage if it contains <tag> syntax, otherwise legacy & codes. %player% is replaced with the triggering player's name. MiniMessage's <click:open_url:'...'> can be used here to build a clickable link, since there's no dedicated link action.
SOUND [SOUND] entity.firework_rocket.launch 1.0 1.4 Plays a sound to the player at their own location. Volume/pitch are optional, default 1.0. Accepts either a raw namespaced key or the old enum-constant style (ENTITY_FIREWORK_ROCKET_LAUNCH).
PLAYER [PLAYER] spawn Runs the given command as the player (leading / optional). %player% substitution applies.
CONSOLE [CONSOLE] give %player% diamond 1 Runs the given command as console. Same %player% substitution.

Malformed strings (missing brackets) or an unknown identifier just log a warning and are skipped — they don't stop the rest of the list from running.

Examples:

[BUNGEE] survival
[MESSAGE] Teleporting you to survival...
[SOUND] entity.firework_rocket.launch 1.0 1.4
[CONSOLE] give %player% diamond 1