šŸ“‹ Overview

Welcome to JMenus! The most powerful and feature-rich menu system plugin for Minecraft servers. Create stunning, interactive GUI menus with ease and zero coding required!

✨ Key Features

šŸŽØ Advanced Menu System

Create unlimited custom GUI menus with flexible layouts, custom items, and interactive elements. Support for 1-6 row menus with full customization.

šŸ–„ļø In-Game Editor

Edit menus directly in-game with an intuitive GUI interface. No file editing required! Add items, configure actions, and test instantly.

šŸŽ¬ Rich Actions System

11+ different action types including commands, messages, sounds, teleportation, BungeeCord transfers, economy transactions, and more.

🌐 BungeeCord Support

Send players between servers seamlessly with built-in BungeeCord integration. Perfect for network server selectors.

šŸ’° Economy Integration

Full Vault integration for money transactions. Create shops, charge for teleports, or reward players with money.

šŸ“ PlaceholderAPI Support

Dynamic content with full PlaceholderAPI integration plus 15+ built-in placeholders for player and server information.

šŸ”Š Sound Effects

Customizable sounds for menu interactions. Configure open/close sounds and action-specific audio feedback.

šŸŽÆ Permission System

Fine-grained permission control with menu-specific permissions and role-based access control.

šŸ“‹ Template System

Quick menu creation with predefined templates: server selector, warps menu, shop categories, and basic layouts.

šŸ”§ Technical Specifications

RequirementDetails
Minecraft Version1.21+
Server SoftwarePaper, Spigot, Bukkit-based servers
Java VersionJava 21+
DependenciesNone (optional: PlaceholderAPI, Vault)
Plugin Versionv1.1.0
API Version1.21

šŸŽÆ What Makes JMenus Special?

  • Zero Learning Curve: Intuitive in-game editor makes menu creation effortless
  • Performance Optimized: Lightweight and efficient, won't slow down your server
  • Highly Customizable: Every aspect can be configured to match your server's style
  • Developer Friendly: Clean API for integration with other plugins
  • Future Proof: Regular updates and new feature additions
  • Professional Support: Active development with community support

šŸ“„ Download & Support

Official Download Sources

Important: Always download JMenus from official sources to ensure you get the genuine, safe, and latest version.

Support & Contact

šŸ› Bug Reports & Issues

Report bugs or request features on GitHub Issues

GitHub Issues
šŸ’¬ General Support

Get help and chat with the community

Discord: J2D
šŸ“š Documentation

Complete plugin documentation and guides

This Wiki

Version History

VersionRelease DateKey Features
v1.1.0 Latest In-game editor, template system, improved actions
v1.0.0 Initial Core menu system, basic actions, configuration

⚔ Installation

Download JMenus

Download the latest JMenus plugin JAR file from Modrinth or GitHub. Make sure you're getting the version compatible with your Minecraft server version (1.21+).

Tip: Always download from official sources to ensure you get the genuine, safe version.

Place in Plugins Folder

Navigate to your server's plugins directory and place the JMenus JAR file there.

/your-server/plugins/JMenus-1.1.0.jar

Install Optional Dependencies

For enhanced functionality, install these optional plugins:

  • PlaceholderAPI - For dynamic placeholders in menus (highly recommended)
  • Vault - For economy integration and money actions
Note: JMenus works perfectly without these dependencies, but they unlock additional features.

Restart Your Server

Restart your Minecraft server to load the plugin. JMenus will automatically generate its configuration files and create an example menu.

Verify Installation

Run the following command to verify JMenus is loaded correctly:

/jmenus help

You should see the JMenus help menu if installation was successful.

Generated Files

After first startup, JMenus creates these files:

File/FolderPurpose
config.ymlMain plugin configuration
menus/Folder containing individual menu files
menus/example_menu.ymlExample menu for reference
Installation Complete! JMenus will create an example menu file for you to explore. Use /jmenus open example_menu to see it in action!

šŸš€ Quick Start

Creating Your First Menu (5 Minutes)

Follow this tutorial to create your first custom menu in under 5 minutes!

Step 1: Create the Menu

/jmenus create my_first_menu

This creates a new menu file with basic template items including welcome message and close button.

Step 2: Open the In-Game Editor

/jmenuedit my_first_menu

This opens the powerful in-game editor where you can visually customize your menu without touching any files.

Step 3: Customize Your Menu

  • Edit Items: Add, remove, or modify menu items with visual interface
  • Edit Title: Change the menu title with color codes support
  • Edit Size: Adjust the menu size from 1-6 rows (9-54 slots)
  • Settings: Configure sounds, fill items, and commands

Step 4: Test Your Menu

/jmenus open my_first_menu

Open your newly created menu to see it in action!

Example Menu Configuration

Here's what a basic menu configuration looks like:

title: "&8&l✦ &e&lMy First Menu &8&l✦" size: 3 open-sound: "BLOCK_CHEST_OPEN:1:1" close-sound: "BLOCK_CHEST_CLOSE:1:1" # Optional: Fill empty slots fill-item: material: BLACK_STAINED_GLASS_PANE name: " " # Optional: Direct command access command: enabled: true name: "myfirstmenu" items: welcome: material: PAPER slot: 13 name: "&e&lWelcome!" lore: - "&8════════════════" - "&7Welcome to my server!" - "&7Click for a surprise!" - "&8════════════════" actions: left: - "[message] &aHello %player_name%!" - "[sound] ENTITY_PLAYER_LEVELUP:1:1" close: material: BARRIER slot: 22 name: "&c&lClose Menu" lore: - "&8════════════════" - "&7Click to close this menu" - "&8════════════════" actions: left: - "[close]" - "[sound] BLOCK_CHEST_CLOSE:1:1"

Using Templates

Create menus faster with predefined templates:

šŸŽÆ Basic Template
/jmenus create my_menu basic

Simple menu with welcome item and close button

🌐 Server Template
/jmenus create servers server

Server selector with hub, survival, creative

šŸš€ Warps Template
/jmenus create warps warps

Warp menu with spawn, mine, shop, PvP

šŸ›’ Shop Template
/jmenus create shop shop

Shop categories: blocks, tools, miscellaneous

Congratulations! You've created your first JMenus menu. Continue reading to discover all the advanced features available!

šŸ’» Commands

Main Command: /jmenus

The primary command for all JMenus functionality.
Aliases: /jmenu, /menus, /jm

Command Description Permission Example
/jmenus help Shows help information and available commands - /jmenus help
/jmenus open <menu> Opens a specific menu for the player jmenus.open /jmenus open shop
/jmenus list Lists all available menus on the server jmenus.list /jmenus list
/jmenus create <menu> [template] Creates a new menu with optional template jmenus.create /jmenus create shop basic
/jmenus delete <menu> Deletes an existing menu permanently jmenus.delete /jmenus delete old_menu
/jmenus edit <menu> Opens the in-game editor for a menu jmenus.editor /jmenus edit shop
/jmenus reload Reloads the plugin configuration and menus jmenus.reload /jmenus reload

Editor Command: /jmenuedit

Quick access to the in-game menu editor.
Aliases: /jme, /menuedit

/jmenuedit <menu_name>
Pro Tip: Use tab completion with all commands to see available options and menu names automatically!

Template Options

When creating menus, you can use these predefined templates:

šŸŽÆ basic

Simple menu with welcome message and close button

basic
🌐 server

Server selector with hub, survival, and creative options

server
šŸš€ warps

Warp menu with spawn, mine, shop, and PvP warps

warps
šŸ›’ shop

Shop categories menu with blocks, tools, and misc

shop

Direct Menu Commands

If enabled in the configuration, you can access menus directly:

/<menu_name>

For example, if you have a menu called "shop":

/shop
Note: Direct commands can be enabled/disabled per menu in the menu configuration file or globally in config.yml.

šŸ” Permissions

Important: JMenus uses a hierarchical permission system. Higher-level permissions automatically include lower-level ones where logical.

Core Permissions

Permission Description Default Level
jmenus.use Basic plugin access and usage true Player
jmenus.open Open menus using commands true Player
jmenus.list List all available menus op Moderator
jmenus.reload Reload plugin configuration op Admin
jmenus.create Create new menus op Admin
jmenus.delete Delete existing menus op Admin
jmenus.editor Access in-game menu editor op Admin

Menu-Specific Permissions

Control access to individual menus with specific permissions:

# Allow access to specific menus jmenus.open.shop # Can open the 'shop' menu jmenus.open.warps # Can open the 'warps' menu jmenus.open.admin # Can open the 'admin' menu jmenus.open.vip # Can open the 'vip' menu
How it works: If a player doesn't have the specific menu permission, they can still open it if they have the general jmenus.open permission, unless you configure menu-specific restrictions.

Permission Configuration in Menu Files

You can add permission requirements directly to menu files:

title: "&c&lAdmin Panel" size: 3 permission: "admin.use" # Require this permission to open items: ban_player: material: BARRIER slot: 10 name: "&cBan Player" permission: "admin.ban" # Require this permission to see/use item

Permission Groups Example

Here's how you might set up permission groups with a permissions plugin:

šŸ‘¤ Default Players
  • jmenus.use
  • jmenus.open
  • jmenus.open.shop
  • jmenus.open.warps
šŸ›”ļø Moderators
  • All player permissions
  • jmenus.list
  • jmenus.open.mod
šŸ‘‘ Administrators
  • All previous permissions
  • jmenus.create
  • jmenus.delete
  • jmenus.editor
  • jmenus.reload
  • jmenus.*

Action-Based Permissions

