Menus and Actions
Menus live in menus.yml. They define chest UI screens, item layout, click actions,
cooldowns, filler items, and dynamic content such as cosmetics.
Basic Menu Structure
This is the shape of a normal menu:
menus:
profile:
enabled: true
size: 27
title: "<gradient:#55ccff:#8ae6ff>Profile</gradient>"
permission: "atlaslobby.menu.profile"
click-cooldown-seconds: 1
filler:
enabled: true
material: BLACK_STAINED_GLASS_PANE
name: " "
lore: []
items:
rewards:
enabled: true
slot: 10
material: CHEST
name: "&eRewards"
lore:
- "&7Open daily rewards."
actions:
- "open_menu: rewards"
Menu Item Fields
Menu items can use these fields:
| Field | Purpose |
|---|---|
enabled | Turns the item on or off. |
slot / slots | Places the item in one slot or multiple slots. |
material | Minecraft item material name. |
amount | Stack amount. |
custom-model-data | Custom model data for resource-pack models. |
enchantments | List such as ["sharpness:5", "unbreaking:3"]. |
head-owner / head-url / head-texture | Custom player-head icon sources. |
name | Display name. |
lore | Lore lines. |
glow | Adds enchant-style glow. |
hide-flags | Hides item flags. |
permission | Permission required to use or see the item. |
actions | Default click actions. |
left-click-actions | Actions for left click. |
right-click-actions | Actions for right click. |
shift-click-actions | Actions for shift click. |
locked | Marks the item as locked. |
state / states | State-specific item behavior. |
Custom Heads
Any item with material: PLAYER_HEAD can use one of these head sources:
head-owner: "%player%" # a player name; placeholders are allowed
head-url: "http://textures.minecraft.net/texture/..."
head-texture: "<base64 value>"
Action Types
Actions are written as strings inside an action list.
| Action type | Example |
|---|---|
| Player command | player_command: spawn |
| Console command | console_command: give %player% diamond 1 |
| Message | message: &aHello! |
| Broadcast | broadcast: &bNews! |
| Title | title: &eWelcome |
| Actionbar | actionbar: &7Loading... |
| Sound | sound: UI_BUTTON_CLICK |
| Open menu | open_menu: rewards |
| Open cosmetics at a category | open_cosmetics: hats |
| Close menu | close: |
| Teleport spawn | teleport_spawn: |
| Connect server | connect: survival |
| Equip cosmetic | equip_cosmetic: atlas-ring |
| Equip cosmetic alias | select_cosmetic: atlas-ring |
| Unequip cosmetic slot | unequip_cosmetic: hat |
| Preview cosmetic | preview_cosmetic: atlas-ring |
| Clear particle cosmetic | clear_cosmetic: |
| Switch cosmetic category | set_category: gadgets |
| Next page | page_next: |
| Previous page | page_prev: |
| Give coins to clicker | give_coins: 100 |
| Toggle visibility | toggle_visibility: |
| Claim daily reward | claim_daily_reward: |
| Send resource pack | send_resource_pack: |
Dynamic Cosmetic Menus
The default cosmetics menu does not list every cosmetic by hand. Instead, it uses a
content provider that fills a region of slots from cosmetics.yml.
That lets the menu support category tabs and pagination automatically.
cosmetics:
size: 54
content:
source: cosmetics
default-category: particles # starting tab
slots: ["10-16", "19-25", "28-34"] # ints or "from-to" ranges
states:
disabled: { material: BARRIER } # optional per-state overrides for cards
items:
tab-particles:
slot: 45
material: BLAZE_POWDER
name: "&bParticles"
actions: ["set_category: particles"]
previous:
slot: 48
material: ARROW
name: "&7Previous Page"
actions: ["page_prev:"]
next:
slot: 50
material: ARROW
name: "&7Next Page"
actions: ["page_next:"]
Cosmetic card behavior:
- Clicking a card equips the cosmetic.
- Clicking an already equipped cosmetic unequips it.
- Shift-right-click previews particle cosmetics.
- The card material, name, and lore come from that cosmetic’s
iconblock incosmetics.yml.
Inside a dynamic menu, these placeholders are available:
| Placeholder | Meaning |
|---|---|
%page% | Current page number. |
%pages% | Total page count. |
%menu_category% | Current category id. |
%menu_category_display% | Current category display name. |
Recursion Protection
Bad configs should not crash the server. AtlasLobby limits action recursion:
actions:
max-recursion-depth: 8
For server selector entries, prefer proxy-server in servers.yml instead of making
a server entry call connect to itself.