Menus

Every screen is a normal chest-style menu built from menus.yml. No resource pack needed, though you can use one.

Jobs grid

/jobs. Six job heads, your own profile head in the middle, plus buttons for claim all, boosts, and the shop. A job you have prestiged carries its prestige lines under the icon.

Job hub

Click a job. Leaderboard, how to earn, your progress, prestige, and a rewards button.

Tier page

Every level in the job as a coloured pane, and the reward attached to it. Paged when the job has more levels than the page has slots.

Shop

/farmpoints shop. Your balance in the corner, items in their configured slots.

Ranking

/farmpoints ranking. This month’s top heads, last month’s row under it, and a claim button.

Boosts

Opened from the boosts button. Every boost on you right now with its time left, running ones first, then any waiting their turn. The times tick down while you watch.

Colour Meaning
Lime Level reached
Yellow The level the player is on now
Red Still locked

Reward panes on the same page use the same three colours for claimable, claimed, and locked. Both sets of materials and lore are yours in menus.yml.

Button What it shows
Leaderboard Top players in that job by prestige then level, read from a cached copy
How to earn The block or mob list the job pays for, generated from jobs.yml
Progress Level, xp, and pay for the viewing player
Prestige Requirement lines ticked or crossed, or a greyed-out state when the job has prestige off
Rewards Opens the tier page for that job
The leaderboard is cached, not live

A menu read never touches the database, so the cost is the same whether one player or two hundred are looking. leaderboards.refresh-seconds in config.yml is how long the boards go without a rebuild, 120 seconds by default, and a level up or a prestige brings the next one forward to within leaderboards.min-delay-seconds.

Every icon in every menu takes the same fields:

material: PLAYER_HEAD
amount: 1
name: "&aMiner"
lore:
  - "&7Break stone and ores to earn."
custom-model-data: 0
itemsadder: ""
head-texture: ""
  • custom-model-data points at a model in your resource pack.
  • itemsadder takes a namespaced id like myitems:miner_head and wins over material when set.
  • head-texture is a base64 texture value, only read when the material is PLAYER_HEAD.

Any name, lore line, or title written as lang:some.route is looked up in the player’s language file instead of being shown as-is:

name: "lang:menu.shop-name"

Write literal text instead when you want one wording for every language at once. A lore line pointing at a list in the language file expands into all of that list’s lines.

Edit layouts live

With auto-reload: true, saving menus.yml rebuilds any open menu and reopens it on the same page. Move a slot, alt-tab, and it has already moved.

Slot numbers, filler panes, and every button key are on menus.yml.