Use the permission action to create conditional menu items:

items: vip_item: material: DIAMOND slot: 13 name: "&e&lVIP Features" actions: left: # Only execute if player has VIP permission - "[permission] vip.access:[menu] vip_menu" # Show message if they don't have permission - "[permission] !vip.access:[message] &cYou need VIP to access this!"

āš™ļø Configuration

Configuration File: The main configuration file is located at plugins/JMenus/config.yml and controls global plugin behavior.

Plugin Settings

General Settings

settings: # Debug mode (shows extra information in console) debug: false # Check for updates on startup update-check: true # Enable PlaceholderAPI integration if installed use-placeholders: true # Default language (for future multi-language support) language: "en_US" # Auto-reload menu files when they are modified auto-reload: true # Enable metrics/statistics collection metrics: true

Menu Defaults

Default Menu Properties

menu: # Default menu settings (applied to all menus unless overridden) default-size: 3 default-title: "&8Menu" # Fill empty slots with this item default-fill-item: enabled: false material: "BLACK_STAINED_GLASS_PANE" name: " " # Play sounds when opening/closing menus sounds: enabled: true default-open: "BLOCK_CHEST_OPEN:1:1" default-close: "BLOCK_CHEST_CLOSE:1:1"

BungeeCord Configuration

Network Server Support

bungee: # Enable BungeeCord support enabled: true # Server ping interval (in seconds) ping-interval: 60 # Server info message format server-info-format: "&fPlayers: &a%count%/%max%" # Show server status in menu items show-status: true # Default servers (for auto-complete in commands) servers: - "hub" - "survival" - "creative" - "skyblock" - "factions" - "minigames" - "prison" - "pvp" - "staff" # You can define aliases for server names aliases: main: "hub" build: "creative" lobby: "hub" games: "minigames"

Command Configuration

Command Behavior Settings

commands: # The main command main-command: "jmenus" # Command aliases aliases: - "jm" - "menus" # Direct commands for opening menus (e.g. /example_menu) direct-commands: # Enable direct commands for menus enabled: true # Format of direct commands # true = /menuId (e.g., /example_menu) # false = /jmenu_menuId (e.g., /jmenu_example_menu) use-menu-id-only: true # Default command settings for all menus default-enabled: true # Allow permission-based access control # When true, players need "jmenus.open." permission to use / use-permissions: true # Override specific menu commands overrides: # Example: # survival: "srv" # Use /srv instead of /survival # Permission message no-permission: "&cYou don't have permission to use this command." # Unknown command message unknown-command: "&cUnknown sub-command. Use &e/{command} help &cfor help." # Enable tab completion tab-completion: true

Messages Configuration

Customizable Plugin Messages

messages: prefix: "&8[&eJMenus&8] " reload: "&aJMenus has been reloaded." menu-not-found: "&cMenu &e{menu} &cnot found." menu-opened: "&aOpening menu &e{menu}&a." # Empty string to disable menu-created: "&aMenu &e{menu} &acreated successfully." menu-deleted: "&aMenu &e{menu} &adeleted successfully." no-menus: "&cNo menus found." no-permission: "&cYou don't have permission to use this command."

Permission Defaults

Default Permission Groups

permissions: # Default permissions defaults: player: - "jmenus.use" - "jmenus.open" admin: - "jmenus.reload" - "jmenus.list" - "jmenus.create" - "jmenus.edit" - "jmenus.delete" # Permission descriptions descriptions: "jmenus.use": "Allows using the plugin" "jmenus.open": "Allows opening menus" "jmenus.reload": "Allows reloading the plugin" "jmenus.list": "Allows listing available menus" "jmenus.create": "Allows creating new menus" "jmenus.edit": "Allows editing existing menus" "jmenus.delete": "Allows deleting menus"
Important: After modifying the configuration file, use /jmenus reload to apply changes without restarting the server.

šŸŽ¬ Actions System

Actions are the heart of JMenus! They define what happens when players interact with menu items. You can combine multiple actions for complex behaviors and chain them together.

Available Actions

šŸ’¬ Message

Send a message to the player

[message] Hello %player_name%!
⚔ Command

Execute command as the player

[command] give %player_name% diamond
šŸ–„ļø Console

Execute command as console (with full permissions)

[console] say Welcome %player_name%!
šŸ”Š Sound

Play sound (SOUND:volume:pitch)

[sound] ENTITY_PLAYER_LEVELUP:1:1
āŒ Close

Close the current menu

[close]
šŸ“± Menu

Open another menu

[menu] shop
šŸš€ Teleport

Teleport player to location or another player

[teleport] spawn
šŸ“¢ Broadcast

Send message to all online players

[broadcast] %player_name% joined!
🌐 Bungee

Send player to another BungeeCord server

[bungee] hub
šŸ” Permission

Check permission before executing action

[permission] admin.use:[console] op %player_name%
šŸ’° Money

Economy transactions (requires Vault)

[money] give:1000

Detailed Action Documentation

šŸ’¬ Message Action

# Send colored messages with placeholders [message] &aWelcome %player_name%! [message] &cYou don't have permission! [message] &e&lServer Info: &7%server_online%/%server_max_players%

⚔ Command Action

# Execute commands as the player (player must have permission) [command] heal [command] give %player_name% diamond 1 [command] warp spawn [command] kit starter

šŸ–„ļø Console Action

# Execute commands with full console permissions [console] give %player_name% diamond 64 [console] lp user %player_name% parent add vip [console] broadcast %player_name% bought VIP! [console] effect give %player_name% minecraft:speed 60 1

šŸ”Š Sound Action

# Format: [sound] SOUND_NAME:volume:pitch [sound] ENTITY_PLAYER_LEVELUP:1:1 [sound] BLOCK_NOTE_BLOCK_PLING:0.5:2 [sound] ENTITY_VILLAGER_YES:1:1 [sound] UI_BUTTON_CLICK:1:1

šŸš€ Teleport Action

# Teleport to another player [teleport] PlayerName # Teleport to coordinates (x,y,z,world) [teleport] 100,64,200,world [teleport] 0,100,0,world_nether # Teleport with yaw and pitch (x,y,z,world,yaw,pitch) [teleport] 100,64,200,world,90,0

🌐 Bungee Action

# Send to another server [bungee] hub [bungee] survival [bungee] creative [bungee] minigames

šŸ” Permission Action

# Check if player has permission, then execute action [permission] vip.access:[message] &aWelcome VIP! [permission] admin.use:[console] gamemode creative %player_name% # Check if player DOESN'T have permission (using !) [permission] !vip.access:[message] &cYou need VIP for this! # Multiple actions after permission check [permission] moderator.use:[console] give %player_name% stick 1

šŸ’° Money Action

# Give money to player [money] give:1000 [money] give:50.5 # Take money from player [money] take:500 # Check if player has enough money (returns true/false) [money] has:1000

Click Types

Actions can be triggered by different click types:

Click TypeDescriptionCommon Usage
leftLeft mouse clickPrimary action, most common
rightRight mouse clickSecondary action, alternatives
middleMiddle mouse click (scroll wheel)Special actions
shift_leftShift + left clickAdvanced actions, admin functions
shift_rightShift + right clickAdvanced alternatives

Complex Action Examples

VIP Purchase System

items: vip_package: material: DIAMOND slot: 13 name: "&e&lVIP Package - &6$1000" lore: - "&8════════════════" - "&7Click to purchase VIP status" - "&7Price: &a$1000" - "&8════════════════" actions: left: # Check if already VIP - "[permission] vip.use:[message] &cYou already have VIP!" - "[permission] vip.use:[sound] ENTITY_VILLAGER_NO:1:1" # Check if has enough money - "[permission] !vip.use:[money] has:1000" - "[permission] !vip.use:[money] take:1000" # Give VIP rank - "[permission] !vip.use:[console] lp user %player_name% parent add vip" - "[permission] !vip.use:[message] &a&lVIP purchased! Welcome to VIP!" - "[permission] !vip.use:[sound] ENTITY_PLAYER_LEVELUP:1:2" - "[permission] !vip.use:[broadcast] &e%player_name% &7just became &e&lVIP&7!" right: # Show VIP info menu - "[menu] vip_info"

Server Selector with Player Count

items: survival_server: material: GRASS_BLOCK slot: 11 name: "&a&lSurvival Server" lore: - "&8════════════════" - "&7Players: &a%bungee_survival%" - "&7Status: &aOnline" - "" - "&eLeft-click to join!" - "&8════════════════" actions: left: - "[message] &eConnecting to Survival server..." - "[sound] ENTITY_ENDERMAN_TELEPORT:1:1" - "[bungee] survival"

Multi-Level Menu Navigation

items: shop_categories: material: CHEST slot: 13 name: "&6&lShop Categories" actions: left: - "[menu] shop_categories" right: - "[menu] player_shop" shift_left: - "[permission] admin.shop:[menu] admin_shop" - "[permission] !admin.shop:[message] &cAdmin only!"

Economy Shop Item

items: diamond_sword: material: DIAMOND_SWORD slot: 20 name: "&b&lDiamond Sword" lore: - "&8════════════════" - "&7Price: &a$500" - "&7Left-click: &eBuy 1" - "&7Right-click: &eBuy 5" - "&8════════════════" flags: - "HIDE_ATTRIBUTES" actions: left: # Buy 1 sword - "[money] has:500" - "[money] take:500" - "[console] give %player_name% diamond_sword 1" - "[message] &aPurchased 1 Diamond Sword for $500!" - "[sound] ENTITY_EXPERIENCE_ORB_PICKUP:1:1" right: # Buy 5 swords - "[money] has:2500" - "[money] take:2500" - "[console] give %player_name% diamond_sword 5" - "[message] &aPurchased 5 Diamond Swords for $2500!" - "[sound] ENTITY_EXPERIENCE_ORB_PICKUP:1:1.5"
Pro Tip: Actions are executed in order from top to bottom. Use this to create complex conditional logic with permission checks and money verification!

