Content generated with AI — it may contain mistakes.

Reference

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.

FolderFilesBehaviour
modules/<id>/menus/, and menus/currency_select.yml69Written when missing, then kept up to date without undoing your edits. Yours.
menus/admin/49The whole folder is deleted and re-extracted from the jar on every start, every /sc reload and every /exylialib reload.
Most files in `menus/admin/` claim to be yours, and none of them is

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.

Deleting a menu no longer brings the default back

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.

MenuOpened by
homes/homes/home, /homes
homes/home_editA home in that list
warps/warp_list/warp
rtp/rtp/rtp with no world
near/near_list/near, when display-mode: UI
tpa/tpa_confirmSending a /tpa with confirm on
kits/list/kit
kits/preview/kit preview, /kitadmin preview
kits/containerA 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_contributionsA 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/statsThe stats_open action (/stats is never registered — see Combat)
stats/stats-leaderboardA stat row in that screen
missions/missions/missions
seasons/seasons/seasons
seasons/season_boardA 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/amountA product in a category
market/market/market
market/my_listings/market mine
market/previewA listing
market/confirmBuying a listing
auctions/auctions/auction
auctions/my_auctions/auction mine
auctions/bidAn auction in the list
orders/orders/orders
orders/my_orders/orders mine
orders/fillAn 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/manageA protection in that list
protections/shop, members, roles, permissions, bans, market, subregions, subregion, rent, warps, warp, perks, mergeButtons in the protection screens
menus/currency_selectAny 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"] }
KeyWhat it does
sizeAlways size, never rows
typeDecorative. 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.globalThe background
filler.custom.<name>A second filler with its own slots
filler.paginationWhat is drawn when the list is empty
pagination.slots'0-35', or a comma-separated set of ranges
sectionsNamed 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
animationcenter_out
menu-versionOnly 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:

ActionWhat it opens
survivalcore:homes_openThe player's homes
survivalcore:warp_open_listThe warp list
survivalcore:kit_open_listThe kit list
survivalcore:reward_open_listThe rewards list
survivalcore:crate_open_listThe crate list
survivalcore:rankup_openThe rank ladder
survivalcore:stats_openThe player's statistics profile
survivalcore:missions_openThe missions
survivalcore:seasons_openThe season list
survivalcore:votes_openThe vote screen
survivalcore:boosters_openThe player's boosters
survivalcore:shop_openThe shop
survivalcore:market_openThe market
survivalcore:auctions_openThe auction house
survivalcore:orders_openThe order board
survivalcore:vaults_openThe player's vault list
survivalcore:graves_openThe player's graves
survivalcore:protections_openThe player's protections
survivalcore:settings_openThe preferences screen
survivalcore:close_menuClose
An admin action still checks its node

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.

Two registered actions have no button anywhere

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