Menus
The hundred and eighteen screens, which folder keeps your edits and how, the file schema, and the actions you can bind elsewhere.
A hundred and eighteen menu files ship, in two places that behave completely differently.
| Folder | Files | Behaviour |
|---|---|---|
modules/<id>/menus/, and menus/currency_select.yml | 69 | Written when missing, then kept up to date without undoing your edits. Yours. |
menus/admin/ | 49 | The whole folder is deleted and re-extracted from the jar on every start, every /sc reload and every /exylialib reload. |
Thirty-four of those forty-nine open with a header saying the file is yours to edit, written once and
never overwritten. Twelve more say DO NOT EDIT — REGENERATED ON EVERY STARTUP, which is right except
that it happens on every reload too; the three duel room screens carry no header at all. Whatever the
header says, edits under menus/admin/ are destroyed silently on the next restart or reload.
The one exception in the other direction is modules/warps/menus/warp_setup.yml, and the five
protection admin screens under modules/protections/menus/: admin editors that live outside
menus/admin/, and are therefore kept like any other owner menu.
A malformed file is named in the log and left unregistered, rather than silently loading empty.
How your menus are kept up to date
Every folder of owner menus is refreshed on start and on every reload, before the menus are read. For
each file the plugin compares three things: what is on disk, what shipped this time, and the defaults
you last had, which it keeps in .defaults/files/ inside the plugin folder.
- A missing file is written.
- A key a release adds is written into your file straight away, comments included. Nobody can have chosen something that did not exist yet.
- A default that changed on a key you never touched is not applied. It waits in
/exylialib updates, where you apply it or keep what you have. - Anything you changed or deleted is never touched.
On a server that already had the files before this tracking existed, every value on disk counts as
yours, and a key missing from a file is offered in /exylialib updates rather than written — it may be
one you deleted. A file that does not parse is left alone and reported.
Files that declare a version
The twenty-one protection screens and modules/player-settings/menus/settings.yml carry
menu-version: 4. When a release ships a higher number than the file on disk (a file without the key
counts as 0), the file is replaced outright, your edits with it, and your previous file is kept next to
it as <name>.yml.v<old version>. That is reserved for a layout change an old file cannot survive.
Once the plugin has installed a file, a file that goes missing counts as one you deleted, and it is not
written again. The menu is then not registered: the log names the file that could not be read, and
whatever opens that screen does nothing. To get the shipped file back, delete its copy under
.defaults/files/ as well — the same path, .defaults/files/modules/homes/menus/homes.yml for
modules/homes/menus/homes.yml — and reload.
The headers of modules/crates/menus/history.yml, modules/crates/menus/preview.yml, the three
screens in modules/economy/menus/ and menus/currency_select.yml still say they are written once and
never overwritten. Your edits are kept, but keys a release adds are written into them as described
above.
The trade window, modules/trade/window.yml, is not a menu file — its slots are fixed by the plugin —
but it is kept up to date the same way. See Trade and vaults.
The player-facing menus
These are the ones worth styling.
| Menu | Opened by |
|---|---|
homes/homes | /home, /homes |
homes/home_edit | A home in that list |
warps/warp_list | /warp |
rtp/rtp | /rtp with no world |
near/near_list | /near, when display-mode: UI |
tpa/tpa_confirm | Sending a /tpa with confirm on |
kits/list | /kit |
kits/preview | /kit preview, /kitadmin preview |
kits/container | A shulker or bundle inside a kit preview |
rewards/list | /rewards |
rewards/preview | /rewards preview, /rewardsadmin preview, a reward in that list |
crates/preview | /crates, /crates preview, right-clicking a crate block |
crates/history | /crates history |
bounties/bounty_list | /bounty |
bounties/bounty_contributions | A head in that list |
bounties/bounty_place_confirm | /bounty place |
graves/graves | /graves |
rankup/rankup | /rankup |
playtime-rewards/playtime-rewards | /playtime |
farming/farming | /farming |
stats/stats | The stats_open action (/stats is never registered — see Combat) |
stats/stats-leaderboard | A stat row in that screen |
missions/missions | /missions |
seasons/seasons | /seasons |
seasons/season_board | A season in that list |
votes/vote | /vote |
boosters/boosters | /boosters |
economy/wallet | /wallet, /economy wallet |
economy/top | /baltop, /economy top |
economy/history | /economy history |
shop/shop | /shop |
shop/category | /shop <category>, a category in the shop |
shop/amount | A product in a category |
market/market | /market |
market/my_listings | /market mine |
market/preview | A listing |
market/confirm | Buying a listing |
auctions/auctions | /auction |
auctions/my_auctions | /auction mine |
auctions/bid | An auction in the list |
orders/orders | /orders |
orders/my_orders | /orders mine |
orders/fill | An order on the board |
vaults/vaults | /vault with no number |
afk-zones/afkzone_preview | /afkzone preview <id> |
player-settings/settings | /settings |
protections/list | /protections |
protections/logs | /protections logs |
protections/manage | A protection in that list |
protections/shop, members, roles, permissions, bans, market, subregions, subregion, rent, warps, warp, perks, merge | Buttons in the protection screens |
menus/currency_select | Any screen that has to ask which currency — listing on the market, starting an auction, placing an order |
The protection screens are covered in Protections.
The admin screens
Forty-nine files in menus/admin/, one flow per module, reached from that module's admin command: mines
with their levels, composition and degrade chains; crates with their rewards, animation and pity; loot
chest templates and placed chests; item spawners and their locations; power-up zones, their entries and
their locations; regen zones and their flag grid; duel rooms and their flags; portals; jump pads; AFK
zones; warps; kits; rewards; bounties; shop categories and products; currencies and the economy settings;
and item updates.
They work, and you should not edit them. The plugin replaces the folder from the jar so that a button added in a release reaches servers that already have it.
Outside that folder, modules/warps/menus/warp_setup.yml is the warp editor, and
modules/protections/menus/ holds the protection admin screens — admin, admin_protection, tiers,
tier and cleanup, reached from /protections admin. Those six are kept like any owner menu. See
Protection admin.
The file schema
A menu file is:
title: "…"
size: 54
type: PAGINATION
open_sounds: ["UI_BUTTON_CLICK|1.0|1.0"]
click_sounds: []
refresh: { mode: SMART, interval: 40 }
filler:
global: { material: GRAY_STAINED_GLASS_PANE, name: " " }
pagination: { material: BARRIER, name: "Nothing here" }
pagination:
slots: '10-16,19-25,28-34'
item_template: { material: "%icon%", name: "%name%", lore: [], actions: ["survivalcore:…"] }
navigation:
previous: { slot: 45, material: ARROW }
next: { slot: 53, material: ARROW }
items:
close: { slot: 49, material: BARRIER, name: "Close", actions: ["survivalcore:close_menu"] }| Key | What it does |
|---|---|
size | Always size, never rows |
type | Decorative. A menu paginates because it has a pagination: block, not because of this |
refresh | {mode: ON_CLICK, click_delay: 4} or {mode: SMART, interval: N} |
filler.global | The background |
filler.custom.<name> | A second filler with its own slots |
filler.pagination | What is drawn when the list is empty |
pagination.slots | '0-35', or a comma-separated set of ranges |
sections | Named slot groups with their own templates and navigation. Used by the kit preview and its container screen, the reward preview, the shop and its categories, and the market preview |
animation | center_out |
menu-version | Only in the files that declare one; see above. Leave it alone |
State templates
A paginated list can draw a row differently depending on its state. modules/kits/menus/list.yml has
four — item_template, cooldown_template, used_template, locked_template — and the kit preview's
claim section has six.
Actions
The key is always actions:, a list of strings. The click type is a prefix inside the string:
actions:
- "left: survivalcore:mine_edit %mine_id%"
- "right: survivalcore:mine_delete %mine_id%"
- "shift_left: survivalcore:mine_set_weight %mine_id%"left:, right:, middle:, shift_left:, shift_right: and drop: are the prefixes; no prefix
means any click. survivalcore:<name> is one of this plugin's three hundred and thirty-seven actions;
close, previous_page and next_page are ExyliaLib's own.
Materials
A Bukkit material, a placeholder (%kit_icon%), basehead-<base64>, playerhead-%name% or
playerhead:%name%. Both head forms are in use in the shipped files.
Actions worth binding elsewhere
The plugin registers 337 actions under the survivalcore: namespace, and they work from any
ExyliaLib menu in any plugin — a hub selector, an NPC, a hotbar item. Each one does nothing while its
module is off. The ones most worth knowing:
| Action | What it opens |
|---|---|
survivalcore:homes_open | The player's homes |
survivalcore:warp_open_list | The warp list |
survivalcore:kit_open_list | The kit list |
survivalcore:reward_open_list | The rewards list |
survivalcore:crate_open_list | The crate list |
survivalcore:rankup_open | The rank ladder |
survivalcore:stats_open | The player's statistics profile |
survivalcore:missions_open | The missions |
survivalcore:seasons_open | The season list |
survivalcore:votes_open | The vote screen |
survivalcore:boosters_open | The player's boosters |
survivalcore:shop_open | The shop |
survivalcore:market_open | The market |
survivalcore:auctions_open | The auction house |
survivalcore:orders_open | The order board |
survivalcore:vaults_open | The player's vault list |
survivalcore:graves_open | The player's graves |
survivalcore:protections_open | The player's protections |
survivalcore:settings_open | The preferences screen |
survivalcore:close_menu | Close |
Every action that changes admin state re-checks its module's admin permission inside the handler. Adding an admin button to a player menu does not give anybody access to it — it just gives them a button that refuses.
survivalcore:spawner_import_from_chest and survivalcore:lc_import_from_chest implement a complete
"click a chest to import its contents as the loot table" flow, and no shipped menu calls either one.
Binding one in your own menu is the only way to reach it.
Something missing on this page? Tell us on Discord