šŸ–„ļø In-Game Editor

The In-Game Editor is JMenus' most powerful feature, allowing you to create and modify menus entirely in-game without touching any configuration files!

Accessing the Editor

/jmenuedit <menu_name>

or

/jmenus edit <menu_name>
Required Permission: jmenus.editor (default: OP only)

Editor Interface

Main Editor Menu

The main editor interface provides access to all editing functions:

šŸ“¦ Edit Items

Add, remove, or modify menu items visually

  • Left-click: Edit existing item
  • Right-click: Remove item
  • Shift-click: Edit item actions
šŸ·ļø Edit Title

Change the menu title with chat input

  • Supports color codes (&)
  • Supports placeholders
  • Real-time preview
šŸ“ Edit Size

Adjust menu size from 1-6 rows

  • Visual size selector
  • Automatic slot calculation
  • Preserves existing items
āš™ļø Settings

Configure sounds, fill items, and commands

  • Open/close sounds
  • Fill item configuration
  • Direct command setup

Item Editor

Adding New Items

  1. Click "Edit Items" in the main editor
  2. Left-click on any empty slot (gray glass pane)
  3. Enter the material name in chat
  4. The item will be created with default properties
  5. Left-click the item again to edit its properties

Editing Existing Items

  1. Left-click on any existing item
  2. Enter new material name in chat
  3. The item material will be updated
  4. Use Shift-click to edit actions

Removing Items

  1. Right-click on any existing item
  2. Confirm removal
  3. The item will be deleted from the menu

Action Editor

The action editor provides a comprehensive interface for managing item actions:

Managing Actions

CommandDescriptionExample
addAdd a new actionType "add" then enter action
remove <number>Remove specific actionremove 1
edit <number>Edit specific actionedit 2
clearRemove all actionsclear
doneFinish editingdone
cancelCancel without savingcancel

Action Editor Workflow

  1. Shift-click an item in the item editor
  2. Choose left-click or right-click actions
  3. View current actions list
  4. Use commands to modify actions
  5. Type "done" when finished
# Example action editing session: > add Enter the new action to add: > [message] &aHello %player_name%! Action added successfully! Current actions: 1. [message] &aHello %player_name%! Commands: add, remove , edit , clear, done > add Enter the new action to add: > [sound] ENTITY_PLAYER_LEVELUP:1:1 Action added successfully! Current actions: 1. [message] &aHello %player_name%! 2. [sound] ENTITY_PLAYER_LEVELUP:1:1 > done

Title Editor

Change your menu title with full color and placeholder support:

  1. Click "Edit Title" in the main editor
  2. Click the title item
  3. Enter your new title in chat
  4. Use color codes (&) and placeholders
  5. The title will update instantly
# Example title inputs: &8&l✦ &e&lShop Menu &8&l✦ &c&lAdmin Panel &7- &8%player_name% &a&lWelcome &f%player_name%&a! &6&l⭐ &e&lVIP Menu &6&l⭐

Size Editor

Adjust your menu size visually:

  • 1 Row: 9 slots (compact menus)
  • 2 Rows: 18 slots (small menus)
  • 3 Rows: 27 slots (standard size)
  • 4 Rows: 36 slots (large menus)
  • 5 Rows: 45 slots (very large)
  • 6 Rows: 54 slots (maximum size)
Note: When reducing menu size, items in slots that no longer exist will be removed. When increasing size, new empty slots will be available.

Settings Editor

Sound Configuration

  • Open Sound: Played when menu opens
  • Close Sound: Played when menu closes
  • Format: SOUND_NAME:volume:pitch
  • Example: BLOCK_CHEST_OPEN:1:1

Fill Item Configuration

  • Choose material for empty slots
  • Common choices: BLACK_STAINED_GLASS_PANE, GRAY_STAINED_GLASS_PANE
  • Type "none" to disable fill items

Command Configuration

  • Set up direct commands like /shop, /warps
  • Type command name without slash
  • Type "none" to disable direct commands

Saving Changes

The editor automatically saves changes to the menu file when:

  • You use the "Save Changes" button
  • You exit the editor
  • You modify any setting
Real-time Updates: Changes are applied immediately and saved to the menu file automatically. You can test your menu instantly by opening it!

Editor Tips & Tricks

šŸŽØ Color Codes

Use & codes for colors:

  • &c = Red
  • &a = Green
  • &e = Yellow
  • &b = Aqua
  • &l = Bold
šŸ“ Placeholders

Use placeholders for dynamic content:

  • %player_name%
  • %server_online%
  • %player_world%
  • PlaceholderAPI placeholders
šŸ”„ Quick Testing

Test your menu instantly:

  • Exit editor
  • /jmenus open <menu>
  • Make changes
  • Re-open to see updates
šŸ“‹ Copy Items

Copy configurations between menus:

  • Edit menu files manually
  • Copy item sections
  • Reload with /jmenus reload
Remember: The in-game editor is designed to be intuitive and user-friendly. Experiment with different settings and don't be afraid to try new things - you can always undo changes by editing the menu file manually!

šŸ“‹ Templates

Templates provide pre-built menu configurations for common use cases. They're perfect for quickly creating professional-looking menus without starting from scratch.

Available Templates

šŸŽÆ Basic Template

Simple menu with welcome message and close button. Perfect for learning or basic functionality.

/jmenus create my_menu basic

🌐 Server Template

BungeeCord server selector with Hub, Survival, and Creative servers. Ideal for network servers.

/jmenus create servers server

šŸš€ Warps Template

Teleportation menu with Spawn, Mine, Shop, and PvP Arena warps. Great for survival servers.

/jmenus create warps warps

šŸ›’ Shop Template

Shopping categories with Blocks, Tools, and Miscellaneous sections. Perfect for economy servers.

/jmenus create shop shop

Basic Template

The basic template creates a simple 3-row menu with essential items:

title: "&8&l✦ &e&lBasic Menu &8&l✦" size: 3 open-sound: "BLOCK_CHEST_OPEN:1:1" close-sound: "BLOCK_CHEST_CLOSE:1:1" fill-item: material: BLACK_STAINED_GLASS_PANE name: " " command: enabled: true items: welcome: material: PAPER slot: 13 name: "&e&lWelcome!" lore: - "&8════════════════" - "&7Welcome to the Basic menu!" - "&7This is an example item." - "&8════════════════" actions: left: - "[message] &aWelcome to the Basic menu!" close: material: BARRIER slot: 22 name: "&c&lClose Menu" lore: - "&8════════════════" - "&7Click to close this menu." - "&8════════════════" actions: left: - "[close]" - "[sound] BLOCK_CHEST_CLOSE:1:1"

Server Template

The server template creates a BungeeCord server selector:

title: "&8&l✦ &b&lServer Selector &8&l✦" size: 3 items: hub: material: NETHER_STAR slot: 11 name: "&e&lHub Server" lore: - "&8════════════════" - "&7Click to connect to the Hub server." - "&8════════════════" actions: left: - "[bungee] hub" - "[message] &eConnecting to Hub server..." survival: material: GRASS_BLOCK slot: 13 name: "&a&lSurvival Server" lore: - "&8════════════════" - "&7Click to connect to the Survival server." - "&8════════════════" actions: left: - "[bungee] survival" - "[message] &aConnecting to Survival server..." creative: material: GOLDEN_PICKAXE slot: 15 name: "&6&lCreative Server" lore: - "&8════════════════" - "&7Click to connect to the Creative server." - "&8════════════════" flags: - "HIDE_ATTRIBUTES" actions: left: - "[bungee] creative" - "[message] &6Connecting to Creative server..."

Warps Template

The warps template creates a teleportation menu for common server locations:

title: "&8&l✦ &a&lWarps Menu &8&l✦" size: 4 items: spawn: material: BEACON slot: 10 name: "&e&lSpawn" lore: - "&8════════════════" - "&7Teleport to the main spawn." - "&8════════════════" actions: left: - "[teleport] spawn" - "[message] &eTeleporting to spawn..." mine: material: DIAMOND_PICKAXE slot: 12 name: "&b&lMine" lore: - "&8════════════════" - "&7Teleport to the mining area." - "&8════════════════" flags: - "HIDE_ATTRIBUTES" actions: left: - "[teleport] mine" - "[message] &bTeleporting to mine..." shop: material: EMERALD slot: 14 name: "&a&lShop" lore: - "&8════════════════" - "&7Teleport to the shop area." - "&8════════════════" actions: left: - "[teleport] shop" - "[message] &aTeleporting to shop..." pvp: material: DIAMOND_SWORD slot: 16 name: "&c&lPvP Arena" lore: - "&8════════════════" - "&7Teleport to the PvP arena." - "&8════════════════" flags: - "HIDE_ATTRIBUTES" actions: left: - "[teleport] pvp" - "[message] &cTeleporting to PvP arena..."

Shop Template

The shop template creates category-based shopping menu:

