zMenu - Ultra complete menu plugin v1.1.1.6

Our goal: Dethrone DeluxeMenu

New Features​

  • Added live sync with the website (Minecraft Inventory Builder): link your server with /zmenu login (no argument starts a secure device-authorization flow - approve the shown code on the website), open the live link with /zmenu connect, and close it with /zmenu disconnect. Once connected, clicking "Sync to Server" on the web builder reloads the inventory on your server live, with no restart.
  • Added permissions zmenu.connect and zmenu.disconnect.
  • Custom item on-click mechanic: custom items (defined in items/*.yml) can now run zMenu actions when their holder left/right-clicks. Configure it under mechanics.on-click with cooldown (seconds), cancel-event, click-target (air / block / both), click-types (LEFT, RIGHT, SHIFT_LEFT, SHIFT_RIGHT), click-requirements and actions.
  • Dynamic dialog buttons: two new dialog button types repeat a body or input element over a numeric range — dialog-dynamic-body-button (inside body:) and dialog-dynamic-input-button (inside inputs:), each with placeholder-aware start / end bounds. The %index% placeholder resolves to the current iteration, and each generated input value is available as %<button-name>_<index>% (e.g. %my_input_1%). See dialogs/dynamic-dialog-example.yml.
  • Dynamic Bedrock buttons: bedrock-dynamic-input-button (CUSTOM forms) and bedrock-dynamic-button (SIMPLE forms) repeat an input/button over start / end, exposing %index% and per-index response placeholders (e.g. %dynamic_input_1%, %dynamic_toggle_1%). See bedrock/dynamic-bedrock-example.yml and bedrock/dynamic-simple-bedrock-example.yml.
  • Pluggable dialog action types: dialog action buttons (yes/no, notice, multi-action, server-links) now accept a type: field — custom-click (default, runs zMenu actions:) or static for native client actions via static-type: (OPEN_URL, OPEN_FILE, RUN_COMMAND, SUGGEST_COMMAND, COPY_TO_CLIPBOARD).
  • Dialog action limits: dialog action buttons support usage-limit (maximum activations) and duration-limit — either plain seconds or a { value, type } section with a TimeUnit (SECONDS, MINUTES, ...) — plus enable-placeholders.
  • Placeholders inside item components: item component fields now accept %placeholder% values, resolved per viewer at build time (local placeholders + PlaceholderAPI) through a new Resolvable framework. dyed-color and other color / enum / number / string fields can now be dynamic.
  • New item components: tropical-fish/pattern, wolf/sound-variant, can-break, can-place-on, and a now-functional dye component (Paper 1.26.1+).

Improvements​

  • Unique permissions for every command: refactored all commands to use distinct permission nodes — no two commands share the same permission anymore.
    • Added zmenu.open.main.menu for /zmenu openMainMenu (was sharing zmenu.open).
    • Added zmenu.dialog for /zmenu dialogs, and zmenu.open.dialog.config for /zmenu dialogs config.
    • Split zmenu.players into 9 granular permissions: zmenu.players.add, zmenu.players.clear.all, zmenu.players.clear.player, zmenu.players.convert, zmenu.players.get, zmenu.players.keys, zmenu.players.remove, zmenu.players.remove.all, zmenu.players.subtract.
  • /zmenu login <token> still works as before (legacy token paste); running /zmenu login with no argument now links the server for live sync.
  • Live sync now sends a stable, persistent server_id (stored in live-sync.json, kept across re-links) at pairing time, so the website recognises the same server across re-pairings and never creates duplicate linked-server entries.
  • Synced inventories are now written into a subfolder of inventories/ mirroring the inventory's folder on the website (e.g. inventories/Shop/Weapons/menu.yml). The subfolder path is taken from the sync notification and sanitised (segments only, no ../absolute/backslash) before any file is written.
  • New command /zmenu unlink (perm zmenu.unlink): force-detach this server from the website - it revokes the link on the site, and clears the local live-sync.json credential even if the site call fails (so a down/unreachable website never leaves a stuck link).
  • /zmenu connect now first verifies the link is still valid with the website and refreshes the stored relay url / connection id (so a changed ZMENU_WS_URL is picked up automatically); a revoked link is detected and cleared up front.
  • All integrations are now optional: every integration plugin (Oraxen, ItemsAdder, PlaceholderAPI, LuckPerms, Geyser/Floodgate, MythicMobs, MMOItems, ...) is declared as a soft dependency in paper-plugin.yml — none are required for zMenu to start.
  • Expanded color parsing: color fields (dyed-color, map-color, firework colors/fade_colors, custom-model-data colors, potion-contents custom color, collar colors, ...) now also accept "r,g,b" and "r,g,b,a" strings (with or without spaces, values clamped 0–255) in addition to hex strings and RGB(A) lists.
  • Backward-compatible dialog action buttons: the new nested form (<key>.label, <key>.tooltip, <key>.width, <key>.actions, <key>.type) falls back to the old flat keys (yes-text, notice.text, multi-actions.<key>.text, ...), so existing dialog files keep working.
  • Bedrock text input now accepts both bedrock_text and bedrock_text_input.
  • Page placeholders (%page%, %maxPage%, %max-page%) now resolve everywhere inside an inventory (buttons, names, lore), not only in the title.
  • DeluxeMenu import (zmenuconvert) now honours DeluxeMenu's inventory_type (CHEST, HOPPER, DISPENSER, ...), rejects unsupported types with a clear message, and only enforces the multiple-of-9 size rule on CHEST inventories.
  • Maven Central mirror fallback: zMenu downloads its runtime libraries via Paper's library loader on startup; a mirror fallback (PAPER_DEFAULT_CENTRAL_REPOSITORY env var → org.bukkit.plugin.java.LibraryLoader.centralURL system property → Google mirror) keeps this working on older Paper builds and restricted networks.
  • Players can now safely type % inside dialog/chat answers (it is no longer misinterpreted as a placeholder).

Changes​

  • zMenu is now Paper-only. The Spigot plugin.yml has been removed in favour of paper-plugin.yml (Paper bootstrapper + loader); zMenu no longer runs on Spigot — Paper, a Paper fork (Purpur/Pufferfish) or Folia is required. Work has also started on Paper 26+ support.
  • Item component keys normalized to kebab-case (no alias kept — existing configs must be updated): custom_name → custom-name, death_protection → death-protection, intangible_projectile → intangible-projectile, map_decorations → map-decorations, note_block_sound → note-block-sound, pot_decorations → pot-decorations, provides_banner_patterns → provides-banner-patterns, provides_trim_material → provides-trim-material, tropical_fish/base_color → tropical-fish/base-color, tropical_fish/pattern_color → tropical-fish/pattern-color.
  • API: InventoryManager methods now return/accept ContainerInventory instead of Bukkit Inventory; plugins compiling against zmenu-api must update.

Security​

  • The live link is end-to-end safe: the WebSocket carries only {inventory_id, file_name, hash} - the YAML is pulled over the authenticated HTTPS API and its SHA-256 hash is verified before being applied. The file is written atomically with a .bak backup and rolled back on a parse/reload failure; all network I/O runs off the main thread and the reload happens on the main thread. The scoped server token is stored in live-sync.json and never printed.

Fixes​

  • Fixed /zmenu disconnect using the wrong permission node (zmenu.description → zmenu.disconnect).
  • Live sync now stays connected after /zmenu connect: it auto-reconnects (with backoff) after a relay idle-eviction, relay restart or network blip, until you run /zmenu disconnect or the token is revoked. Previously the link could drop silently and "Sync to Server" on the website would report "server not connected" even though the operator believed the server was still connected.
  • Fixed synced inventories failing to write on Windows (the file is used by another process): the downloaded temp file's stream was still open when the atomic move ran. The stream is now closed before the file is applied.
  • Fixed a same-named inventory in two different folders reloading the wrong file (zMenu indexes inventories by bare name): the synced inventory is now resolved by its actual file path. Concurrent syncs of same-named inventories also no longer share a temp file.
  • Fixed dialog config permission : https://github.com/Maxlego08/zMenu/issues/252
  • Fixed width being ignored inside dialog_plain_message.
  • Fixed translated inventory/item names (translatedName / translated-name) never being applied.
  • Fixed player-selector arguments (@p, @a, ...) in /zmenu open, giveitem, giveopenitem, openmainmenu and the Bedrock/dialog open commands.
  • Fixed commands sometimes not registering, and allowed : inside inventory names/arguments.
  • Fixed a ConcurrentModificationException while flushing player data (#246).
  • Fixed the anvil inventory registration to only load on Minecraft 1.21+.
  • Fixed placeholder-driven commands being split in the wrong order in player-command actions.
  • Fixed button post-processing only applying to the last button of an else chain instead of every button.
  • Fixed the legacy (pre-1.13) material-by-ID mapping never being built.
  • Fixed the MythicMobs hook activating even when MythicMobs was installed but disabled.
  • Fixed font image handling for optional plugins (#250).
  • Fixed a crash on older Paper builds where JDK 25 bytecode could not be read (ASM), and a build StackOverflowError during POM resolution.
  • Fixed version parsing for Paper 26+ build strings (e.g. 26.2.build.12-alpha).
Internal Changes:

  • Reworked the Dialog and Bedrock systems to support custom, editable and dynamic buttons; dialog and Bedrock button/input loaders are now discovered by reflection.
  • New reflection-based auto-loading annotations: @AutoButtonLoader, @AutoCommandArgumentValidator, @AutoFontImage, @AutoItemStackSimilar, and @RequireSupport (gates loading on DIALOG / BEDROCK_INVENTORY support being active).
  • Dialog API split into specialized interfaces (ConfirmationDialogInventory, NoticeDialogInventory, MultiActionDialogInventory, ServerLinksDialogInventory); ~40 type-specific methods on DialogInventory were deprecated. A new ConfigFieldProcessor extension point lets integrators customize the /zmenu dialogs config editor.
  • Bedrock inputs now build Geyser Cumulus components directly; new bedrock/inputs and bedrock/components API packages; dialog body/input types moved into body/ and inputs/ subpackages (import paths changed for API consumers).
  • New Resolvable framework backing placeholder-aware component fields; PotionContentsComponent rewritten on Paper DataComponentTypes; ResolvableRegistry now uses Bukkit RegistryKey; entity variant loaders reorganized into per-entity packages; the Spigot/Paper custom-model-data loaders were merged into a single dynamic loader.
  • New ResolvablePersistentDataEntry / ResolvableContainerSlot API building blocks (typed, placeholder-resolvable persistent-data entries using a value@type syntax).
  • Commands migrated to the paper-dispatch library.
  • openInventory now runs on the entity scheduler (Folia-safe); hardened packet-handler injection.
  • Migrated compile/test to Paper 26 with a MockBukkit-based mock-server test harness; Gradle wrapper updated to 9.6.1.
New Features
  • Bedrock Inventory Support: Added full Bedrock inventory support via Geyser/Floodgate integration. Includes Bedrock-specific actions, buttons, input builders (with placeholders support and legacy color code conversion), drag button, inventory replacement, dialog support, and Bedrock player validation.
  • Inventory Replacement: Implemented inventory replacement functionality, allowing inventories to be dynamically replaced across various classes.
  • ItemStack Build Context: Added ItemStack support to build context and updated durability handling in menu item stack.
  • PaperProfileComponent: Added new PaperProfileComponent for Paper-specific profile handling.
Bug Fixes
  • Clear Inventory + BACK Button: Fixed items being restored to the player when clicking a BACK button between two inventories with clear-inventory: true and clear-inventory-type: PACKET_EVENT. Items are now physically cleared from the player inventory during storage, ensuring container content packets don't reveal hidden items. The close handler also uses physical restoration (giveInventory) instead of packet-based restoration.
  • Item Pickup with Clear Inventory: Fixed items being picked up by the player when clear-inventory is enabled.
  • Lore Metadata Duplication: Fixed "lore" metadata duplication when loading items.
  • Color Handling: Fixed and simplified color handling for leather armor and banner patterns in MenuItemStackLoader.
  • NPE Fix: Fixed null pointer exception.
  • Import Fix: Fixed import for ZBuildContext in ItemEditAction.
  • API Errors: Fixed errors and updated API version.
Improvements
  • Requirement Configuration Validation: Added validation for click-requirement, view-requirement, and open-requirement configurations. Detects common misconfiguration where users place requirement keys directly under the requirement section instead of using named groups (for click-requirement) or a requirements list (for view/open-requirement). Displays a clear warning message with an example of the correct structure and a link to the documentation.
  • Inventory Lookup Optimization: Optimized inventory lookup with a map cache for better performance.
  • CraftEngine Compatibility: Updated compatibility with the latest version of CraftEngine.
  • Color Parsing: Added color parsing support.
Changes
  • Time Placeholders: Changed time_unix_timestamp, time_next_day_unix_timestamp, and time_today_start_unix_timestamp placeholders to return values in seconds instead of milliseconds.
Internal Changes
  • Standardized method parameter annotations to use @NonNull across action and button classes.
  • Standardized this keyword usage in method return statements for clarity.
  • Streamlined item stack creation by consolidating special item stack application.
  • Enhanced click handling in Button class and simplified click requirement configuration.
  • Updated Nexo dependency version.
  • Updated Gradle repositories URL for Floodgate.
  • Removed unused library files (FirstCore.jar, zEssentials.jar, zMenu-1.1.0.0.jar).
  • Removed debug messages.
Bug Fixes
Fixed openWithOldInventories method crash on 1.20 by using CompatibilityUtil.getTopInventory() for safe inventory access.
Fixed trim pattern and material validation: now uses Bukkit Registry instead of the hardcoded TrimHelper, with proper error messages listing all available patterns/materials when a key is not found.
Fixed null ItemFlag entries causing errors when applying flags to item meta.
Fixed EnchantmentGlintOverrideComponent not handling false values correctly - previously only true was applied, now both true and false are respected.
Fixed click requirements defaulting to an empty click list when none are specified - now defaults to all click types.
Fixed AttributeWrapper to support an optional NamespacedKey instead of always generating a random UUID, preventing attribute duplication on item rebuild.
Fixed database connection logger initialization order in ZStorageManager.
Fixed item loading from map (loadItemStack) to use MenuItemStackLoader instead of the removed MenuItemStackFormMap class.
Improvements
Command Permissions: Added dedicated permissions for CommandMenuEditor (ZMENU_EDITOR), CommandMenuVersion (ZMENU_VERSION), and CommandMenuGiveOpenItem (ZMENU_GIVE_OPEN_ITEM).
API: Added getClickRequirementKeys() method to MenuPlugin interface, allowing addons to retrieve the supported click requirement configuration keys.
Default Configs: Updated default configuration files (pro_inventory.yml, playtime_reward.yml) to use kebab-case (view-requirement, click-requirement, open-requirement) matching current conventions.
Dependencies: Added adventure-text-minimessage as a library dependency in plugin.yml.
Internal Changes
Removed unused PlayerSkin class.
Removed unused MenuItemStackFormMap class and associated fromMap static method.
Cleaned up imports and formatting across multiple files.
New Features
MMOItems Support: Added material loader for MMOItems plugin integration.
Enchantments Component: Added enchantments component support for item configuration.
Performance
Performance improvement for items that will use a player's nickname to be displayed (player-head optimization).
Bug Fixes
Fixed enchant key parsing in configuration.
Fixed enchantments component initialization.
Fixed title parsing before sending to player in PlayerTitleAnimation.
Fixed dynamic material check in menu item stack caching logic.
Fixed %player% as a valid player argument in validators.
Fixed error handling and formatting in various loaders and actions.
Fixed basehead itemstack rendering.
Fixed French translations in message strings.
Fixed wrong format issues.
Fixed null checks for player in packet listeners.
Fixed [] display when placeholder returns an empty list.
Fixed null message handling in getLegacyMessage method.
Internal Changes
Refactored placeholder package structure and usage.
Renamed SpigotDyeColorItemComponentLoader to SpigotDyedColorItemComponentLoader.
Changed item model type from String to NamespacedKey in MenuItemStack classes.
Updated @Contract annotations in BaseInventory.java for clarity.
Removed unnecessary whitespace in ComponentMeta.java.
Removed debug messages.
New Features
  • Performance Debug System: Added per-operation performance monitoring for inventory opening. Measures execution time for each step (permission checks, button building, item rendering, etc.) and logs results to console. Configurable via enable-performance-debug, with threshold filtering and whitelist/blacklist support for operation names.
Performance
  • ItemStack Build Optimization: Optimized ZMenuItemStack.build() to reduce redundant work on each inventory open:
    • Eliminated duplicate PlaceholderAPI resolution for material strings (was called twice per build)
    • Pre-resolve Material at load time when no placeholders are present, skipping PAPI parsing at runtime
    • Replaced exception-based control flow for numeric material IDs with a simple numeric check
    • Pre-compute NamespacedKey for tooltipStyle, itemModel, and equippedModel in setters instead of splitting/creating on every build
    • Cache the glowing enchantment lookup instead of querying the enchantment registry on every build
    • Pre-split lore lines containing \n at load time instead of splitting on every build
    • Added early exit in Placeholders.parse() when the string contains no % character, avoiding unnecessary iteration over all placeholder entries
Internal Changes
  • MiniMessage Color Parsing Refactor: Consolidated color parsing methods into MiniMessageColorUtils class for better maintainability and code reuse.
  • Added unit tests to verify preservation of MiniMessage color tags.
Bug Fixes
  • Fixed hex color parsing regex to correctly handle edge cases.
  • Fixed typo in PlayerCommandLoader constructor parameter list.
New Features
  • Dynamic Inventory Title Updates: Added PacketEventChangeTitleName and PacketTitleListener for changing inventory titles dynamically without reopening the inventory. Requires PacketEvents.
  • ClearInvType for Inventory Management: Introduced ClearInvType enum and temporary inventory storage system for better inventory state management.
  • Per-Inventory Click Limiter: The click limiter now only applies to zMenu inventories and can be configured per inventory with click-limiter-enabled: true/false. It no longer interferes with non-zMenu inventories.
  • Enhanced ItemButton Context: ItemButton now includes inventory context for improved button logic and interactions.
Bug Fixes
  • Fixed parsing of map structures inside arrays in YAML configuration. #219
  • Fixed click limiter applying to all inventories instead of only zMenu inventories. #219
  • Fixed inventory restoration on plugin disable. #215
  • Fixed PacketEvents warning on plugin disable. #215
  • Resolved scheduler compatibility issue with Folia.
  • Fixed task registration during plugin shutdown.
  • Enhanced variant component initialization with proper error handling and version checks.
New Features
New Item Component System (1.20.5+) - Complete overhaul with 30+ components (Enchantments, Lore, Trim, Tool, PotionContents, WrittenBook, AttributeModifiers, etc.). Improved error handling and case sensitivity.
Animated Inventory Titles - Requires PacketEvents.
Local Placeholders - local-placeholders section in inventory/pattern configs, cached with Guava for better performance.
Actions Pattern System - Define default actions for all buttons in actions_patterns/ directory.
New Actions: message-to (send to specific player), open-actions and close-actions for inventories.
Console Commands - Commands can now be executed from console (console: true).
LuckPerms - Permission expiration support with time unit configuration.
MiniMessage support in toasts.
Multi-line inventory names (useful with zTextGenerator).
Resin trim material support.
Bug Fixes
Fixed Avast false positive on VirusTotal.
Fixed async access block and container component issues.
Fixed PacketAnimationListener task execution when plugin is disabled.
Fixed button reference in updatedButtons iteration.
Various minor fixes.
Internal Changes
Removed getCustomItemStack(Player player) method. Use getCustomItemStack(Player player, Placeholders placeholders) instead.
Renamed package zcore → common.
Moved Component classes to API module.
Added nullability annotations and new interfaces (BuildContext, MenuItemStackContext).
Improved JavaDoc documentation.
  • Fixed NMS compatibility for 1.21.10.
  • Fixed issues with DeluxeMenus inventory loading.
  • Fixed MiniMessage regex handling.
  • Added the ZMenuItemsLoad event, triggered when zMenu custom items are loaded or reloaded.
  • Improved the logging system.
  • Improved item mechanics.
  • Added deny-chance-actions support for actions.
  • Various minor fixes and general code improvements.
  • Added new placeholders:
    %zmenu_time_unix_timestamp%,
    %zmenu_time_next_day_unix_timestamp%,
    %zmenu_time_today_start_unix_timestamp%
EULA: Free EULA
9,181 Views
399 Downloads
Jun 11, 2023 Published
Jul 15, 2026 Updated
5.00 star(s)
Average rating (2)
2.7 MB File size
Open source
  1. Yes
DRM-free
  1. Yes
Unobfuscated
  1. No
Type
  1. Staff
  1. Library
Game mode
  1. Skyblock
  1. Oneblock
Supported software
  1. Bukkit
  1. Spigot
  1. Paper
  1. Folia
Supported versions
  1. 1.21.11
  1. 1.21.8
  1. 1.21.5
  1. 1.21.4
  1. 1.21.2
  1. 1.21
  1. 1.20
Supported languages
  1. English
Creator
Recommended for you
Most used auction house plugin in the world.
4.00 star(s) 20 ratings
699 purchases
zAuctionHouse addon for multi servers
5.00 star(s) 1 ratings
81 purchases
A King of The Hill plugin that has all the flexibility that you need!
3.50 star(s) 5 ratings
54 purchases
All the power of zMenu to create a shop
4.50 star(s) 7 ratings
52 purchases
zAuctionHouse Configuration similar to the DonutSMP Auction House
4.00 star(s) 3 ratings
183 purchases
9,181 Views
399 Downloads
Jun 11, 2023 Published
Jul 15, 2026 Updated
5.00 star(s)
Average rating (2)
2.7 MB File size
Open source
  1. Yes
DRM-free
  1. Yes
Unobfuscated
  1. No
Type
  1. Staff
  1. Library
Game mode
  1. Skyblock
  1. Oneblock
Supported software
  1. Bukkit
  1. Spigot
  1. Paper
  1. Folia
Supported versions
  1. 1.21.11
  1. 1.21.8
  1. 1.21.5
  1. 1.21.4
  1. 1.21.2
  1. 1.21
  1. 1.20
Supported languages
  1. English
Creator
Recommended for you
Most used auction house plugin in the world.
4.00 star(s) 20 ratings
699 purchases
zAuctionHouse addon for multi servers
5.00 star(s) 1 ratings
81 purchases
A King of The Hill plugin that has all the flexibility that you need!
3.50 star(s) 5 ratings
54 purchases
All the power of zMenu to create a shop
4.50 star(s) 7 ratings
52 purchases
zAuctionHouse Configuration similar to the DonutSMP Auction House
4.00 star(s) 3 ratings
183 purchases
Top