title: "&8&l✦ &6&lShop Menu &8&l✦" size: 3 items: blocks: material: GRASS_BLOCK slot: 11 name: "&a&lBlocks" lore: - "&8════════════════" - "&7Browse building blocks for sale." - "&8════════════════" actions: left: - "[message] &aShop category: Blocks (Not implemented)" tools: material: DIAMOND_PICKAXE slot: 13 name: "&b&lTools" lore: - "&8════════════════" - "&7Browse tools and weapons for sale." - "&8════════════════" flags: - "HIDE_ATTRIBUTES" actions: left: - "[message] &bShop category: Tools (Not implemented)" misc: material: CHEST slot: 15 name: "&e&lMiscellaneous" lore: - "&8════════════════" - "&7Browse miscellaneous items for sale." - "&8════════════════" actions: left: - "[message] &eShop category: Miscellaneous (Not implemented)"

Customizing Templates

After creating a menu from a template, you can customize it:

  1. Create from template: /jmenus create my_menu template_name
  2. Open editor: /jmenuedit my_menu
  3. Modify items: Change materials, names, lore, actions
  4. Add items: Click empty slots to add new items
  5. Adjust settings: Change title, size, sounds, etc.
Pro Tip: Templates are just starting points! Feel free to completely customize them to match your server's needs and style.

Template Comparison

TemplateSizeItemsBest For
Basic 3 rows Welcome, Close Learning, Simple functionality
Server 3 rows Hub, Survival, Creative servers BungeeCord networks
Warps 4 rows Spawn, Mine, Shop, PvP warps Survival/Factions servers
Shop 3 rows Blocks, Tools, Misc categories Economy servers

šŸ“ Placeholders

Placeholders make your menus dynamic by displaying real-time information about players, servers, and more. JMenus supports both built-in placeholders and PlaceholderAPI integration.

Built-in Placeholders

JMenus includes 15+ built-in placeholders that work without any additional plugins:

Player Placeholders

%player_name% - Player's username

%player_uuid% - Player's UUID

%player_health% - Current health

%player_max_health% - Maximum health

%player_food% - Food level (0-20)

%player_gamemode% - Current gamemode

Location Placeholders

%player_world% - Current world name

%player_x% - X coordinate

%player_y% - Y coordinate

%player_z% - Z coordinate

Server Placeholders

%server_name% - Server name

%server_online% - Online players count

%server_max_players% - Maximum players

%server_version% - Server version

PlaceholderAPI Integration

When PlaceholderAPI is installed, you can use thousands of additional placeholders:

# Economy placeholders (Vault) %vault_eco_balance% %vault_eco_balance_formatted% # Permission placeholders %luckperms_primary_group_name% %luckperms_prefix% %luckperms_suffix% # Player statistics %statistic_deaths% %statistic_mob_kills% %statistic_player_kills% # World placeholders %player_world% %player_world_size% %player_world_time% # Date and time %server_time_HH:mm:ss% %server_time_dd/MM/yyyy% # Custom plugin placeholders %towny_town_name% %factions_faction_name% %mcmmo_level_mining%
Installation: Simply install PlaceholderAPI and relevant expansion packs. JMenus will automatically detect and support all available placeholders!

Using Placeholders in Menus

Placeholders can be used in multiple places within your menus:

In Menu Titles

title: "&e&lWelcome &f%player_name%&e!" title: "&6&lShop &7- &fBalance: &a$%vault_eco_balance%" title: "&c&lPvP Stats &7- &fKills: &a%statistic_player_kills%"

In Item Names

items: player_info: material: PLAYER_HEAD slot: 13 name: "&e&l%player_name%'s Profile" lore: - "&7World: &f%player_world%" - "&7Health: &c%player_health%&7/&c%player_max_health%" - "&7Gamemode: &a%player_gamemode%"

In Item Lore

items: server_info: material: COMPASS slot: 22 name: "&6&lServer Information" lore: - "&8════════════════" - "&7Server: &f%server_name%" - "&7Players: &a%server_online%&7/&a%server_max_players%" - "&7Your Balance: &6$%vault_eco_balance%" - "&7Time: &f%server_time_HH:mm:ss%" - "&8════════════════"

In Action Messages

actions: left: - "[message] &aWelcome %player_name%!" - "[message] &7Your balance: &6$%vault_eco_balance%" - "[broadcast] &e%player_name% &7opened the shop!"

Dynamic Menu Examples

Player Profile Menu

title: "&e&l%player_name%'s Profile" size: 3 items: player_head: material: PLAYER_HEAD slot: 13 name: "&e&l%player_name%" lore: - "&8════════════════" - "&7UUID: &f%player_uuid%" - "&7World: &a%player_world%" - "&7Location: &f%player_x%, %player_y%, %player_z%" - "&7Health: &c%player_health%&7/&c%player_max_health%" - "&7Food: &6%player_food%&7/&620" - "&7Gamemode: &b%player_gamemode%" - "&8════════════════" balance_info: material: GOLD_INGOT slot: 11 name: "&6&lEconomy" lore: - "&8════════════════" - "&7Balance: &a$%vault_eco_balance_formatted%" - "&7Rank: &e%luckperms_primary_group_name%" - "&8════════════════" statistics: material: BOOK slot: 15 name: "&b&lStatistics" lore: - "&8════════════════" - "&7Deaths: &c%statistic_deaths%" - "&7Mob Kills: &a%statistic_mob_kills%" - "&7Player Kills: &e%statistic_player_kills%" - "&8════════════════"

Server Status Menu

title: "&6&lServer Status" size: 3 items: server_info: material: COMPASS slot: 13 name: "&6&lServer Information" lore: - "&8════════════════" - "&7Name: &f%server_name%" - "&7Version: &f%server_version%" - "&7Players: &a%server_online%&7/&a%server_max_players%" - "&7Time: &f%server_time_HH:mm:ss%" - "&7Date: &f%server_time_dd/MM/yyyy%" - "&8════════════════" world_info: material: GRASS_BLOCK slot: 11 name: "&a&lWorld Information" lore: - "&8════════════════" - "&7Current World: &f%player_world%" - "&7World Time: &f%player_world_time%" - "&8════════════════"

Placeholder Performance

Performance Note: Placeholders are processed when menus open and when items are updated. Heavy use of complex placeholders may impact performance on busy servers.

Best Practices

  • Cache-friendly placeholders: Use static placeholders when possible
  • Limit complex placeholders: Avoid database-heavy placeholders in frequently-opened menus
  • Update frequency: Consider how often menu data needs to refresh
  • Menu size: Larger menus with many placeholders take longer to process

Troubleshooting Placeholders

IssueCauseSolution
Placeholder not replaced PlaceholderAPI not installed Install PlaceholderAPI and required expansions
Shows placeholder text Expansion not downloaded Use /papi ecloud download <expansion>
Built-in placeholder broken Typo in placeholder name Check spelling and case sensitivity
Menu lag with placeholders Too many complex placeholders Reduce placeholder usage or optimize

🌐 BungeeCord Support

BungeeCord Integration allows JMenus to send players between servers in your network seamlessly. Perfect for server selectors and network navigation menus.

Setup Requirements

🌐 BungeeCord Server

A properly configured BungeeCord proxy server

  • Multiple backend servers
  • Proper server configurations
  • Network connectivity
šŸ“¦ Plugin Installation

JMenus installed on backend servers

  • Install on all backend servers
  • Same menu configurations
  • Consistent permissions
āš™ļø Configuration

Enable BungeeCord support in config

  • Set bungee.enabled: true
  • Configure server list
  • Set up aliases

Configuration Setup

Configure BungeeCord support in your config.yml:

bungee: # Enable BungeeCord support enabled: true # Server ping interval (in seconds) ping-interval: 60 # Server info message format server-info-format: "&fPlayers: &a%count%/%max%" # Show server status in menu items show-status: true # Default servers (for auto-complete in commands) servers: - "hub" - "survival" - "creative" - "skyblock" - "factions" - "minigames" - "prison" - "pvp" - "staff" # You can define aliases for server names aliases: main: "hub" build: "creative" lobby: "hub" games: "minigames"

Using the Bungee Action

The [bungee] action sends players to other servers:

Basic Usage

# Send to specific server [bungee] hub [bungee] survival [bungee] creative [bungee] minigames # Using aliases [bungee] main # Goes to "hub" server [bungee] build # Goes to "creative" server [bungee] lobby # Goes to "hub" server

Complete Server Selector Example

title: "&8&l✦ &b&lServer Selector &8&l✦" size: 3 fill-item: material: BLACK_STAINED_GLASS_PANE name: " " items: hub: material: NETHER_STAR slot: 10 name: "&e&lHub Server" lore: - "&8════════════════" - "&7The main lobby server" - "&7Players: &a%bungee_hub_online%" - "&7Status: &a%bungee_hub_status%" - "" - "&eLeft-click to connect!" - "&8════════════════" glow: true actions: left: - "[message] &eConnecting to Hub server..." - "[sound] ENTITY_ENDERMAN_TELEPORT:1:1" - "[bungee] hub" survival: material: GRASS_BLOCK slot: 12 name: "&a&lSurvival Server" lore: - "&8════════════════" - "&7Classic survival gameplay" - "&7Players: &a%bungee_survival_online%" - "&7Status: &a%bungee_survival_status%" - "" - "&eLeft-click to connect!" - "&8════════════════" actions: left: - "[message] &aConnecting to Survival server..." - "[sound] ENTITY_ENDERMAN_TELEPORT:1:1" - "[bungee] survival" creative: material: GOLDEN_PICKAXE slot: 14 name: "&6&lCreative Server" lore: - "&8════════════════" - "&7Unlimited building potential" - "&7Players: &a%bungee_creative_online%" - "&7Status: &a%bungee_creative_status%" - "" - "&eLeft-click to connect!" - "&8════════════════" flags: - "HIDE_ATTRIBUTES" actions: left: - "[message] &6Connecting to Creative server..." - "[sound] ENTITY_ENDERMAN_TELEPORT:1:1" - "[bungee] creative" minigames: material: BOW slot: 16 name: "&c&lMinigames Server" lore: - "&8════════════════" - "&7Fun minigames and competitions" - "&7Players: &a%bungee_minigames_online%" - "&7Status: &a%bungee_minigames_status%" - "" - "&eLeft-click to connect!" - "&8════════════════" flags: - "HIDE_ATTRIBUTES" actions: left: - "[message] &cConnecting to Minigames server..." - "[sound] ENTITY_ENDERMAN_TELEPORT:1:1" - "[bungee] minigames

Advanced Features

Server Status Integration

When enabled, JMenus can show server status in menus:

# Server status placeholders (if supported) %bungee_hub_online% # Players online %bungee_hub_max% # Max players %bungee_hub_status% # Online/Offline status %bungee_survival_online% # Players on survival %bungee_creative_online% # Players on creative

Conditional Server Access

items: staff_server: material: COMMAND_BLOCK slot: 22 name: "&4&lStaff Server" actions: left: # Only staff can access - "[permission] staff.access:[bungee] staff" - "[permission] staff.access:[message] &aConnecting to staff server..." - "[permission] !staff.access:[message] &cStaff only!" - "[permission] !staff.access:[sound] ENTITY_VILLAGER_NO:1:1"

Fallback Handling

items: server_with_fallback: material: DIAMOND slot: 13 name: "&b&lPremium Server" actions: left: - "[message] &eConnecting to premium server..." - "[bungee] premium" # If premium server fails, go to hub - "[message] &cPremium server unavailable, sending to hub..." - "[bungee] hub"

Network Menu Synchronization

Keep menus consistent across your network:

Shared Menu Files

  • Use identical menu files across all servers
  • Sync the menus/ folder between servers
  • Use file synchronization tools or scripts
  • Consider version control (Git) for menu management

Permission Consistency

  • Use the same permission plugin across servers
  • Ensure consistent permission setups
  • Test menu access on all servers
  • Document permission requirements

Troubleshooting BungeeCord

IssuePossible CauseSolution
Players don't transfer BungeeCord not configured Check BungeeCord setup and server registration
Server not found error Wrong server name Verify server names in BungeeCord config
Permission errors Different permission setups Sync permissions across servers
Menu not working on some servers Plugin not installed everywhere Install JMenus on all backend servers
Status not showing Feature not supported yet Use static text or wait for updates
Note: BungeeCord support has not been tested with Velocity proxy yet. It should work with standard BungeeCord setups. Report any issues on GitHub!

šŸ’° Economy Integration

Economy Integration through Vault allows JMenus to handle money transactions, create shops, charge for services, and reward players with currency.

Setup Requirements

Install Vault

Download and install the Vault plugin from official sources. Vault acts as a bridge between JMenus and economy plugins.

Install Economy Plugin

Install a Vault-compatible economy plugin such as:

  • EssentialsX Economy - Most popular choice
  • CMI Economy - Feature-rich alternative
  • TNE (The New Economy) - Advanced economy system
  • iConomy - Classic economy plugin

Restart Server

Restart your server to ensure all plugins load correctly and Vault detects your economy plugin.

Verify Installation

Test the money action in a menu to ensure everything works properly.

Money Action Usage

The [money] action supports three operations:

šŸ’° Give Money

Add money to player's balance

[money] give:1000
šŸ’ø Take Money

Remove money from player's balance

[money] take:500
šŸ” Check Money

Verify player has enough money

[money] has:1000

Money Action Syntax

# Give money to player [money] give:amount # Take money from player (only if they have enough) [money] take:amount # Check if player has enough money (returns true/false) [money] has:amount # Examples: [money] give:1000 # Give $1000 [money] give:50.5 # Give $50.50 (supports decimals) [money] take:500 # Take $500 (if player has it) [money] has:1000 # Check if player has $1000

Shop Menu Examples

Simple Item Shop

title: "&6&l⭐ &e&lItem Shop &6&l⭐" size: 4 fill-item: material: BLACK_STAINED_GLASS_PANE name: " " items: diamond_sword: material: DIAMOND_SWORD slot: 10 name: "&b&lDiamond Sword" lore: - "&8════════════════" - "&7A sharp diamond sword" - "&7Price: &a$500" - "" - "&eLeft-click to purchase" - "&8════════════════" flags: - "HIDE_ATTRIBUTES" actions: left: # Check if player has enough money - "[money] has:500" # Take the money - "[money] take:500" # Give the item - "[console] give %player_name% diamond_sword 1" # Confirmation message - "[message] &aPurchased Diamond Sword for $500!" - "[sound] ENTITY_EXPERIENCE_ORB_PICKUP:1:1" diamond_pickaxe: material: DIAMOND_PICKAXE slot: 12 name: "&b&lDiamond Pickaxe" lore: - "&8════════════════" - "&7A durable diamond pickaxe" - "&7Price: &a$750" - "" - "&eLeft-click to purchase" - "&8════════════════" flags: - "HIDE_ATTRIBUTES" actions: left: - "[money] has:750" - "[money] take:750" - "[console] give %player_name% diamond_pickaxe 1" - "[message] &aPurchased Diamond Pickaxe for $750!" - "[sound] ENTITY_EXPERIENCE_ORB_PICKUP:1:1" golden_apple: material: GOLDEN_APPLE slot: 14 name: "&6&lGolden Apple" lore: - "&8════════════════" - "&7A delicious golden apple" - "&7Price: &a$100" - "" - "&eLeft-click: Buy 1 ($100)" - "&eRight-click: Buy 5 ($450)" - "&8════════════════" actions: left: # Buy 1 apple - "[money] has:100" - "[money] take:100" - "[console] give %player_name% golden_apple 1" - "[message] &aPurchased 1 Golden Apple for $100!" - "[sound] ENTITY_EXPERIENCE_ORB_PICKUP:1:1" right: # Buy 5 apples (bulk discount) - "[money] has:450" - "[money] take:450" - "[console] give %player_name% golden_apple 5" - "[message] &aPurchased 5 Golden Apples for $450!" - "[sound] ENTITY_EXPERIENCE_ORB_PICKUP:1:1.5" balance_info: material: GOLD_INGOT slot: 16 name: "&e&lYour Balance" lore: - "&8════════════════" - "&7Current Balance:" - "&a$%vault_eco_balance_formatted%" - "&8════════════════"

VIP Rank Purchase

items: vip_rank: material: DIAMOND slot: 22 name: "&e&lVIP Rank - &6$1000" lore: - "&8════════════════" - "&7Purchase VIP rank for:" - "&6$1000" - "" - "&7VIP Perks:" - "&8• &aAccess to VIP areas" - "&8• &aDaily rewards" - "&8• &aColored chat" - "&8• &aKit VIP" - "" - "&eLeft-click to purchase" - "&8════════════════" glow: true actions: left: # Check if already VIP - "[permission] vip.use:[message] &cYou already have VIP!" - "[permission] vip.use:[sound] ENTITY_VILLAGER_NO:1:1" # Process purchase for non-VIP players - "[permission] !vip.use:[money] has:1000" - "[permission] !vip.use:[money] take:1000" - "[permission] !vip.use:[console] lp user %player_name% parent add vip" - "[permission] !vip.use:[message] &a&lVIP rank purchased! Welcome to VIP!" - "[permission] !vip.use:[sound] ENTITY_PLAYER_LEVELUP:1:2" - "[permission] !vip.use:[broadcast] &e%player_name% &7just became &e&lVIP&7!" - "[permission] !vip.use:[close]"

Service Menu (Teleports, Heals, etc.)

title: "&5&lServices Menu" size: 3 items: heal_service: material: POTION slot: 11 name: "&c&lHeal - &6$50" lore: - "&8════════════════" - "&7Restore full health and hunger" - "&7Price: &a$50" - "&8════════════════" actions: left: - "[money] has:50" - "[money] take:50" - "[console] heal %player_name%" - "[console] feed %player_name%" - "[message] &aHealed for $50!" - "[sound] ENTITY_PLAYER_LEVELUP:1:1" repair_service: material: ANVIL slot: 13 name: "&7&lRepair All - &6$200" lore: - "&8════════════════" - "&7Repair all items in inventory" - "&7Price: &a$200" - "&8════════════════" actions: left: - "[money] has:200" - "[money] take:200" - "[console] repair all %player_name%" - "[message] &aAll items repaired for $200!" - "[sound] BLOCK_ANVIL_USE:1:1" random_tp: material: ENDER_PEARL slot: 15 name: "&d&lRandom Teleport - &6$25" lore: - "&8════════════════" - "&7Teleport to a random location" - "&7Price: &a$25" - "&8════════════════" actions: left: - "[money] has:25" - "[money] take:25" - "[console] rtp %player_name%" - "[message] &dRandomly teleported for $25!" - "[sound] ENTITY_ENDERMAN_TELEPORT:1:1"

Error Handling

The money action automatically handles common errors:

ScenarioBehaviorPlayer Experience
Insufficient funds (take) Action fails, no money taken Nothing happens, subsequent actions don't execute
Insufficient funds (has) Returns false Can be combined with permission action for fallbacks
Vault not installed Action fails silently Menu works but money actions do nothing
No economy plugin Action fails silently Menu works but money actions do nothing
Invalid amount Action fails Nothing happens

Advanced Economy Features

Insufficient Funds Handling

items: expensive_item: material: NETHERITE_SWORD slot: 13 name: "&4&lNetherite Sword - &6$5000" actions: left: # Try to purchase - "[money] has:5000" - "[money] take:5000" - "[console] give %player_name% netherite_sword 1" - "[message] &aPurchased Netherite Sword!" # Fallback for insufficient funds (won't execute if purchase succeeds) - "[message] &cInsufficient funds! You need $5000." - "[sound] ENTITY_VILLAGER_NO:1:1"

Dynamic Pricing with Placeholders

items: rank_upgrade: material: EMERALD slot: 13 name: "&a&lRank Upgrade" lore: - "&8════════════════" - "&7Current Rank: &e%luckperms_primary_group_name%" - "&7Your Balance: &a$%vault_eco_balance_formatted%" - "&7Upgrade Cost: &6$%rank_upgrade_cost%" - "&8════════════════"

Bulk Purchase Options

items: food_stack: material: COOKED_BEEF slot: 13 name: "&6&lCooked Beef" lore: - "&8════════════════" - "&eLeft-click: &7Buy 1 (&a$5&7)" - "&eRight-click: &7Buy 16 (&a$75&7)" - "&eShift-click: &7Buy 64 (&a$280&7)" - "&8════════════════" actions: left: - "[money] has:5" - "[money] take:5" - "[console] give %player_name% cooked_beef 1" - "[message] &aBought 1 Cooked Beef for $5!" right: - "[money] has:75" - "[money] take:75" - "[console] give %player_name% cooked_beef 16" - "[message] &aBought 16 Cooked Beef for $75!" shift_left: - "[money] has:280" - "[money] take:280" - "[console] give %player_name% cooked_beef 64" - "[message] &aBought 64 Cooked Beef for $280!"
Pro Tip: Combine money actions with permission actions to create sophisticated shop systems with rank-based discounts and exclusive items!

šŸ”§ API Documentation

JMenus API allows other plugins to interact with JMenus programmatically. Create menus, register actions, and integrate with the menu system.

Getting Started

Adding JMenus as Dependency

// Maven (pom.xml) me JMenus 1.1.0 provided // Gradle (build.gradle) dependencies { compileOnly 'me:JMenus:1.1.0' }

Plugin Dependencies

# plugin.yml depend: [JMenus] # or softdepend: [JMenus]

Basic API Usage

Getting JMenus Instance

import me.jMenus.JMenus; public class MyPlugin extends JavaPlugin { private JMenus jMenus; @Override public void onEnable() { // Get JMenus instance jMenus = JMenus.getInstance(); if (jMenus == null) { getLogger().warning("JMenus not found!"); return; } // Use JMenus API registerCustomActions(); } }

Opening Menus Programmatically

import me.jMenus.gui.MenuManager; import org.bukkit.entity.Player; public void openMenuForPlayer(Player player, String menuId) { MenuManager menuManager = jMenus.getMenuManager(); // Check if menu exists if (menuManager.hasMenu(menuId)) { // Open the menu boolean success = menuManager.openMenu(player, menuId); if (success) { player.sendMessage("Menu opened successfully!"); } else { player.sendMessage("Failed to open menu."); } } else { player.sendMessage("Menu not found: " + menuId); } }

Getting Available Menus

import me.jMenus.gui.Menu; import java.util.Map; public void listAllMenus() { MenuManager menuManager = jMenus.getMenuManager(); Map menus = menuManager.getMenus(); getLogger().info("Available menus:"); for (String menuId : menus.keySet()) { Menu menu = menus.get(menuId); getLogger().info("- " + menuId + " (" + menu.getTitle() + ")"); } }

Creating Custom Actions

Implementing the Action Interface

import me.jMenus.actions.Action; import org.bukkit.entity.Player; public class CustomAction implements Action { @Override public String getType() { return "custom"; // Action name: [custom] } @Override public boolean execute(Player player, String args) { // Your custom logic here if (args == null || args.isEmpty()) { return false; } // Example: [custom] hello:world String[] parts = args.split(":"); String command = parts[0]; String argument = parts.length > 1 ? parts[1] : ""; switch (command.toLowerCase()) { case "hello": player.sendMessage("Hello " + argument + "!"); return true; case "teleport": // Custom teleport logic return handleTeleport(player, argument); default: return false; } } private boolean handleTeleport(Player player, String location) { // Your teleport logic player.sendMessage("Teleporting to " + location); return true; } }

Registering Custom Actions

import me.jMenus.actions.ActionManager; public void registerCustomActions() { ActionManager actionManager = jMenus.getActionManager(); // Register your custom action actionManager.registerAction(new CustomAction()); getLogger().info("Custom actions registered!"); } // Unregister when plugin disables @Override public void onDisable() { if (jMenus != null) { ActionManager actionManager = jMenus.getActionManager(); actionManager.unregisterAction("custom"); } }

Advanced Action Example

public class EconomyAction implements Action { private final MyPlugin plugin; public EconomyAction(MyPlugin plugin) { this.plugin = plugin; } @Override public String getType() { return "myeconomy"; } @Override public boolean execute(Player player, String args) { // Format: [myeconomy] operation:amount:currency // Example: [myeconomy] give:1000:coins String[] parts = args.split(":"); if (parts.length < 2) { return false; } String operation = parts[0]; double amount; try { amount = Double.parseDouble(parts[1]); } catch (NumberFormatException e) { return false; } String currency = parts.length > 2 ? parts[2] : "default"; switch (operation.toLowerCase()) { case "give": return givePlayerMoney(player, amount, currency); case "take": return takePlayerMoney(player, amount, currency); case "has": return playerHasMoney(player, amount, currency); default: return false; } } private boolean givePlayerMoney(Player player, double amount, String currency) { // Your economy integration plugin.getEconomy().addMoney(player, amount, currency); player.sendMessage("Received " + amount + " " + currency + "!"); return true; } private boolean takePlayerMoney(Player player, double amount, String currency) { if (plugin.getEconomy().hasMoney(player, amount, currency)) { plugin.getEconomy().takeMoney(player, amount, currency); return true; } return false; } private boolean playerHasMoney(Player player, double amount, String currency) { return plugin.getEconomy().hasMoney(player, amount, currency); } }

Creating Menus Programmatically

Using the Menu Builder

import me.jMenus.utils.MenuImpl; import me.jMenus.utils.ItemBuilder; import me.jMenus.gui.Menu; import org.bukkit.Material; import org.bukkit.inventory.ItemStack; public Menu createCustomMenu() { // Create menu builder MenuImpl.Builder builder = new MenuImpl.Builder(jMenus, "api_menu") .title("&e&lAPI Created Menu") .size(3) .openSound("BLOCK_CHEST_OPEN:1:1") .closeSound("BLOCK_CHEST_CLOSE:1:1"); // Create fill item ItemStack fillItem = new ItemBuilder(Material.BLACK_STAINED_GLASS_PANE) .name(" ") .build(); builder.fillItem(fillItem); // Create menu items ItemStack welcomeItem = new ItemBuilder(Material.PAPER) .name("&a&lWelcome!") .lore("&7Created via API", "&7Click me!") .build(); Map welcomeActions = new HashMap<>(); welcomeActions.put("left", new String[]{ "[message] &aWelcome to the API menu!", "[sound] ENTITY_PLAYER_LEVELUP:1:1" }); builder.item(13, welcomeItem, welcomeActions); // Add close button ItemStack closeItem = new ItemBuilder(Material.BARRIER) .name("&c&lClose") .build(); Map closeActions = new HashMap<>(); closeActions.put("left", new String[]{"[close]"}); builder.item(22, closeItem, closeActions); return builder.build(); } public void registerApiMenu() { Menu menu = createCustomMenu(); jMenus.getMenuManager().registerMenu(menu); getLogger().info("API menu registered!"); }

Event Handling

Listening to Menu Events

import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.inventory.InventoryCloseEvent; import me.jMenus.gui.MenuHolder; public class MenuEventListener implements Listener { @EventHandler public void onMenuClick(InventoryClickEvent event) { // Check if it's a JMenus menu if (event.getInventory().getHolder() instanceof MenuHolder) { MenuHolder holder = (MenuHolder) event.getInventory().getHolder(); Menu menu = holder.getMenu(); // Log menu interaction getLogger().info("Player " + event.getWhoClicked().getName() + " clicked in menu: " + menu.getId()); // Custom logic based on menu if (menu.getId().equals("special_menu")) { // Special handling for specific menu handleSpecialMenuClick(event, menu); } } } @EventHandler public void onMenuClose(InventoryCloseEvent event) { if (event.getInventory().getHolder() instanceof MenuHolder) { MenuHolder holder = (MenuHolder) event.getInventory().getHolder(); Menu menu = holder.getMenu(); // Custom logic when menu closes getLogger().info("Player " + event.getPlayer().getName() + " closed menu: " + menu.getId()); } } private void handleSpecialMenuClick(InventoryClickEvent event, Menu menu) { // Your special menu logic Player player = (Player) event.getWhoClicked(); int slot = event.getSlot(); // Example: Track clicks for analytics trackMenuClick(player, menu.getId(), slot); } }

Utility Methods

Checking Plugin State

public boolean isJMenusEnabled() { return jMenus != null && jMenus.isEnabled(); } public boolean hasMenu(String menuId) { return isJMenusEnabled() && jMenus.getMenuManager().hasMenu(menuId); } public boolean isPlayerInMenu(Player player) { if (!isJMenusEnabled()) return false; return jMenus.getMenuManager().getOpenMenu(player).isPresent(); } public Optional getPlayerMenu(Player player) { if (!isJMenusEnabled()) return Optional.empty(); return jMenus.getMenuManager().getOpenMenu(player); }

Menu Utilities

import me.jMenus.utils.ColorUtils; import me.jMenus.utils.PlaceholderUtils; public class MenuUtils { public static String colorize(String text) { return ColorUtils.colorize(text); } public static String setPlaceholders(Player player, String text) { return PlaceholderUtils.setPlaceholders(player, text); } public static ItemStack processItem(Player player, ItemStack item) { return PlaceholderUtils.processItem(player, item); } public static void openMenuSafely(Player player, String menuId) { if (JMenus.getInstance() != null) { JMenus.getInstance().getMenuManager().openMenu(player, menuId); } } }
Note: The API is designed for developers. Always check if JMenus is loaded before using API methods, and handle cases where JMenus might be disabled or not available.

šŸ”§ Troubleshooting

Common Issues

IssueSymptomsSolution
Plugin won't load Error in console, JMenus commands not working Check Java version (21+), server compatibility, download from official sources
Menus don't open Commands work but no GUI opens Check permissions, verify menu files exist, check for errors in menu configuration
Items don't show Menu opens but appears empty Verify item configuration syntax, check material names, ensure slots are valid
Actions don't work Items show but clicking does nothing Check action syntax, verify permissions for actions, test with simple actions
Placeholders not working Placeholder text shows instead of values Install PlaceholderAPI, download required expansions, check placeholder syntax
Money actions failing Economy actions do nothing Install Vault and economy plugin, verify integration, check player balance
BungeeCord not working Players don't transfer between servers Configure BungeeCord properly, verify server names, check network connectivity
Editor won't open Editor command fails or shows errors Check jmenus.editor permission, verify menu exists, ensure not in creative mode

Debug Mode

Enable debug mode for detailed troubleshooting information:

# In config.yml settings: debug: true

Then reload the plugin:

/jmenus reload
Debug Information: Debug mode provides detailed console output about menu loading, action execution, and error details.

Configuration Validation

Common YAML Errors

ErrorCauseFix
Indentation errors Inconsistent spacing/tabs Use only spaces (2 or 4), never tabs
Invalid characters Special characters in strings Quote strings with special characters
Missing colons YAML syntax error Ensure all keys end with colon (:)
List formatting Incorrect list syntax Use proper dash (-) format for lists

Validating Menu Files

# Use online YAML validators # Check for syntax errors before saving # Test with simple configurations first # Example valid structure: title: "&eTest Menu" size: 3 items: test_item: material: STONE slot: 13 name: "&aTest Item" actions: left: - "[message] Test!"

Permission Issues

Testing Permissions

# Check if player has permission /lp user <player> permission check jmenus.open # Give permission temporarily /lp user <player> permission set jmenus.open true # Check effective permissions /lp user <player> permission info

Permission Hierarchy

# Grant all JMenus permissions jmenus.* # Basic usage permissions jmenus.use jmenus.open # Admin permissions jmenus.reload jmenus.create jmenus.delete jmenus.editor

Performance Issues

Optimization Tips

  • Limit placeholders: Use only necessary placeholders to reduce processing time
  • Optimize menu size: Smaller menus load faster
  • Reduce complex actions: Minimize chained actions for better performance
  • Cache static content: Use static text where possible instead of dynamic placeholders
  • Monitor server resources: Check CPU and memory usage

Performance Monitoring

# Check server TPS /tps # Monitor plugin performance /timings on /timings paste # Check memory usage /gc

Log File Analysis

Important Log Patterns

# Plugin loading [INFO] Loading JMenus v1.1.0 # Menu loading success [INFO] Loaded menu: shop from file: shop.yml # Menu loading errors [ERROR] Error loading menu file: shop.yml [WARN] Invalid material: INVALID_ITEM # Action execution [DEBUG] Executing action: [message] Hello! [WARN] Unknown action type: invalid_action # Permission errors [WARN] Player lacks permission: jmenus.open
Log Location: Server logs are typically in logs/latest.log. Use debug mode for more detailed information.

Getting Help

šŸ› Report Bugs

GitHub Issues for bug reports

  • Include error logs
  • Describe reproduction steps
  • Mention server version
  • List other installed plugins
šŸ’¬ Community Support

Discord for general help

  • Discord: J2D
  • Ask for configuration help
  • Share menu examples
  • Get quick answers
šŸ“š Documentation

This wiki for complete information

  • Read relevant sections
  • Check examples
  • Follow tutorials
  • Review configuration
šŸ” Self-Diagnosis

Tools for troubleshooting

  • Enable debug mode
  • Check server console
  • Validate YAML syntax
  • Test with minimal config

šŸ“š Examples

Real-World Examples showcasing different types of menus you can create with JMenus. Copy and customize these examples for your server!

Complete Menu Examples

Admin Control Panel

title: "&c&l⚔ &4&lAdmin Panel &c&l⚔" size: 4 permission: "admin.use" fill-item: material: RED_STAINED_GLASS_PANE name: " " items: player_management: material: PLAYER_HEAD slot: 10 name: "&e&lPlayer Management" lore: - "&8════════════════" - "&7Manage online players" - "&7• Kick players" - "&7• Ban/unban players" - "&7• Teleport to players" - "&8════════════════" actions: left: - "[menu] player_management" server_control: material: COMMAND_BLOCK slot: 12 name: "&6&lServer Control" lore: - "&8════════════════" - "&7Control server functions" - "&7• Restart server" - "&7• Change weather" - "&7• Set time" - "&8════════════════" actions: left: - "[menu] server_control" world_management: material: GRASS_BLOCK slot: 14 name: "&a&lWorld Management" lore: - "&8════════════════" - "&7Manage worlds" - "&7• Create worlds" - "&7• Load/unload worlds" - "&7• World settings" - "&8════════════════" actions: left: - "[menu] world_management" economy_control: material: GOLD_INGOT slot: 16 name: "&6&lEconomy Control" lore: - "&8════════════════" - "&7Manage server economy" - "&7• Add/remove money" - "&7• View balances" - "&7• Reset economy" - "&8════════════════" actions: left: - "[menu] economy_control" quick_actions: material: EMERALD slot: 22 name: "&a&lQuick Actions" lore: - "&8════════════════" - "&eLeft: &7Heal all players" - "&eRight: &7Feed all players" - "&eShift+Left: &7Clear weather" - "&eShift+Right: &7Day time" - "&8════════════════" actions: left: - "[console] heal *" - "[broadcast] &aAll players have been healed!" right: - "[console] feed *" - "[broadcast] &aAll players have been fed!" shift_left: - "[console] weather clear" - "[broadcast] &aWeather cleared!" shift_right: - "[console] time set day" - "[broadcast] &aTime set to day!" plugin_manager: material: REDSTONE slot: 31 name: "&c&lPlugin Manager" lore: - "&8════════════════" - "&7Manage server plugins" - "&7• Reload configs" - "&7• Enable/disable plugins" - "&7• View plugin info" - "&8════════════════" actions: left: - "[menu] plugin_manager"

VIP Perks Menu

title: "&6&l⭐ &e&lVIP Perks &6&l⭐" size: 4 permission: "vip.use" fill-item: material: YELLOW_STAINED_GLASS_PANE name: " " items: vip_kit: material: DIAMOND_CHESTPLATE slot: 11 name: "&b&lVIP Kit" lore: - "&8════════════════" - "&7Claim your daily VIP kit" - "&7Contains valuable items!" - "" - "&7Cooldown: &e24 hours" - "&8════════════════" flags: - "HIDE_ATTRIBUTES" actions: left: - "[console] kit vip %player_name%" - "[message] &aVIP kit claimed!" - "[sound] ENTITY_PLAYER_LEVELUP:1:1" fly_toggle: material: FEATHER slot: 13 name: "&f&lFly Toggle" lore: - "&8════════════════" - "&7Toggle flight mode" - "&7VIP exclusive feature!" - "&8════════════════" actions: left: - "[console] fly %player_name%" - "[message] &aFlight toggled!" - "[sound] ENTITY_BAT_TAKEOFF:1:1" vip_warp: material: ENDER_PEARL slot: 15 name: "&d&lVIP Warp" lore: - "&8════════════════" - "&7Teleport to VIP area" - "&7Exclusive VIP zone!" - "&8════════════════" actions: left: - "[teleport] vip" - "[message] &dWelcome to the VIP area!" - "[sound] ENTITY_ENDERMAN_TELEPORT:1:1" economy_bonus: material: GOLD_INGOT slot: 20 name: "&6&lDaily Bonus" lore: - "&8════════════════" - "&7Claim daily money bonus" - "&7Amount: &a$1000" - "" - "&7Cooldown: &e24 hours" - "&8════════════════" actions: left: - "[money] give:1000" - "[message] &aReceived $1000 daily bonus!" - "[sound] ENTITY_EXPERIENCE_ORB_PICKUP:1:2" exclusive_shop: material: EMERALD slot: 22 name: "&a&lVIP Shop" lore: - "&8════════════════" - "&7Access exclusive VIP items" - "&7Special discounts!" - "&8════════════════" actions: left: - "[menu] vip_shop" cosmetics: material: LEATHER_CHESTPLATE slot: 24 name: "&5&lCosmetics" lore: - "&8════════════════" - "&7VIP cosmetic items" - "&7• Particle effects" - "&7• Chat colors" - "&7• Name tags" - "&8════════════════" actions: left: - "[menu] vip_cosmetics"

Comprehensive Shop System

title: "&6&lšŸ›’ &e&lMega Shop &6&lšŸ›’" size: 6 fill-item: material: GRAY_STAINED_GLASS_PANE name: " " items: # Navigation balance_display: material: GOLD_INGOT slot: 4 name: "&e&lYour Balance" lore: - "&8════════════════" - "&7Current Balance:" - "&a$%vault_eco_balance_formatted%" - "&8════════════════" # Categories blocks_category: material: GRASS_BLOCK slot: 19 name: "&a&lBuilding Blocks" lore: - "&8════════════════" - "&7Essential building materials" - "&7• Stone variants" - "&7• Wood types" - "&7• Decorative blocks" - "&8════════════════" actions: left: - "[menu] shop_blocks" tools_category: material: DIAMOND_PICKAXE slot: 21 name: "&b&lTools & Weapons" lore: - "&8════════════════" - "&7High-quality equipment" - "&7• Enchanted tools" - "&7• Weapons" - "&7• Armor sets" - "&8════════════════" flags: - "HIDE_ATTRIBUTES" actions: left: - "[menu] shop_tools" food_category: material: GOLDEN_APPLE slot: 23 name: "&6&lFood & Potions" lore: - "&8════════════════" - "&7Sustenance and buffs" - "&7• Healing items" - "&7• Food supplies" - "&7• Buff potions" - "&8════════════════" actions: left: - "[menu] shop_food" redstone_category: material: REDSTONE slot: 25 name: "&c&lRedstone & Tech" lore: - "&8════════════════" - "&7Technical components" - "&7• Redstone items" - "&7• Rails & minecarts" - "&7• Mechanisms" - "&8════════════════" actions: left: - "[menu] shop_redstone" # Quick buy items quick_heal: material: GOLDEN_APPLE slot: 37 name: "&c&lQuick Heal - &6$50" lore: - "&8════════════════" - "&7Instantly restore health" - "&7and hunger" - "&8════════════════" actions: left: - "[money] has:50" - "[money] take:50" - "[console] heal %player_name%" - "[console] feed %player_name%" - "[message] &aHealed for $50!" - "[sound] ENTITY_PLAYER_LEVELUP:1:1" quick_repair: material: ANVIL slot: 39 name: "&7&lQuick Repair - &6$100" lore: - "&8════════════════" - "&7Repair all items" - "&7in your inventory" - "&8════════════════" actions: left: - "[money] has:100" - "[money] take:100" - "[console] repair all %player_name%" - "[message] &aAll items repaired for $100!" - "[sound] BLOCK_ANVIL_USE:1:1" # Special offers daily_deal: material: DIAMOND slot: 41 name: "&e&l⭐ Daily Deal ⭐" lore: - "&8════════════════" - "&7Today's special offer!" - "&7Diamond - &c50% OFF" - "&7Price: &a$250 &7(was $500)" - "&8════════════════" glow: true actions: left: - "[money] has:250" - "[money] take:250" - "[console] give %player_name% diamond 1" - "[message] &aDaily deal purchased!" - "[sound] ENTITY_EXPERIENCE_ORB_PICKUP:1:2" vip_section: material: EMERALD_BLOCK slot: 43 name: "&a&lVIP Section" lore: - "&8════════════════" - "&7Exclusive VIP items" - "&7Special discounts!" - "&8════════════════" actions: left: - "[permission] vip.use:[menu] vip_shop" - "[permission] !vip.use:[message] &cVIP only section!" - "[permission] !vip.use:[sound] ENTITY_VILLAGER_NO:1:1" # Navigation previous_page: material: ARROW slot: 45 name: "&7← Previous" actions: left: - "[message] &cNo previous page!" main_menu: material: COMPASS slot: 49 name: "&e&lMain Menu" lore: - "&8════════════════" - "&7Return to main menu" - "&8════════════════" actions: left: - "[menu] main_menu" next_page: material: ARROW slot: 53 name: "&7Next →" actions: left: - "[menu] shop_page2"

Specialized Menu Examples

Punishment Menu (Staff)

title: "&c&lPunishment Menu" size: 3 permission: "staff.punish" items: kick_player: material: IRON_BOOT slot: 10 name: "&6&lKick Player" lore: - "&8════════════════" - "&7Kick a player from server" - "&8════════════════" actions: left: - "[message] &eType player name to kick:" - "[close]" # Would need custom input handling temp_ban: material: CLOCK slot: 12 name: "&c&lTemporary Ban" lore: - "&8════════════════" - "&7Temporarily ban player" - "&8════════════════" actions: left: - "[menu] temp_ban_duration" permanent_ban: material: BARRIER slot: 14 name: "&4&lPermanent Ban" lore: - "&8════════════════" - "&7Permanently ban player" - "&c&lUse with caution!" - "&8════════════════" actions: left: - "[menu] confirm_perm_ban" mute_player: material: BOOK slot: 16 name: "&e&lMute Player" lore: - "&8════════════════" - "&7Prevent player from chatting" - "&8════════════════" actions: left: - "[menu] mute_duration"

Minigame Selector

title: "&5&lšŸŽ® &d&lMinigames &5&lšŸŽ®" size: 4 items: parkour: material: LEATHER_BOOTS slot: 10 name: "&a&lParkour" lore: - "&8════════════════" - "&7Jump and climb challenges" - "&7Players: &e%parkour_players%" - "&7Record: &6%parkour_record%" - "&8════════════════" actions: left: - "[teleport] parkour" - "[message] &aWelcome to Parkour!" pvp_arena: material: DIAMOND_SWORD slot: 12 name: "&c&lPvP Arena" lore: - "&8════════════════" - "&7Battle other players" - "&7Players: &e%pvp_players%" - "&7Your K/D: &6%player_kd%" - "&8════════════════" flags: - "HIDE_ATTRIBUTES" actions: left: - "[teleport] pvp" - "[message] &cEntering PvP Arena!" spleef: material: DIAMOND_SHOVEL slot: 14 name: "&6&lSpleef" lore: - "&8════════════════" - "&7Dig blocks beneath opponents" - "&7Queue: &e%spleef_queue%" - "&7Wins: &6%spleef_wins%" - "&8════════════════" flags: - "HIDE_ATTRIBUTES" actions: left: - "[console] spleef join %player_name%" - "[message] &6Joined Spleef queue!" racing: material: MINECART slot: 16 name: "&b&lRacing" lore: - "&8════════════════" - "&7Race through tracks" - "&7Best time: &e%racing_time%" - "&7Next race: &6%racing_next%" - "&8════════════════" actions: left: - "[console] race join %player_name%" - "[message] &bJoined racing!"

Advanced Integration Examples

Multi-Server Network Hub

title: "&b&l🌐 &3&lNetwork Hub &b&l🌐" size: 5 items: # Server status display survival_server: material: GRASS_BLOCK slot: 19 name: "&a&lSurvival Server" lore: - "&8════════════════" - "&7Status: &a%bungee_survival_status%" - "&7Players: &e%bungee_survival_online%&7/&e%bungee_survival_max%" - "&7Uptime: &f%survival_uptime%" - "" - "&eLeft-click to join!" - "&eRight-click for info" - "&8════════════════" actions: left: - "[bungee] survival" - "[message] &aConnecting to Survival..." right: - "[menu] survival_info" creative_server: material: GOLDEN_PICKAXE slot: 21 name: "&6&lCreative Server" lore: - "&8════════════════" - "&7Status: &a%bungee_creative_status%" - "&7Players: &e%bungee_creative_online%&7/&e%bungee_creative_max%" - "&7Plots: &f%creative_plots_used%&7/&f%creative_plots_total%" - "" - "&eLeft-click to join!" - "&8════════════════" flags: - "HIDE_ATTRIBUTES" actions: left: - "[bungee] creative" - "[message] &6Connecting to Creative..." minigames_server: material: BOW slot: 23 name: "&c&lMinigames Server" lore: - "&8════════════════" - "&7Status: &a%bungee_minigames_status%" - "&7Players: &e%bungee_minigames_online%&7/&e%bungee_minigames_max%" - "&7Active games: &f%minigames_active%" - "" - "&eLeft-click to join!" - "&8════════════════" flags: - "HIDE_ATTRIBUTES" actions: left: - "[bungee] minigames" - "[message] &cConnecting to Minigames..." skyblock_server: material: GRASS_BLOCK slot: 25 name: "&9&lSkyBlock Server" lore: - "&8════════════════" - "&7Status: &a%bungee_skyblock_status%" - "&7Players: &e%bungee_skyblock_online%&7/&e%bungee_skyblock_max%" - "&7Islands: &f%skyblock_islands%" - "" - "&eLeft-click to join!" - "&8════════════════" actions: left: - "[bungee] skyblock" - "[message] &9Connecting to SkyBlock..." # Network features friend_system: material: PLAYER_HEAD slot: 40 name: "&e&lFriends" lore: - "&8════════════════" - "&7Online friends: &a%friends_online%" - "&7Total friends: &f%friends_total%" - "&8════════════════" actions: left: - "[menu] friends_menu" network_stats: material: BOOK slot: 42 name: "&6&lNetwork Stats" lore: - "&8════════════════" - "&7Total players: &e%network_total_online%" - "&7Your playtime: &f%player_total_playtime%" - "&7Rank: &e%player_network_rank%" - "&8════════════════" actions: left: - "[menu] detailed_stats"
Customization Tips: These examples are templates! Modify them to match your server's theme, add your own items, change the styling, and integrate with your specific plugins and systems.